找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 29361|回复: 56
打印 上一主题 下一主题
收起左侧

基于STM32车牌识别程序 带管理计费

  [复制链接]
跳转到指定楼层
楼主
基于STM32车牌识别程序


完整源码下载:
程序.zip (7.41 MB, 下载次数: 726)


主程序预览:
  1. #include "stm32f10x.h"
  2. #include "stm32f10x_it.h"
  3. #include "led.h"
  4. #include "key.h"
  5. #include "usart.h"
  6. #include "delay.h"
  7. #include "lcd.h"
  8. #include "ov7670.h"
  9. #include "string.h"
  10. TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  11. u8 cur_status;
  12. u8 LED_flag;
  13. u32 a;
  14. u32 b;
  15. u16 AA,BB;
  16. u16 color;
  17. u16 color_save;//保存一个像素的值
  18. u8 R,G,B;//颜色分量
  19. u8 TableChangePoint_240[240];//跳变点240个
  20. u8 Max_ChangePoint_240,Min_ChangePoint_240,Max_bChangePoint,Min_bChangePoint;//跳变点纵轴始、末坐标,跳变点横轴始、末坐标
  21. u8 a_Continue,b_Continue;//记录纵、横轴突变点的连续性
  22. u8 flag_aMax;//末值更新标志
  23. u8 Max_aChangePoint_reset,Min_aChangePoint_reset;//修正后的上下限
  24. u16 Length_card,Width_card;//车牌的长和宽
  25. u8 Max_aChangePoint_reset_1,Min_aChangePoint_reset_1;//保存上次的数据
  26. u8 flag_MaxMinCompare;//Max_aChangePoint_reset_1和Max_aChangePoint_reset的标志
  27. u8 TableChangePoint_320[320];//纵向跳变点320个
  28. float V,S,H;//定义HSV值
  29. u16 Min_blue;
  30. u16 Max_blue;//定义车牌蓝色区域的横向最大值和最小值
  31. u16 k1,kk1,k2,kk2,k3,kk3,k4,kk4,k5,kk5,k6,kk6,k7,kk7,k8,kk8;//八个字符边界
  32. extern u8 Table[6300];//所有字符集 (10+26)*150 = 5400 字节
  33. extern u8 talble_0[150];//字符3,测试用
  34. extern u8 table_yu[32];//渝字
  35. extern u8 table_min[32];//闽字
  36. extern u8 table_lu[32];//鲁字
  37. extern u8 table_zhe[32];//浙字
  38. extern u8 table_shan[32];//陕字
  39. extern u8 table_cuan[32];//川字
  40. u8 R_a,G_a,B_a;//阈值

  41. u8 table_picture[150];//定义保存图片的数组
  42. u8 table_char[36]={0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',};
  43. u8 table_card[5][8]={        //保存5个车牌的二维数组
  44. {0,0,0,0,0,0,0,0},                //最后一位保存时间
  45. {0,0,0,0,0,0,0,0},
  46. {0,0,0,0,0,0,0,0},
  47. {0,0,0,0,0,0,0,0},
  48. {0,0,0,0,0,0,0,0},
  49. };
  50. u8 tim3_num;//TIM3分钟计时

  51. u8 table_cardMeasure[7];//测量的车牌结果
  52. void Show_Card(u8 i);//显示第几组车牌
  53. void Show_Title();//显示标题

  54. void MYRCC_DeInit(void)//复位并配置向量表
  55. {                                                                                 
  56.         NVIC_InitTypeDef NVIC_InitStructure;       
  57.         RCC->APB1RSTR = 0x00000000;//复位结束                         
  58.         RCC->APB2RSTR = 0x00000000;
  59.           
  60.         RCC->AHBENR = 0x00000014;  //睡眠模式闪存和SRAM时钟使能.其他关闭.          
  61.         RCC->APB2ENR = 0x00000000; //外设时钟关闭.                          
  62.         RCC->APB1ENR = 0x00000000;   
  63.         RCC->CR |= 0x00000001;     //使能内部高速时钟HSION                                                                                                                                  
  64.         RCC->CFGR &= 0xF8FF0000;   //复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]                                         
  65.         RCC->CR &= 0xFEF6FFFF;     //复位HSEON,CSSON,PLLON
  66.         RCC->CR &= 0xFFFBFFFF;     //复位HSEBYP                     
  67.         RCC->CFGR &= 0xFF80FFFF;   //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE
  68.         RCC->CIR = 0x00000000;     //关闭所有中断
  69.         /* Enable the TIM3 global Interrupt */
  70.         NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
  71.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
  72.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
  73.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  74.         NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
  75. }
  76. void Stm32_Clock_Init(u8 PLL)//系统时钟初始化函数  pll:选择的倍频数,从2开始,最大值为16       
  77. {
  78.         unsigned char temp=0;   
  79.         MYRCC_DeInit();                  //复位并配置向量表
  80.         RCC->CR|=0x00010000;  //外部高速时钟使能HSEON
  81.         while(!(RCC->CR>>17));//等待外部时钟就绪
  82.         RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
  83.         PLL-=2;//抵消2个单位
  84.         RCC->CFGR|=PLL<<18;   //设置PLL值 2~16
  85.         RCC->CFGR|=1<<16;          //PLLSRC ON
  86.         FLASH->ACR|=0x32;          //FLASH 2个延时周期

  87.         RCC->CR|=0x01000000;  //PLLON
  88.         while(!(RCC->CR>>25));//等待PLL锁定
  89.         RCC->CFGR|=0x00000002;//PLL作为系统时钟         
  90.         while(temp!=0x02)     //等待PLL作为系统时钟设置成功
  91.         {   
  92.                 temp=RCC->CFGR>>2;
  93.                 temp&=0x03;
  94.         }   
  95. }

  96. void LED()//LED指示灯-提示
  97. {
  98.         GPIO_WriteBit(LED1_GPIO_PORT, LED1_GPIO_PIN,LED_flag>>7);
  99.         LED_flag=~LED_flag;
  100. }
  101. void Data_LCD_Display()//常规显示
  102. {
  103.         LCD_SetWindows(0,0,320,240);//设置显示窗口
  104.         GPIO_WriteBit(LCD_RS_PORT, LCD_RS_PIN,1);//标志:数据写入

  105.         while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==1);
  106.         GPIO_WriteBit(FIFO_WRST_PORT, FIFO_WRST_PIN, 0);
  107.         GPIO_WriteBit(FIFO_WRST_PORT, FIFO_WRST_PIN, 1);
  108.         GPIO_WriteBit(FIFO_WR_PORT, FIFO_WR_PIN, 1);
  109.         while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==0);
  110.         while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==1);
  111.         GPIO_WriteBit(FIFO_WR_PORT, FIFO_WR_PIN, 0);
  112.        
  113.         FIFO_Reset_Read_Addr();
  114. //        LED();
  115.        
  116.         for (a=0;a<240;a++)
  117.         {
  118.                 for(b=0;b<320;b++)
  119.                 {
  120.                         GPIOC->BRR =1<<4;
  121.                         AA=GPIOA->IDR;                                               
  122.                         GPIOC->BSRR =1<<4;
  123.                        
  124.                         GPIOC->BRR =1<<4;
  125.                         BB=GPIOA->IDR&0x00ff;                                                               
  126.                         GPIOC->BSRR =1<<4;       
  127.                        
  128.                         color=(AA<<8)|BB;
  129.                        
  130.                         LCD_DATA_PORT->ODR = color;

  131.                         GPIOC->BRR =1<<11;
  132.                         GPIOC->BSRR =1<<11;
  133.                 }                                                       
  134.         }         
  135. }
  136. void RGB_HSV(u16 num)//RGB565转HSV
  137. {
  138.         float max,min;
  139.         u8 r,g,b;
  140.         r=(num>>11)*255/31;g=((num>>5)&0x3f)*255/63;b=(num&0x1f)*255/31;
  141.        
  142.         max=r;min=r;
  143.         if(g>=max)max=g;
  144.         if(b>=max)max=b;
  145.         if(g<=min)min=g;
  146.         if(b<=min)min=b;
  147.        
  148.         V=100*max/255;//转换为百分比
  149.         S=100*(max-min)/max;//扩大100倍显示
  150.         if(max==r) H=(g-b)/(max-min)*60;
  151.         if(max==g) H=120+(b-r)/(max-min)*60;
  152.         if(max==b) H=240+(r-g)/(max-min)*60;
  153.         if(H<0) H=H+360;
  154. }
  155. void Data_LCD_ColorDisplay()//单色像素显示、测量
  156. {
  157.         LCD_SetWindows(0,0,320,240);//设置显示窗口
  158.         GPIO_WriteBit(LCD_RS_PORT, LCD_RS_PIN,1);//标志:数据写入

  159.         while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==1);
  160.         GPIO_WriteBit(FIFO_WRST_PORT, FIFO_WRST_PIN, 0);
  161.         GPIO_WriteBit(FIFO_WRST_PORT, FIFO_WRST_PIN, 1);
  162.         GPIO_WriteBit(FIFO_WR_PORT, FIFO_WR_PIN, 1);
  163.         while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==0);
  164.         while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==1);
  165.         GPIO_WriteBit(FIFO_WR_PORT, FIFO_WR_PIN, 0);
  166.        
  167.         FIFO_Reset_Read_Addr();
  168. //        LED();
  169.        
  170.         for (a=0;a<240;a++)
  171.         {
  172.                 for(b=0;b<320;b++)
  173.                 {
  174.                         GPIOC->BRR =1<<4;
  175.                         AA=GPIOA->IDR;                                               
  176.                         GPIOC->BSRR =1<<4;
  177.                        
  178.                         GPIOC->BRR =1<<4;
  179.                         BB=GPIOA->IDR&0x00ff;                                                               
  180.                         GPIOC->BSRR =1<<4;       
  181.                        
  182.                         color=(AA<<8)|BB;
  183.                        

  184. //                         if(a==100&&b==100)
  185. //                         {
  186. //                                 R=color>>11;
  187. //                                 G=(color>>5)&0x3f;
  188. //                                 B=color&0x1f;       
  189. //                                
  190. //                                 color_save=color;
  191. //                         }
  192. // //像素点测试,位置指示
  193. //                         if(a==99&&b==100)
  194. //                         {
  195. //                                 color=0xf800;
  196. //                         }
  197. //                         if(a==101&&b==100)
  198. //                         {
  199. //                                 color=0xf800;
  200. //                         }
  201. //                         if(a==100&&b==99)
  202. //                         {
  203. //                                 color=0xf800;
  204. //                         }
  205. //                         if(a==100&&b==101)
  206. //                         {
  207. //                                 color=0xf800;
  208. //                         }
  209.                         if(a==100&&b==250)
  210.                         {
  211.                                 R=color>>11;
  212.                                 G=(color>>5)&0x3f;
  213.                                 B=color&0x1f;       
  214.                                
  215.                                 color_save=color;
  216.                         }
  217. //像素点测试,位置指示
  218.                         if(a==100&&b==249)
  219.                         {
  220.                                 color=0xf800;
  221.                         }
  222.                         if(a==100&&b==251)
  223.                         {
  224.                                 color=0xf800;
  225.                         }
  226.                         if(a==99&&b==250)
  227.                         {
  228.                                 color=0xf800;
  229.                         }
  230.                         if(a==101&&b==250)
  231.                         {
  232.                                 color=0xf800;
  233.                         }
  234.                         LCD_DATA_PORT->ODR = color;

  235.                         GPIOC->BRR =1<<11;
  236.                         GPIOC->BSRR =1<<11;
  237.                 }                                                       
  238.         }

  239.         RGB_HSV(color_save);//RGB565转HSV
  240.         LCD_ShowChar(30,200,'H',0);//X坐标,Y坐标,字符,填充模式
  241.         LCD_ShowNum(30,220,H,3);//X坐标,Y坐标,数字,几位数

  242.         LCD_ShowChar(60,200,'S',0);//X坐标,Y坐标,字符,填充模式
  243.         LCD_ShowNum(60,220,S,3);//X坐标,Y坐标,数字,几位数

  244.         LCD_ShowChar(90,200,'V',0);//X坐标,Y坐标,字符,填充模式
  245.         LCD_ShowNum(90,220,V,3);//X坐标,Y坐标,数字,几位数       
  246.         //显示测定的像素
  247.         LCD_ShowChar(160,200,'R',0);//X坐标,Y坐标,字符,填充模式
  248.         LCD_ShowNum(160,220,R,2);//X坐标,Y坐标,数字,几位数

  249.         LCD_ShowChar(190,200,'G',0);//X坐标,Y坐标,字符,填充模式
  250.         LCD_ShowNum(190,220,G,2);//X坐标,Y坐标,数字,几位数

  251.         LCD_ShowChar(220,200,'B',0);//X坐标,Y坐标,字符,填充模式
  252.         LCD_ShowNum(220,220,B,2);//X坐标,Y坐标,数字,几位数       
  253.         for(a=0;a<30;a++)//划线
  254.         {
  255.                 for(b=0;b<30;b++)//划线
  256.                 {
  257.                         LCD_DrawPoint(a+300,b+200,(R<<11)|(G<<5)|B);
  258.                 }
  259.         }
  260. }
  261. void Picture_String()//图片->数组table_picture      有个BUG,先放着吧
  262. {
  263.         u16 a,b,num1;
  264.         for(a=0;a<150;a++)//归零
  265.         {
  266.                 table_picture[a]=0x00;       
  267.         }       
  268.         for(a=0;a<50;a++)//50排
  269.         {
  270.                 for(b=0;b<24;b++)//24行
  271.                 {
  272.                         num1=LCD_ReadPoint(b+296,a+191);
  273.                         if(num1==0xffff)
  274.                         {
  275.                                 table_picture[b/8+a*3]|=(1<<(7-b%8));
  276.                         }
  277.                 }                               
  278.         }
  279. }
  280. void String_Picture_All()//总数组->图片
  281. {
  282.         u16 a,b,e,i,num1;

  283.         for(a=0;a<42;a++)//36
  284.         {
  285.                 for(e=0;e<50;e++)//50排
  286.                 {
  287.                         for(i=0;i<24;i++)//24行
  288.                         {
  289.                                 if(Table[150*a+i/8+e*3]&(1<<(7-i%8)))
  290.                                 {
  291.                                         num1=0xffff;
  292.                                 }
  293.                                 else
  294.                                 {
  295.                                         num1=0x0000;
  296.                                 }
  297.                                 LCD_DrawPoint(i+296,e+191,num1);//画点
  298.                         }                               
  299.                 }
  300.                 delay_ms(500);
  301.         }
  302. }
  303. u8 MoShiShiBie_All(u8 begin,u8 end)//字符匹配,模式识别,选择性匹配begin-end
  304. {
  305.         u16 Compare_num,num_save;
  306.         u8 a,b,e,a_save,st1,st2,s1,s2;
  307.         int num1;
  308.         for(a=begin;a<end;a++)                                        //36
  309.         {
  310.                 num1=0;
  311.                 for(b=0;b<150;b++)
  312.                 {
  313.                         st1=table_picture[b];
  314.                         st2=Table[150*a+b];
  315.                         for(e=0;e<8;e++)
  316.                         {
  317.                                 s1=st1&(1<<e);
  318.                                 s2=st2&(1<<e);
  319.                                 if(s1==s2) num1++;
  320.                                 if(s1!=s2) num1--;
  321.                         }
  322.                 }
  323.                 if(num_save<num1)
  324.                 {
  325.                         num_save=num1;
  326.                         a_save=a;
  327.                 }
  328.                 LCD_ShowNum(50,220,a,2);//显示匹配的字符是"a"                        <调试用>
  329.                 LCD_ShowNum(70,220,num1,4);//显示匹配的正确像素数
  330.                 LCD_ShowNum(120,220,num_save,4);//匹配的最大值显示                                       
  331.         }
  332.         return a_save;
  333. }
  334. void String_Picture()//数组->图片
  335. {
  336.         u16 a,b,e,num1;
  337.        
  338.         for(a=0;a<50;a++)//50排
  339.         {
  340.                 for(b=0;b<24;b++)//24行
  341.                 {
  342.                         if(talble_0[b/8+a*3]&(1<<(7-b%8)))
  343.                         {
  344.                                 num1=0xffff;
  345.                         }
  346.                         else
  347.                         {
  348.                                 num1=0x0000;
  349.                         }
  350.                         LCD_DrawPoint(b+296,a+191,num1);//画点
  351.                 }                               
  352.         }       
  353. }
  354. void WordShow(u8 num,u16 x,u16 y)//显示汉字16*16
  355. {
  356.         u16 a,b,e,num1;
  357.         u8 table1[32];
  358.         if(num==1)
  359.         {
  360.                 for(a=0;a<32;a++)
  361.                 {
  362.                         table1[a]=table_yu[a];       
  363.                 }               
  364.         }
  365.         if(num==2)
  366.         {
  367.                 for(a=0;a<32;a++)
  368.                 {
  369.                         table1[a]=table_min[a];       
  370.                 }               
  371.         }
  372.         if(num==3)
  373.         {
  374.                 for(a=0;a<32;a++)
  375.                 {
  376.                         table1[a]=table_lu[a];       
  377.                 }               
  378.         }
  379.         if(num==4)
  380.         {
  381.                 for(a=0;a<32;a++)
  382.                 {
  383.                         table1[a]=table_zhe[a];       
  384.                 }               
  385.         }
  386.         if(num==5)
  387.         {
  388.                 for(a=0;a<32;a++)
  389.                 {
  390.                         table1[a]=table_shan[a];       
  391.                 }               
  392.         }
  393.         if(num==6)
  394.         {
  395.                 for(a=0;a<32;a++)
  396.                 {
  397.                         table1[a]=table_cuan[a];       
  398.                 }               
  399.         }
  400.         for(a=0;a<16;a++)
  401.         {
  402.                 for(b=0;b<16;b++)
  403.                 {
  404.                         if(table1[b/8+a*2]&(1<<(7-b%8)))
  405.                         {
  406.                                 num1=0xffff;
  407.                         }
  408.                         else
  409.                         {
  410.                                 num1=0x0000;
  411.                         }
  412.                         LCD_DrawPoint(b+x,a+y,num1);//画点
  413.                 }                               
  414.         }       
  415. }
  416. u8 ZhiFuFenGe()//字符分割,返回分割的字符个数,用于判断合法性
  417. {
  418.         u16 a,b;
  419.         u8 i;//统计分割的字符个数,不为9说明分割有误
  420.         i=0;//必须置0一下,不然会有错
  421.         for(b=Max_blue;b>Min_blue;b--)
  422.         {
  423.                 if(TableChangePoint_320[b]==0)//间隙分割
  424.                 {
  425.                         for(a=Min_ChangePoint_240;a<Max_ChangePoint_240;a++)//划线--调试用
  426.                         {
  427.                                 LCD_DrawPoint(b,a+1,0x001f);
  428.                         }
  429.                         i++;b--;
  430.                         while(TableChangePoint_320[b]==0)
  431.                         {
  432.                                 b--;
  433.                                 if(b<=Min_blue) break;
  434.                         }
  435.                 }
  436.         }
  437.         i--;
  438.         LCD_ShowNum(30,220,i,2);//显示分割的字符个数+1,8是正常值
  439.         return i;
  440. }
  441. void GuiYi(u16 k,u16 kk)//归一化 25*50
  442. {
  443.         u16 a,b,e;
  444.         u16 num;//保存读取像素
  445.         u8 Mo,Yu;//取整和取模
  446.         u8 num1,num2,num3;
  447.         u8 Mo_1;//
  448.         u8 Min_240,Max_240;//框紧字符后的上下限
  449.        
  450.         if((k-kk)<25)
  451.         {
  452.                 //框紧字符
  453.                 Min_240=Min_ChangePoint_240+1;
  454.                 Max_240=Max_ChangePoint_240-1;
  455.                 while(Min_240++)//框紧后,得到: Min_240
  456.                 {
  457.                         for(b=kk+1;b<k;b++)//kk1→k1                                
  458.                         {
  459.                                 num=LCD_ReadPoint(b,Min_240);
  460.                                 if(num) break;
  461.                         }
  462.                         if(num) break;
  463.                 }
  464.                 while(Max_240--)//框紧后,得到: Max_240
  465.                 {
  466.                         for(b=kk+1;b<k;b++)//kk1→k1                                
  467.                         {
  468.                                 num=LCD_ReadPoint(b,Max_240);
  469.                                 if(num) break;
  470.                         }
  471.                         if(num) break;
  472.                 }
  473.                 Min_240-=1;
  474.                 Max_240+=2;
  475.                 LCD_DrawPoint(kk,Min_240,0xffff);//
  476.                 LCD_DrawPoint( k,Max_240,0xffff);//
  477.                 //显示复制的图片
  478.                 num3=0;
  479.                 for(a=Min_240+1;a<Max_240;a++)
  480.                 {
  481.                         num2=0;
  482.                         for(b=kk+1;b<k;b++)//kk1→k1                                   +1
  483.                         {
  484.                                 num=LCD_ReadPoint(b,a);
  485.                                 LCD_DrawPoint(271-(k-kk-1)+num2,191+num3,num);//复制像素值
  486.                                 num2++;
  487.                         }
  488.                         num3++;
  489.                 }
  490.                 num3=0;
  491.                 Mo=(24-(k-kk-1))/(k-kk-1);//取模
  492.                 Yu=(24-(k-kk-1))%(k-kk-1);//取余
  493.                 if(Yu!=0)
  494.                 {
  495.                         Mo_1=24/Yu;//平均Mo_1个像素,插有一个像素,机7+1
  496.                 }
  497. //                 LCD_ShowNum(30,20,Mo,3);//显示模                <调试用>
  498. //                 LCD_ShowNum(70,20,Yu,3);//显示余
  499. //                 LCD_ShowNum(100,20,(k1-kk1),3);//显示差值

  500.                 for(a=Min_240+1;a<Max_240;a++)//宽放大为25像素  =??
  501.                 {//↓
  502.                         num2=0;
  503.                         Yu=(24-(k-kk-1))%(k-kk-1);//取余
  504.                        
  505.                         for(b=kk+1;b<k;b++)//kk1→k1                                   +1
  506.                         {
  507.                                 num=LCD_ReadPoint(b,a);
  508.                                 LCD_DrawPoint(271+num2,191+num3,num);
  509.                                 num2++;
  510.                                 Mo=(24-(k-kk-1))/(k-kk-1);//取模
  511.                                 while(Mo)
  512.                                 {
  513.                                         LCD_DrawPoint(271+num2,191+num3,num);
  514.                                         Mo--;
  515.                                         num2++;
  516.                                 }
  517.                                 if(Yu!=0)//横轴拉长
  518.                                 {       
  519.                                         if(((num2+1)%Mo_1==0) && (num2!=1))//改插入的地方7+1
  520.                                         {
  521.                                                 LCD_DrawPoint(271+num2,191+num3,num);
  522.                                                 Yu--;
  523.                                                 num2++;
  524.                                         }
  525.                                 }
  526.                         }
  527.                         num3++;
  528.                 }
  529.                 LCD_DrawPoint(271,191,0x07E0);//标记点,4个顶角
  530.                 LCD_DrawPoint(271,240,0x07E0);
  531.                 LCD_DrawPoint(295,191,0x07E0);
  532.                 LCD_DrawPoint(295,240,0x07E0);
  533. //纵轴拉长
  534.                 if((Max_240-Min_240)<50)
  535.                 {
  536.                         Mo=(50-(Max_240-Min_240+1))/(Max_240-Min_240+1);//取模
  537.                         Yu=(50-(Max_240-Min_240+1))%(Max_240-Min_240+1);//取余
  538.                         Mo_1=50/Yu;
  539.                        
  540. //                         LCD_ShowNum(30,170,Mo,3);//                                        <调试用>
  541. //                         LCD_ShowNum(70,170,Yu,3);//
  542. //                         LCD_ShowNum(100,170,Max_ChangePoint_240-Min_ChangePoint_240,3);//
  543.                         num2=0;
  544.                         for(a=0;a<(Max_240-Min_240);a++)//复制图像,考虑范围是否需要进行修正?
  545.                         {//↓
  546.                                 for(b=271;b<=295;b++)//271开始复制,295才结束
  547.                                 {
  548.                                         num=LCD_ReadPoint(b,a+191);
  549.                                         LCD_DrawPoint(b+25,191+num2,num);//复制像素值
  550.                                 }
  551.                                 num2++;
  552.                                 while(Mo)
  553.                                 {
  554.                                         for(b=271;b<=295;b++)//271开始复制,295才结束
  555.                                         {
  556.                                                 num=LCD_ReadPoint(b,a+191);
  557.                                                 LCD_DrawPoint(b+25,191+num2+a,num);//复制像素值
  558.                                         }
  559.                                         Mo--;
  560.                                         num2++;
  561.                                 }
  562.                                 if(Yu!=0)
  563.                                 {
  564.                                         if((((num2+1) % Mo_1)==0)&& (num2!=1))
  565.                                         {
  566.                                                 for(b=271;b<=295;b++)//271开始复制,295才结束
  567.                                                 {
  568.                                                         num=LCD_ReadPoint(b,a+191);
  569.                                                         LCD_DrawPoint(b+25,191+num2,num);//复制像素值
  570.                                                 }
  571.                                                 Yu--;
  572.                                                 num2++;
  573.                                         }
  574.                                 }                                       
  575.                         }
  576.                 }
  577.                 LCD_DrawPoint(320,191,0xf800);//标记点,1个顶角
  578.         }
  579. }
  580. void ZhiFuShiBie()//字符识别
  581. {
  582.         u16 a,b,e;
  583.         u16 i,u;
  584.         u8 Result;//识别结果

  585.         for(b=Max_blue-1;b>Min_blue;b--)//由右至左识别,获取各个字符的k,kK值
  586.         {
  587.                 while(TableChangePoint_320[b]==0) b--;//取第1个字符
  588.                 k1=b+1;//+1
  589.                 while(TableChangePoint_320[b]>0) b--;
  590.                 kk1=b;
  591.                 if((k1-kk1)<4)//省略低于三个像素的位置
  592.                 {
  593.                         while(TableChangePoint_320[b]==0) b--;//
  594.                         k1=b+1;//+1
  595.                         while(TableChangePoint_320[b]>0) b--;
  596.                         kk1=b;
  597.                 }
  598.                 while(TableChangePoint_320[b]==0) b--;//取第2个字符
  599.                 k2=b+1;
  600.                 while(TableChangePoint_320[b]>0) b--;
  601.                 kk2=b;
  602.                 if((k2-kk2)<4)//省略低于3个像素的位置
  603.                 {
  604.                         while(TableChangePoint_320[b]==0) b--;//
  605.                         k2=b+1;//+1
  606.                         while(TableChangePoint_320[b]>0) b--;
  607.                         kk2=b;
  608.                 }
  609.                 while(TableChangePoint_320[b]==0) b--;//取第3个字符
  610.                 k3=b+1;//+1
  611.                 while(TableChangePoint_320[b]>0) b--;
  612.                 kk3=b;
  613.                 if((k3-kk3)<4)//省略低于3个像素的位置
  614.                 {
  615.                         while(TableChangePoint_320[b]==0) b--;//
  616.                         k3=b+1;//+1
  617.                         while(TableChangePoint_320[b]>0) b--;
  618.                         kk3=b;
  619.                 }
  620.                 while(TableChangePoint_320[b]==0) b--;//取第4个字符
  621.                 k4=b+1;
  622.                 while(TableChangePoint_320[b]>0) b--;
  623.                 kk4=b;
  624.                 if((k4-kk4)<4)//省略低于3个像素的位置
  625.                 {
  626.                         while(TableChangePoint_320[b]==0) b--;//
  627.                         k4=b+1;//+1
  628.                         while(TableChangePoint_320[b]>0) b--;
  629.                         kk4=b;
  630.                 }
  631.                 while(TableChangePoint_320[b]==0) b--;//取第5个字符
  632.                 k5=b+1;//+1
  633.                 while(TableChangePoint_320[b]>0) b--;
  634.                 kk5=b;
  635.                 if((k5-kk5)<4)//省略低于3个像素的位置
  636.                 {
  637.                         while(TableChangePoint_320[b]==0) b--;//
  638.                         k5=b+1;//+1
  639.                         while(TableChangePoint_320[b]>0) b--;
  640.                         kk5=b;
  641.                 }
  642.                 while(TableChangePoint_320[b]==0) b--;//取第6个字符
  643.                 k6=b+1;
  644.                 while(TableChangePoint_320[b]>0) b--;
  645.                 kk6=b;
  646.                 while(TableChangePoint_320[b]==0) b--;//取第7个字符
  647.                 k7=b+1;//+1
  648.                 while(TableChangePoint_320[b]>0) b--;
  649.                 kk7=b;
  650.                 if((k7-kk7)<4)//省略低于3个像素的位置
  651.                 {
  652.                         while(TableChangePoint_320[b]==0) b--;//
  653.                         k7=b+1;//+1
  654.                         while(TableChangePoint_320[b]>0) b--;
  655.                         kk7=b;
  656.                 }
  657.                 while(TableChangePoint_320[b]==0) b--;//取第8个字符
  658.                 k8=b+1;
  659.                 while(TableChangePoint_320[b]>0)
  660.                 {
  661.                         if(b<=Min_blue)
  662.                         {
  663.                                 break;
  664.                         }
  665.                         b--;
  666.                 }
  667.                 kk8=b;
  668.                 b=Min_blue;//以防万一,还满足for循环条件
  669.         }
  670.         for(a=Min_ChangePoint_240;a<Max_ChangePoint_240;a++)//划线
  671.         {
  672.                 LCD_DrawPoint(k1,a+1,0x001f);
  673.                 LCD_DrawPoint(kk1,a+1,0x001f);
  674.                 LCD_DrawPoint(k2,a+1,0x001f);
  675.                 LCD_DrawPoint(kk2,a+1,0x001f);
  676.                 LCD_DrawPoint(k3,a+1,0x001f);
  677.                 LCD_DrawPoint(kk3,a+1,0x001f);
  678.                 LCD_DrawPoint(k4,a+1,0x001f);
  679.                 LCD_DrawPoint(kk4,a+1,0x001f);
  680.                 LCD_DrawPoint(k5,a+1,0x001f);
  681.                 LCD_DrawPoint(kk5,a+1,0x001f);
  682.                 LCD_DrawPoint(k6,a+1,0x001f);
  683.                 LCD_DrawPoint(kk6,a+1,0x001f);
  684.                 LCD_DrawPoint(k7,a+1,0x001f);
  685.                 LCD_DrawPoint(kk7,a+1,0x001f);
  686.                 LCD_DrawPoint(k8,a+1,0x001f);
  687.                 LCD_DrawPoint(kk8,a+1,0x001f);
  688.         }
  689. //归一化处理:大小为25*50
  690.        
  691. //第1个字符:
  692.         GuiYi(k1,kk1);//归一化 24*24
  693.         Picture_String();//图片->数组
  694.         Result=MoShiShiBie_All(0,36);//字符匹配,模式识别,返回a,0<= a <36
  695.         if(Result<10)
  696.         {
  697.                 LCD_ShowNum(240,220,table_char[Result],1);
  698.         }
  699.         else
  700.         {
  701.                 LCD_ShowChar(240,220,table_char[Result],0);
  702.         }
  703.         table_cardMeasure[6]=Result;//保存识别的车牌结果
  704.        
  705. //第2个字符:
  706.         GuiYi(k2,kk2);//归一化 25*50
  707.         Picture_String();//图片->数组
  708.         Result=MoShiShiBie_All(0,36);//字符匹配,模式识别
  709.         if(Result<10)
  710.         {
  711.                 LCD_ShowNum(230,220,table_char[Result],1);
  712.         }
  713.         else
  714.         {
  715.                 LCD_ShowChar(230,220,table_char[Result],0);
  716.         }
  717.         table_cardMeasure[5]=Result;//保存识别的车牌结果
  718.        
  719.         GuiYi(k3,kk3);//归一化 25*50
  720.         Picture_String();//图片->数组
  721.         Result=MoShiShiBie_All(0,36);//字符匹配,模式识别
  722.         if(Result<10)
  723.         {
  724.                 LCD_ShowNum(220,220,table_char[Result],1);
  725.         }
  726.         else
  727.         {
  728.                 LCD_ShowChar(220,220,table_char[Result],0);
  729.         }
  730.         table_cardMeasure[4]=Result;//保存识别的车牌结果
  731.        
  732.         GuiYi(k4,kk4);//归一化 25*50
  733.         Picture_String();//图片->数组
  734.         Result=MoShiShiBie_All(0,36);//字符匹配,模式识别
  735.         if(Result<10)
  736.         {
  737.                 LCD_ShowNum(210,220,table_char[Result],1);
  738.         }
  739.         else
  740.         {
  741.                 LCD_ShowChar(210,220,table_char[Result],0);
  742.         }
  743.         table_cardMeasure[3]=Result;//保存识别的车牌结果
  744.        
  745.         GuiYi(k5,kk5);//归一化 25*50
  746.         Picture_String();//图片->数组
  747.         Result=MoShiShiBie_All(0,36);//字符匹配,模式识别
  748.         if(Result<10)
  749.         {
  750.                 LCD_ShowNum(200,220,table_char[Result],1);
  751.         }
  752.         else
  753.         {
  754.                 LCD_ShowChar(200,220,table_char[Result],0);
  755.         }
  756.         table_cardMeasure[2]=Result;//保存识别的车牌结果
  757.         LCD_ShowChar(190,220,'.',0);

  758.         GuiYi(k7,kk7);//归一化 25*50
  759.         Picture_String();//图片->数组
  760.         Result=MoShiShiBie_All(10,36);//字符匹配,模式识别,只匹配字母
  761.         if(Result<10)
  762.         {
  763.                 LCD_ShowNum(180,220,table_char[Result],1);
  764.         }
  765.         else
  766.         {
  767.                 LCD_ShowChar(180,220,table_char[Result],0);
  768.         }
  769.         table_cardMeasure[1]=Result;//保存识别的车牌结果
  770.        
  771.         GuiYi(k8,kk8);//归一化 25*50                                        最后一个汉字,不做识别
  772.         Picture_String();//图片->数组
  773.         Result=MoShiShiBie_All(36,42);//字符匹配,匹配汉字
  774.         WordShow(Result-35,160,220);//显示汉字
  775.         table_cardMeasure[0]=Result-35;//保存识别的车牌结果
  776.         //识别结束
  777.         //        while(1);
  778.         //先匹配已保存的车牌号
  779.         for(u=0;u<5;u++)
  780.         {
  781.                 for(i=0;i<7;i++)
  782.                 {
  783.                         if(table_card[u][i]!=table_cardMeasure[i]) i=8;//退出for循环
  784.                        
  785.                 }       
  786.                 if(i==7)//匹配成功
  787.                 {
  788.                         LCD_Fill(0x00);//黑屏
  789.                         Show_Title();//显示标题
  790.                         Show_Card(u);//显示第几组车牌                       
  791.                         delay_ms(15000);
  792.                         u=5;
  793.                 }
  794.         }
  795.         if(i==9)//无匹配车牌,则保存车牌
  796.         {
  797.                 i=0;
  798.                 while(1)
  799.                 {
  800.                         if(GPIO_ReadInputDataBit(KEY1_PORT,KEY1_PIN)==0) break;
  801.                         LCD_ShowNum(30,220,i/100,2);
  802.                         if(i==300)                                                                                                                //保存数据
  803.                         {
  804.                                 for(u=0;u<5;u++)
  805.                                 {
  806.                                         if(table_card[u][0]==0)
  807.                                         {
  808.                                                 for(i=0;i<7;i++)
  809.                                                 {
  810.                                                         table_card[u][i]=table_cardMeasure[i];
  811.                                                 }                                       
  812.                                                 u=5;//退出循环
  813.                                         }
  814.                                 }
  815.                                 LCD_Fill(0x00);//黑屏
  816.                                 Show_Title();//显示标题
  817.                                 Show_Card(0);//显示第几组车牌
  818.                                 Show_Card(1);
  819.                                 Show_Card(2);
  820.                                 Show_Card(3);
  821.                                 Show_Card(4);
  822.                                 delay_ms(10000);
  823.                                 break;
  824.                         }
  825.                         delay_ms(1);
  826.                         i++;
  827.                 }
  828.         }
  829.        
  830. }
  831. void Copy_Card()//复制车牌Max_aChangePoint_reset_1,Min_blue
  832. {
  833.         u16 a,b,num;
  834.         for(a=Min_aChangePoint_reset;a<=Max_aChangePoint_reset;a++)
  835.         {       
  836.                 for(b=Min_blue;b<Max_blue;b++)
  837.                 {
  838.                         num=LCD_ReadPoint(b,a);//读取像素值
  839.                         LCD_DrawPoint(b,50+a,num);
  840.                 }
  841.                
  842.         }
  843. }
  844. void ChangePoint_Show_240()//240方向跳变点显示
  845. {
  846.         for(a=0;a<240;a++)//建立参考线10、20、30
  847.         {
  848.                 LCD_DrawPoint(10,a,0x63<<5);//10
  849.                 LCD_DrawPoint(20,a,0x63<<5);//20
  850.                 LCD_DrawPoint(30,a,0x63<<5);//30
  851.         }
  852.        
  853.         for(a=0;a<240;a++)//显示对应的横向跳变点                                                               
  854.         {
  855.                 LCD_DrawPoint(TableChangePoint_240[a],a,0xf800);//跳变点显示,红色标记
  856.                 if(TableChangePoint_240[a]>=15)                                        //跳变点个数(阈值)设定       阈值调节3-(1)
  857.                 {
  858.                         for(b=35;b<40;b++)                                                //显示达到阈值标准的点
  859.                         {
  860.                                 LCD_DrawPoint(b,a,0x63<<5);//Green                       
  861.                         }
  862.                 }
  863.         }
  864. }
  865. void ChangePoint_Analysis_240()//240跳变点分析
  866. {
  867.         Min_ChangePoint_240=240;Max_ChangePoint_240=0;
  868.        
  869.         for(a=0;a<240;a++)//240扫描        ,获取上下限值        :Min_ChangePoint_240,Max_ChangePoint_240                               
  870.         {
  871.                 while(TableChangePoint_240[a]<=15)                                                                        //阈值调节3-(2)
  872.                 {
  873.                         a++;
  874.                 }
  875.                 Min_ChangePoint_240=a;
  876.                 while(TableChangePoint_240[a]>15)                                                                        //阈值调节3-(3)
  877.                 {
  878.                         a++;
  879.                 }
  880.                 Max_ChangePoint_240=a;
  881.                 if(Max_ChangePoint_240-Min_ChangePoint_240>=15) a=240;//连续性阈值           //阈值调节2-(1)
  882.         }
  883.         Min_ChangePoint_240=Min_ChangePoint_240-3;//向上微调3像素
  884.         Max_ChangePoint_240=Max_ChangePoint_240+2;//向下微调2像素
  885.         for(a=30;a<280;a++)//显示上界限                               
  886.         {
  887.                 LCD_DrawPoint(a,Max_ChangePoint_240,0x001f);
  888.         }
  889.         for(a=30;a<280;a++)//显示下界限                                               
  890.         {
  891.                 LCD_DrawPoint(a,Min_ChangePoint_240,0x001f);
  892.         }
  893.         for(a=30;a<280;a++)//显示50,参考50像素位置处,车牌位置不要超过这根线,免得不能字符的归一化处理                                               
  894.         {
  895.                 LCD_DrawPoint(a,Min_ChangePoint_240+50,0xf800);
  896.         }
  897.         flag_MaxMinCompare=1;
  898.         if(Min_ChangePoint_240>Max_ChangePoint_240)//判断合法性1:最小值>最大值
  899.         {
  900.                 flag_MaxMinCompare=0;
  901.         }
  902.         if(Min_ChangePoint_240==240||Max_ChangePoint_240==0)//判断合法性2:值没有重新赋值
  903.         {
  904.                 flag_MaxMinCompare=0;
  905.         }
  906.         if(Max_ChangePoint_240-Min_ChangePoint_240<15)                //判断合法性3:                        //阈值调节2-(2)
  907.         {
  908.                 flag_MaxMinCompare=0;
  909.         }
  910. }
  911. void ChangePoint_Analysis_Blue()//320蓝色区域分析,采用读取像素,得结果Min_blue,Max_blue
  912. {
  913.         u16 a,b,num_color;
  914.         u16 min_320,max_320;//各行的最小、最大值
  915.        
  916.         Min_blue=0;Max_blue=320;
  917.         min_320=320;max_320=0;
  918.        
  919.         for(a=Min_ChangePoint_240;a<Max_ChangePoint_240;a++)                                                               
  920.         {
  921.                 for(b=30;b<290;b++)//不用到320    for(b=30;b<320;b++)
  922.                 {
  923.                         num_color=LCD_ReadPoint(b,a);//读取像素,代码优化速度有待提升 ?扫描方法也可优化,以提升速度
  924.                         RGB_HSV(num_color);//RGB565转HSV
  925.                         if( 250>H && H>190 && 60>S && S>15 && 100>V && V>45)//HSV 阈值
  926.                         {
  927.                                 if(b<min_320)//获得横轴的Min和Max值,即蓝色车牌的左右边界
  928.                                 {
  929.                                         min_320=b;
  930.                                 }
  931.                                 if(b>max_320)
  932.                                 {
  933.                                         max_320=b;
  934.                                 }
  935.                         }
  936.                 }
  937.         }
  938.         Min_blue=min_320;//获取各行的最大值//修正一点
  939.         Max_blue=max_320-5;//获取各行的最小值//修正一点
  940.        
  941.         for(a=Min_ChangePoint_240;a<Max_ChangePoint_240;a++)//显示左界限                               
  942.         {
  943.                 LCD_DrawPoint(Min_blue,a,0xf8);//LCD_DrawPoint(Min_blue,a,0xf800);
  944.         }
  945.         for(a=Min_ChangePoint_240;a<Max_ChangePoint_240;a++)//显示右界限                                       
  946.         {
  947.                 LCD_DrawPoint(Max_blue,a,0xf800);
  948.         }
  949. //         delay_ms(6000);
  950. }
  951. void Card_101Show()//车牌区域二值化显示
  952. {
  953.         u16 a,b,num_color;
  954.         u8 R1,G1,B1;
  955.         u8 Mid_ChangePoint_240;
  956.         u8 max_R,max_G,max_B,min_R,min_G,min_B;
  957.         u8 mid_R,mid_G,mid_B;
  958.        
  959.         max_R=0;max_G=0;max_B=0;
  960.         min_R=30;min_G=60;min_B=30;
  961.        
  962.         Mid_ChangePoint_240=(Min_ChangePoint_240+Max_ChangePoint_240)/2;
  963.         for(b=Min_blue;b<Max_blue;b++)
  964.         {
  965.                 num_color=LCD_ReadPoint(b,Mid_ChangePoint_240);//读取像素,代码优化速度有待提升 ?扫描方法也可优化,以提升速度
  966.                 R1=num_color>>11;
  967.                 G1=(num_color>>5)&0x3F;
  968.                 B1=num_color&0x1F;
  969.                 if( (R1>10) && (G1>25) && (B1>15) && (R1<=30) && (G1<=60) && (B1<=30) )//二值化,高阈值:25.55.25,较合适阈值(21,47,21)
  970.                 {
  971.                         if(max_R<R1) max_R=R1;//获得最大值和最小值
  972.                         if(max_G<G1) max_G=G1;
  973.                         if(max_B<B1) max_B=B1;
  974.                        
  975.                         if(min_R>R1) min_R=R1;
  976.                         if(min_G>G1) min_G=G1;
  977.                         if(min_B>B1) min_B=B1;               
  978.                 }
  979.         }
  980.         mid_R=(max_R+min_R)/2;
  981.         mid_G=(max_G+min_G)/2;
  982.         mid_B=(max_B+        min_B)/2;
  983. //         LCD_ShowNum(30,200,max_R,2);//X坐标,Y坐标,数字,几位数             <调试用>
  984. //         LCD_ShowNum(70,200,max_G,2);//X坐标,Y坐标,数字,几位数
  985. //         LCD_ShowNum(100,200,max_B,2);//X坐标,Y坐标,数字,几位数
  986. //        
  987. //         LCD_ShowNum(30,220,min_R,2);//X坐标,Y坐标,数字,几位数
  988. //         LCD_ShowNum(70,220,min_G,2);//X坐标,Y坐标,数字,几位数
  989. //         LCD_ShowNum(100,220,min_B,2);//X坐标,Y坐标,数字,几位数
  990.        
  991.         for(a=Min_ChangePoint_240;a<Max_ChangePoint_240;a++)                                                               
  992.         {
  993.                 for(b=Min_blue;b<Max_blue;b++)
  994.                 {
  995.                         num_color=LCD_ReadPoint(b,a);//读取像素,代码优化速度有待提升 ?扫描方法也可优化,以提升速度
  996.                         R1=num_color>>11;
  997.                         G1=(num_color>>5)&0x3F;
  998.                         B1=num_color&0x1F;
  999.                         if((R1>=mid_R) && (G1>=mid_G) && (B1>=mid_B))//二值化,高阈值:25.55.25,较合适阈值(21,47,21)
  1000.                         {
  1001.                                 LCD_DrawPoint(b,a,0xffff);
  1002.                         }
  1003.                         else
  1004.                         {
  1005.                                 LCD_DrawPoint(b,a,0x0000);
  1006.                         }
  1007.                 }
  1008.         }
  1009.         delay_ms(20000);
  1010. }
  1011. void ChangePoint_Show_320()//320方向跳变点显示
  1012. {
  1013.         for(a=0;a<320;a++)//显示对应的横向跳变点                                                               
  1014.         {
  1015.                 if(TableChangePoint_320[a]==0)
  1016.                 {
  1017.                         LCD_DrawPoint(a,0,0x001F);//跳变点显示,红色标记
  1018.                 }
  1019.                 else
  1020.                 {
  1021.                         LCD_DrawPoint(a,TableChangePoint_320[a],0xf800);//跳变点显示,红色标记
  1022.                 }
  1023.                

  1024.         }
  1025. }
  1026. void ChangePoint_Analysis_320()//蓝色区域中,320跳变点分析,获得TableChangePoint_320[b]结果
  1027. {                                                                //(先二值化,再判断白点个数,=0则是分割线)
  1028.         u16 a,b,num_color;
  1029.         u8 R1,G1,B1;
  1030.         u8 Mid_ChangePoint_240;
  1031.         u8 max_R,max_G,max_B,min_R,min_G,min_B;
  1032.         u8 mid_R,mid_G,mid_B;
  1033.        
  1034.         max_R=0;max_G=0;max_B=0;
  1035.         min_R=30;min_G=60;min_B=30;
  1036.        
  1037.         Mid_ChangePoint_240=(Min_ChangePoint_240+Max_ChangePoint_240)/2;
  1038.         for(b=Min_blue;b<Max_blue;b++)
  1039.         {
  1040.                 num_color=LCD_ReadPoint(b,Mid_ChangePoint_240);//读取像素,代码优化速度有待提升 ?扫描方法也可优化,以提升速度
  1041.                 R1=num_color>>11;
  1042.                 G1=(num_color>>5)&0x3F;
  1043.                 B1=num_color&0x1F;
  1044.                 if( (R1>10) && (G1>25) && (B1>15) && (R1<=30) && (G1<=60) && (B1<=30) )//二值化,高阈值:25.55.25,较合适阈值(21,47,21)
  1045.                 {
  1046.                         if(max_R<R1) max_R=R1;//获得最大值和最小值
  1047.                         if(max_G<G1) max_G=G1;
  1048.                         if(max_B<B1) max_B=B1;
  1049.                        
  1050.                         if(min_R>R1) min_R=R1;
  1051.                         if(min_G>G1) min_G=G1;
  1052.                         if(min_B>B1) min_B=B1;               
  1053.                 }
  1054.         }
  1055.         mid_R=(max_R+min_R)/2;
  1056.         mid_G=(max_G+min_G)/2;
  1057.         mid_B=(max_B+        min_B)/2;
  1058. //         LCD_ShowNum(30,200,max_R,2);//X坐标,Y坐标,数字,几位数                <调试用>
  1059. //         LCD_ShowNum(70,200,max_G,2);//X坐标,Y坐标,数字,几位数
  1060. //         LCD_ShowNum(100,200,max_B,2);//X坐标,Y坐标,数字,几位数
  1061. //        
  1062. //         LCD_ShowNum(30,220,min_R,2);//X坐标,Y坐标,数字,几位数
  1063. //         LCD_ShowNum(70,220,min_G,2);//X坐标,Y坐标,数字,几位数
  1064. //         LCD_ShowNum(100,220,min_B,2);//X坐标,Y坐标,数字,几位数
  1065.         for(b=0;b<320;b++)//各行跳变点计数,数组清零
  1066.         {
  1067.                 TableChangePoint_320[b]=0;
  1068.         }
  1069.         for(a=Min_ChangePoint_240;a<Max_ChangePoint_240;a++)                                                               
  1070.         {
  1071.                 for(b=Min_blue+1;b<Max_blue;b++)
  1072.                 {
  1073.                         num_color=LCD_ReadPoint(b,a);//读取像素,代码优化速度有待提升 ?扫描方法也可优化,以提升速度
  1074.                         R1=num_color>>11;
  1075.                         G1=(num_color>>5)&0x3F;
  1076.                         B1=num_color&0x1F;
  1077.                         if((R1>=mid_R) && (G1>=mid_G) && (B1>=mid_B))//二值化,高阈值:25.55.25,较合适阈值(21,47,21)
  1078.                         {
  1079.                                 LCD_DrawPoint(b,a,0xffff);
  1080.                                 TableChangePoint_320[b]++;//白色,跳变点+1
  1081.                         }
  1082.                         else
  1083.                         {
  1084.                                 LCD_DrawPoint(b,a,0x0000);
  1085.                         }
  1086.                 }
  1087.         }
  1088. }

  1089. void Data_LCD_ColorChange()//摄像头扫描
  1090. {
  1091.         u8 i;
  1092.         for(a=0;a<240;a++)//各行跳变点计数,数组清零
  1093.         {
  1094.                 TableChangePoint_240[a]=0;
  1095.         }
  1096.         Min_blue=320;//初始化记录蓝色车牌区域的值
  1097.         Max_blue=0;
  1098.        
  1099.         LCD_SetWindows(0,0,320,240);//设置显示窗口
  1100.         GPIO_WriteBit(LCD_RS_PORT, LCD_RS_PIN,1);//标志:数据写入

  1101.         while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==1);
  1102.         GPIO_WriteBit(FIFO_WRST_PORT, FIFO_WRST_PIN, 0);
  1103.         GPIO_WriteBit(FIFO_WRST_PORT, FIFO_WRST_PIN, 1);
  1104.         GPIO_WriteBit(FIFO_WR_PORT, FIFO_WR_PIN, 1);
  1105.         while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==0);
  1106.         while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==1);
  1107.         GPIO_WriteBit(FIFO_WR_PORT, FIFO_WR_PIN, 0);
  1108.        
  1109.         FIFO_Reset_Read_Addr();
  1110. //        LED();
  1111.        
  1112.         for (a=0;a<240;a++)
  1113.         {
  1114.                 for(b=0;b<320;b++)
  1115.                 {
  1116.                         GPIOC->BRR =1<<4;
  1117.                         AA=GPIOA->IDR;                                               
  1118.                         GPIOC->BSRR =1<<4;
  1119.                        
  1120.                         GPIOC->BRR =1<<4;
  1121.                         BB=GPIOA->IDR&0x00ff;                                                               
  1122.                         GPIOC->BSRR =1<<4;       
  1123.                        
  1124.                         color=(AA<<8)|BB;

  1125.                         R=color>>11;
  1126.                         G=(color>>5)&0x3f;
  1127.                         B=color&0x1f;
  1128.                        
  1129.                         if((R>R_a) && (G>=G_a) && (B>=B_a))//二值化,高阈值:25.55.25,较合适阈值(21,47,21)
  1130.                         {
  1131.                                 color=0xffff;
  1132.                         }
  1133.                         else
  1134.                         {
  1135.                                 color=0x0000;
  1136.                         }
  1137.                        
  1138.                         if(color!=color_save)//跳变点
  1139.                         {
  1140.                                 TableChangePoint_240[a]++;                //该行跳变点计数+1
  1141.                         }
  1142.                         color_save=color;//保存像素值,供下一次判断和比较
  1143.                        
  1144.                         color=(AA<<8)|BB;//还原色彩
  1145.                                        
  1146.                         LCD_DATA_PORT->ODR = color;
  1147.                         GPIOC->BRR =1<<11;
  1148.                         GPIOC->BSRR =1<<11;
  1149.                 }
  1150.         }
  1151.        
  1152.         ChangePoint_Show_240();//240方向跳变点显示
  1153.         ChangePoint_Analysis_240();        //跳变点分析
  1154.                                                         //返回flag_MaxMinCompare,Min_ChangePoint_240,Max_ChangePoint_240
  1155.         if(flag_MaxMinCompare==1)//跳变点筛选成功
  1156.         {
  1157.                 ChangePoint_Analysis_Blue();//320蓝色区域分析,采用读取像素,得结果Min_blue,Max_blue
  1158.                 if(Min_blue>Max_blue) flag_MaxMinCompare=0;//进行合理性判断1
  1159.                 if((Min_blue>290)||(Max_blue>290)) flag_MaxMinCompare=0;//进行合理性判断2
  1160.         }
  1161.         if(flag_MaxMinCompare==1)//跳变点筛选成功
  1162.         {
  1163. //                ChangePoint_Analysis_Blue();//320蓝色区域分析,采用读取像素,得结果Min_blue,Max_blue
  1164. //                 Card_101Show();//车牌区域二值化显示
  1165.                 ChangePoint_Analysis_320();//蓝色区域中,320跳变点分析,获得:TableChangePoint_320[b]结果
  1166.                 ChangePoint_Show_320();//320方向跳变点显示
  1167.                 i=ZhiFuFenGe();
  1168.                
  1169.                 if(i==8)//字符分割,返回分割的字符个数,用于判断合法性
  1170.                 {
  1171.                         ZhiFuShiBie();//字符识别       
  1172.                 }
  1173.                 else
  1174.                 {
  1175.                         LCD_Fill(0x6666);//黑屏,显示Measure Faill
  1176.                         LCD_ShowChar(8*1,200,'M',0);
  1177.                         LCD_ShowChar(8*2,200,'e',0);
  1178.                         LCD_ShowChar(8*3,200,'a',0);
  1179.                         LCD_ShowChar(8*4,200,'s',0);
  1180.                         LCD_ShowChar(8*5,200,'u',0);
  1181.                         LCD_ShowChar(8*6,200,'r',0);
  1182.                         LCD_ShowChar(8*7,200,'e',0);
  1183.                        
  1184.                         LCD_ShowChar(8*9,200,'F',0);
  1185.                         LCD_ShowChar(8*10,200,'a',0);
  1186.                         LCD_ShowChar(8*11,200,'i',0);
  1187.                         LCD_ShowChar(8*12,200,'l',0);
  1188.                         LCD_ShowChar(8*13,200,'l',0);

  1189.                         delay_ms(800);
  1190.                 }
  1191.         }
  1192. }
  1193. void Data_LCD_ColorChange_Test()//摄像头扫描测试
  1194. {
  1195.         for(a=0;a<240;a++)//各行跳变点计数,数组清零
  1196.         {
  1197.                 TableChangePoint_240[a]=0;
  1198.         }
  1199.         Min_blue=320;//初始化记录蓝色车牌区域的值
  1200.         Max_blue=0;
  1201.        
  1202.         LCD_SetWindows(0,0,320,240);//设置显示窗口
  1203.         GPIO_WriteBit(LCD_RS_PORT, LCD_RS_PIN,1);//标志:数据写入

  1204.         while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==1);
  1205.         GPIO_WriteBit(FIFO_WRST_PORT, FIFO_WRST_PIN, 0);
  1206.         GPIO_WriteBit(FIFO_WRST_PORT, FIFO_WRST_PIN, 1);
  1207.         GPIO_WriteBit(FIFO_WR_PORT, FIFO_WR_PIN, 1);
  1208.         while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==0);
  1209.         while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==1);
  1210.         GPIO_WriteBit(FIFO_WR_PORT, FIFO_WR_PIN, 0);
  1211.        
  1212.         FIFO_Reset_Read_Addr();
  1213. //        LED();
  1214.        
  1215.         for (a=0;a<240;a++)
  1216.         {
  1217.                 for(b=0;b<320;b++)
  1218.                 {
  1219.                         GPIOC->BRR =1<<4;
  1220.                         AA=GPIOA->IDR;                                               
  1221.                         GPIOC->BSRR =1<<4;
  1222.                        
  1223.                         GPIOC->BRR =1<<4;
  1224.                         BB=GPIOA->IDR&0x00ff;                                                               
  1225.                         GPIOC->BSRR =1<<4;       
  1226.                        
  1227.                         color=(AA<<8)|BB;

  1228.                         R=color>>11;
  1229.                         G=(color>>5)&0x3f;
  1230.                         B=color&0x1f;
  1231.                        
  1232.                         if((R>R_a) && (G>=G_a) && (B>=B_a))//二值化,高阈值:25.55.25,较合适阈值(21,47,21)
  1233.                         {
  1234.                                 color=0xffff;
  1235.                         }
  1236.                         else
  1237.                         {
  1238.                                 color=0x0000;
  1239.                         }
  1240.                        
  1241.                         if(color!=color_save)//跳变点
  1242.                         {
  1243.                                 TableChangePoint_240[a]++;                //该行跳变点计数+1
  1244.                         }
  1245.                         color_save=color;//保存像素值,供下一次判断和比较
  1246.                        
  1247.                         color=(AA<<8)|BB;//还原色彩
  1248.                                        
  1249.                         LCD_DATA_PORT->ODR = color;
  1250.                         GPIOC->BRR =1<<11;
  1251.                         GPIOC->BSRR =1<<11;
  1252.                 }
  1253.         }
  1254.         ChangePoint_Show_240();//240方向跳变点显示
  1255.         ChangePoint_Analysis_240();        //跳变点分析
  1256. }
  1257. void Data_LCD_ColorPut()//颜色处理
  1258. {
  1259.         LCD_SetWindows(0,0,320,240);//设置显示窗口
  1260.         GPIO_WriteBit(LCD_RS_PORT, LCD_RS_PIN,1);//标志:数据写入

  1261.         while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==1);
  1262.         GPIO_WriteBit(FIFO_WRST_PORT, FIFO_WRST_PIN, 0);
  1263.         GPIO_WriteBit(FIFO_WRST_PORT, FIFO_WRST_PIN, 1);
  1264.         GPIO_WriteBit(FIFO_WR_PORT, FIFO_WR_PIN, 1);
  1265.         while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==0);
  1266.         while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)==1);
  1267.         GPIO_WriteBit(FIFO_WR_PORT, FIFO_WR_PIN, 0);
  1268.        
  1269.         FIFO_Reset_Read_Addr();
  1270. //        LED();
  1271.        
  1272.         for (a=0;a<240;a++)
  1273.         {
  1274.                 for(b=0;b<320;b++)
  1275.                 {
  1276.                         GPIOC->BRR =1<<4;
  1277.                         AA=GPIOA->IDR;                                               
  1278.                         GPIOC->BSRR =1<<4;
  1279.                        
  1280.                         GPIOC->BRR =1<<4;
  1281.                         BB=GPIOA->IDR&0x00ff;                                                               
  1282.                         GPIOC->BSRR =1<<4;       
  1283.                        
  1284.                         color=(AA<<8)|BB;
  1285.                        
  1286.                         R=color>>11;
  1287.                         G=(color>>5)&0x3f;
  1288.                         B=color&0x1f;
  1289.                        
  1290. //                         if(R<25&&G<50&&B<25)
  1291. //                         {
  1292. //                                 color=0xf800;
  1293. //                         }
  1294.                         if(R<29&&G<59&&B<29)
  1295.                         {
  1296.                                 color=0x0000;
  1297.                         }
  1298.                         LCD_DATA_PORT->ODR = color;

  1299.                         GPIOC->BRR =1<<11;
  1300.                         GPIOC->BSRR =1<<11;
  1301.                 }                                                       
  1302.         }
  1303. }
  1304. void PC0_in()//PC0引脚为输入
  1305. {
  1306.         GPIO_InitTypeDef gpio_init_struct;//结构体
  1307.         gpio_init_struct.GPIO_Mode = GPIO_Mode_IPU;//输入上拉
  1308.         gpio_init_struct.GPIO_Speed = GPIO_Speed_50MHz;
  1309.         gpio_init_struct.GPIO_Pin = GPIO_Pin_0;
  1310.         GPIO_Init(GPIOC, &gpio_init_struct);
  1311. }
  1312. void Show_Card(u8 i)//显示第几组车牌
  1313. {
  1314.         u16 t0;
  1315. //显示汉字
  1316.         if(table_card[i][0]!=0)
  1317.         {
  1318.                 WordShow(table_card[i][0],9,i*16+50);//
  1319.         }
  1320.        
  1321.         if(table_card[i][1]<10)
  1322.         {
  1323.                 LCD_ShowNum(25,i*16+50,table_char[table_card[i][1]],1);
  1324.         }
  1325.         else
  1326.         {
  1327.                 LCD_ShowChar(25,i*16+50,table_char[table_card[i][1]],0);
  1328.         }
  1329.         LCD_ShowChar(33,i*16+50,'.',0);                                                                                                                //点
  1330.         if(table_card[i][2]<10)
  1331.         {
  1332.                 LCD_ShowNum(41,i*16+50,table_char[table_card[i][2]],1);
  1333.         }
  1334.         else
  1335.         {
  1336.                 LCD_ShowChar(41,i*16+50,table_char[table_card[i][2]],0);
  1337.         }
  1338.         if(table_card[i][3]<10)
  1339.         {
  1340.                 LCD_ShowNum(49,i*16+50,table_char[table_card[i][3]],1);
  1341.         }
  1342.         else
  1343.         {
  1344.                 LCD_ShowChar(49,i*16+50,table_char[table_card[i][3]],0);
  1345.         }
  1346.         if(table_card[i][4]<10)
  1347.         {
  1348.                 LCD_ShowNum(57,i*16+50,table_char[table_card[i][4]],1);
  1349.         }
  1350.         else
  1351.         {
  1352.                 LCD_ShowChar(57,i*16+50,table_char[table_card[i][4]],0);
  1353.         }
  1354.         if(table_card[i][5]<10)
  1355.         {
  1356.                 LCD_ShowNum(65,i*16+50,table_char[table_card[i][5]],1);
  1357.         }
  1358.         else
  1359.         {
  1360.                 LCD_ShowChar(65,i*16+50,table_char[table_card[i][5]],0);
  1361.         }
  1362.         if(table_card[i][6]<10)
  1363.         {
  1364.                 LCD_ShowNum(73,i*16+50,table_char[table_card[i][6]],1);
  1365.         }
  1366.         else
  1367.         {
  1368.                 LCD_ShowChar(73,i*16+50,table_char[table_card[i][6]],0);
  1369.         }
  1370.         t0=table_card[i][7];
  1371.         LCD_ShowNum(100,i*16+50,t0,6);//显示时间

  1372.         if(t0<60)
  1373.         {
  1374.                 LCD_ShowNumPoint(168,i*16+50,t0*8);
  1375.         }
  1376.         else
  1377.         {
  1378.                 LCD_ShowNumPoint(168,i*16+50,t0/60*500+t0%60*8);
  1379.         }
  1380.        
  1381. }
  1382. //定时器3中断服务程序         
  1383. void TIM3_IRQHandler(void)
  1384. {                                                                   
  1385.         if(TIM3->SR&0X0001)//溢出中断
  1386.         {
  1387.                 LED();
  1388.                 if(tim3_num==60)
  1389.                 {
  1390.                         if(table_card[0][0]!=0)//第1组计时
  1391.                         {
  1392.                                 table_card[0][7]++;
  1393.                         }               
  1394.                         if(table_card[1][0]!=0)//第2组计时
  1395.                         {
  1396.                                 table_card[1][7]++;
  1397.                         }
  1398.                         if(table_card[2][0]!=0)//第3组计时
  1399.                         {
  1400.                                 table_card[2][7]++;
  1401.                         }       
  1402.                         if(table_card[3][0]!=0)//第4组计时
  1403.                         {
  1404.                                 table_card[3][7]++;
  1405.                         }       
  1406.                         if(table_card[4][0]!=0)//第5组计时
  1407.                         {
  1408.                                 table_card[4][7]++;
  1409.                         }
  1410.                         tim3_num=0;
  1411.                 }               
  1412.         }                       
  1413.         tim3_num++;
  1414.         TIM3->SR&=~(1<<0);//清除中断标志位             
  1415. }
  1416. void TIM3_Configuration(void)
  1417.         {
  1418.         /* TIM3 clock enable */
  1419.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  1420.         /* ---------------------------------------------------------------
  1421.         TIM3CLK 即PCLK1=36MHz
  1422.         TIM3CLK = 36 MHz, Prescaler = 7200, TIM3 counter clock = 5K,即改变一次为5K,周期就为10K
  1423.         --------------------------------------------------------------- */
  1424.         /* Time base configuration */
  1425.         TIM_TimeBaseStructure.TIM_Period = 10000; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         计数到10000为1000ms
  1426.         TIM_TimeBaseStructure.TIM_Prescaler =(12800-1); //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
  1427.         TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  1428.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  1429.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  1430.        
  1431.         /* Enables the Update event for TIM3 */
  1432.         //TIM_UpdateDisableConfig(TIM3,ENABLE);         //使能 TIM3 更新事件
  1433.        
  1434.         /* TIM IT enable */
  1435.         TIM_ITConfig(  //使能或者失能指定的TIM中断
  1436.                 TIM3, //TIM2
  1437.                 TIM_IT_Update  |  //TIM 中断源
  1438.                 TIM_IT_Trigger,   //TIM 触发中断源
  1439.                 ENABLE  //使能
  1440.                 );
  1441.        
  1442.         /* TIM3 enable counter */
  1443.         TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
  1444. }
  1445. void Show_Title()//显示标题
  1446. {
  1447.         LCD_ShowChar(35+8*0,10,'N',0);
  1448.         LCD_ShowChar(35+8*1,10,'u',0);
  1449.         LCD_ShowChar(35+8*2,10,'m',0);
  1450.         LCD_ShowChar(35+8*3,10,'b',0);
  1451.         LCD_ShowChar(35+8*4,10,'e',0);
  1452.         LCD_ShowChar(35+8*5,10,'r',0);
  1453.        
  1454.         LCD_ShowChar(35+8*9,10,'T',0);
  1455.         LCD_ShowChar(35+8*10,10,'i',0);
  1456.         LCD_ShowChar(35+8*11,10,'m',0);
  1457.         LCD_ShowChar(35+8*12,10,'e',0);

  1458.        
  1459.         LCD_ShowChar(35+8*17,10,'P',0);
  1460.         LCD_ShowChar(35+8*18,10,'r',0);
  1461.         LCD_ShowChar(35+8*19,10,'i',0);
  1462.         LCD_ShowChar(35+8*20,10,'c',0);
  1463.         LCD_ShowChar(35+8*21,10,'e',0);
  1464. }
  1465. void main(void)
  1466. {  
  1467.         unsigned int num;
  1468.         u16 i;
  1469.         Stm32_Clock_Init(16);//初始化时钟

  1470.         Led_init();                        //初始化 LED       
  1471.         Lcd_Gpio_Init();
  1472.         LCD_Init();       
  1473.        
  1474.         Key_init();        //初始化 KEY1
  1475.         PC0_in();//PC0引脚为输入
  1476.        
  1477.         OV7670_Gpio_Init();//OV7670引脚初始化,放在串口初始化前面
  1478.         GPIO_WriteBit(FIFO_OE_PORT, FIFO_OE_PIN, 0);
  1479.         USART1_init();//初始化串口       
  1480. //         PC0_in();//PC0引脚为输入
  1481.         TIM3_Configuration();//10Khz的计数频率,计数到5000为500ms  
  1482.         LCD_Fill(0x6666);               
  1483.        
  1484. //        while(1)//
  1485. //        {
  1486. //                LCD_ShowNumPoint(0,0,12345);
  1487. //        }

  1488.         while(!Sensor_init());
  1489.        
  1490.         LCD_Fill(0xF800);
  1491.         delayms(100);
  1492.         num=2;
  1493.        
  1494.         R_a=24;
  1495.         G_a=53;
  1496.         B_a=24;

  1497.         while(1)
  1498.         {
  1499.                 if(num<=1)
  1500.                 {
  1501.                         Data_LCD_ColorChange();//车牌测定
  1502.                 }
  1503.                 if(num>1)
  1504.                 {
  1505.                         Data_LCD_ColorChange_Test();//摄像头扫描测试
  1506.                         LCD_ShowNum(30,220,21-num,2);//
  1507.                         while(GPIO_ReadInputDataBit(KEY1_PORT,KEY1_PIN)==0)
  1508.                         {
  1509.                                 LCD_Fill(0x00);//黑屏
  1510.                                 Show_Title();//显示标题
  1511.                                 Show_Card(0);//显示第几组车牌
  1512.                                 Show_Card(1);
  1513.                                 Show_Card(2);
  1514.                                 Show_Card(3);
  1515.                                 Show_Card(4);
  1516.                                 delay_ms(5000);
  1517.                         }
  1518.                 }
  1519.                 if(num==20)
  1520.                 {
  1521.                         num=0;
  1522.                 }
  1523.                 num++;
  1524.         }
  1525.         while(1)
  1526.         {

  1527.                 MoShiShiBie();//字符匹配,模式识别
  1528.         }
  1529.         while(1)//图片浏览
  1530.         {

  1531.                 String_Picture_All();//总数组->图片
  1532.         }
  1533.         while(1)
  1534.         {
  1535.                 String_Picture();//数组->图片
  1536.                 delayms(5000);
  1537.                 Picture_String();//图片->数组table_picture
  1538.                 delayms(5000);
  1539.                 LCD_Fill(0xF800);
  1540.                 delayms(5000);
  1541.                 String_Picture9();//数组->图片
  1542.                 delayms(5000);
  1543.         }

  1544.         while(1)//测量像素
  1545.         {
  1546.                 Data_LCD_ColorDisplay();//单色像素显示、测量
  1547.         }       
  1548.         while(1)
  1549.         {
  1550.                 RGB_HSV(0x4f32);//RGB转HSV
  1551.         }
  1552.         while(1)
  1553.         {
  1554.                 LCD_ShowChar(10,200,'X',0);//X坐标,Y坐标,字符,填充模式
  1555.                 LCD_ShowNum(30,200,123456,6);//X坐标,Y坐标,数字,几位数
  1556.                 LCD_ShowChar(10,220,'Y',0);//X坐标,Y坐标,字符,填充模式
  1557.                 LCD_ShowNum(30,220,789012,6);//X坐标,Y坐标,数字,几位数
  1558.         }       
  1559.         while(1)//测量像素
  1560.         {
  1561.                 WordShow(1,160,220);//显示渝字
  1562.                 delayms(1000);
  1563.                 WordShow(2,160,220);//显示渝字
  1564.                 delayms(1000);
  1565.                 WordShow(3,160,220);//显示渝字
  1566.                 delayms(1000);
  1567.                 WordShow(4,160,220);//显示渝字
  1568.                 delayms(1000);
  1569.                 WordShow(5,160,220);//显示渝字
  1570.                 delayms(1000);
  1571.                 WordShow(6,160,220);//显示渝字
  1572.                 delayms(1000);
  1573.         }
  1574. }


复制代码


评分

参与人数 4黑币 +20 收起 理由
liuyanga + 5 我之前用OpenCV做了一个车牌识别,速度有点.
ZYQ9808 + 5 很给力!
goyimen + 5 这个厉害,图形识别属于高级应用了。
ROS + 5

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏27 分享淘帖 顶4 踩
回复

使用道具 举报

沙发
ID:153777 发表于 2016-12-14 22:26 | 只看该作者
电路图有没有
回复

使用道具 举报

板凳
ID:183902 发表于 2017-3-27 18:25 | 只看该作者
这可真是,谢谢分享,1600行代码
回复

使用道具 举报

地板
ID:183902 发表于 2017-3-27 18:25 | 只看该作者
谢谢分享,正好需在研究
回复

使用道具 举报

5#
ID:220913 发表于 2017-7-20 16:36 | 只看该作者
下载看看
回复

使用道具 举报

6#
ID:220913 发表于 2017-7-20 16:36 | 只看该作者
下载整个工程试试
回复

使用道具 举报

7#
ID:221028 发表于 2017-8-4 21:05 | 只看该作者
下载一个试试
回复

使用道具 举报

8#
ID:230276 发表于 2017-9-1 09:17 | 只看该作者
东西很好,能否说一下用的是那一个版本的开发板,战舰?神舟?不过还是先下一个看看吧,感觉挺不错的。
回复

使用道具 举报

9#
ID:91469 发表于 2017-9-11 16:43 | 只看该作者
有点小惊奇的啊!文件点不上!!!!
回复

使用道具 举报

10#
ID:81206 发表于 2017-9-18 15:12 | 只看该作者
有没有硬件电路图啊
回复

使用道具 举报

11#
ID:70707 发表于 2017-9-27 21:59 | 只看该作者
兄弟,这个识别速度怎么样,达到外面停车场的效果?
回复

使用道具 举报

12#
ID:198608 发表于 2017-10-9 11:35 | 只看该作者
楼主给个联系方式,我要拜师
回复

使用道具 举报

13#
ID:245613 发表于 2017-11-3 11:24 | 只看该作者
請問是否有電路圖或系統架構圖呢?
回复

使用道具 举报

14#
ID:243668 发表于 2017-11-3 17:21 | 只看该作者
是使用哪款芯片做的?把电路图和架构也传上来?
回复

使用道具 举报

15#
ID:71665 发表于 2018-1-31 00:28 | 只看该作者
正需要,请看看,谢谢
回复

使用道具 举报

16#
ID:276663 发表于 2018-1-31 10:12 | 只看该作者
厉害了,我的哥,我一直在想图像识别怎么用STM32
回复

使用道具 举报

17#
ID:284246 发表于 2018-2-16 21:32 | 只看该作者
谢谢分享
回复

使用道具 举报

18#
ID:171370 发表于 2018-2-19 21:52 | 只看该作者
谢谢分享!!!!
回复

使用道具 举报

19#
ID:242969 发表于 2018-2-21 16:09 | 只看该作者

谢谢分享!!!!
回复

使用道具 举报

20#
ID:210395 发表于 2018-3-1 12:36 | 只看该作者
求电路图   大神
回复

使用道具 举报

21#
ID:284640 发表于 2018-3-1 23:30 | 只看该作者
哈哈 不错啊
回复

使用道具 举报

22#
ID:294978 发表于 2018-3-21 12:53 | 只看该作者
非常需要。谢谢
回复

使用道具 举报

23#
ID:292142 发表于 2018-4-8 11:43 | 只看该作者
有没有下载使用过的,能运行吗。
回复

使用道具 举报

24#
ID:304508 发表于 2018-4-9 15:49 | 只看该作者
感谢分享
回复

使用道具 举报

25#
ID:175067 发表于 2018-4-9 23:45 | 只看该作者
这可真是,谢谢分享
回复

使用道具 举报

26#
ID:307302 发表于 2018-4-13 14:16 | 只看该作者
谢谢分享,真厉害
回复

使用道具 举报

27#
ID:308647 发表于 2018-4-15 16:29 | 只看该作者
下载不了
回复

使用道具 举报

28#
ID:195811 发表于 2018-4-15 17:24 | 只看该作者
什么摄像头
回复

使用道具 举报

29#
ID:292119 发表于 2018-5-15 10:57 | 只看该作者
谢谢分享
回复

使用道具 举报

30#
ID:341045 发表于 2018-5-30 01:25 | 只看该作者
感谢分享
回复

使用道具 举报

31#
ID:301472 发表于 2018-5-31 16:25 | 只看该作者
这个程序main函数里的几个while怎么执行的   有没有人说下

评分

参与人数 1黑币 +4 收起 理由
wenzedong + 4 我也想知道,而且不大清楚实现到什么程度了

查看全部评分

回复

使用道具 举报

32#
ID:189711 发表于 2018-6-27 20:52 | 只看该作者
大牛厉害
回复

使用道具 举报

33#
ID:160072 发表于 2018-8-10 13:50 | 只看该作者
厉害哦 不知道在变化环境 稳定不
回复

使用道具 举报

34#
ID:160072 发表于 2018-8-27 15:30 | 只看该作者
借鉴一下 感谢感谢!
回复

使用道具 举报

35#
ID:191877 发表于 2018-8-30 00:23 | 只看该作者
用OpenCV做了一个车牌
回复

使用道具 举报

36#
ID:378004 发表于 2018-10-5 23:23 | 只看该作者
DARIUS 发表于 2017-9-1 09:17
**** 作者被禁止或删除 内容自动屏蔽 ****

用的是什么板
回复

使用道具 举报

37#
ID:337189 发表于 2018-10-6 10:11 | 只看该作者
谢谢分享
回复

使用道具 举报

38#
ID:400629 发表于 2018-10-6 13:42 来自手机 | 只看该作者
优秀啊
回复

使用道具 举报

39#
ID:407043 发表于 2018-10-9 15:27 | 只看该作者
下载不了啊。。。
回复

使用道具 举报

40#
ID:269672 发表于 2018-10-12 14:21 | 只看该作者
楼主的程序需要用到摄像头吗?程序里面没有开到有摄像头呢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表