找回密码
 立即注册

QQ登录

只需一步,快速开始

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

摄像头识别智能寻找中心按键触发stm32源程序

[复制链接]
跳转到指定楼层
楼主
ID:246155 发表于 2017-11-5 08:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近使用OV7670做了一个关于激光自动打靶报靶系统,不过只做了用摄像头对靶心的识别。

取样点过多

stm32单片机源程序如下:
  1. #include <stm32f10x_lib.h>
  2. #include "sys.h"
  3. #include "usart.h"               
  4. #include "delay.h"       
  5. #include "led.h"
  6. #include "key.h"
  7. #include "exti.h"
  8. #include "wdg.h"
  9. #include "timer.h"
  10. #include "lcd.h"          
  11. #include "ov7670.h"
  12. #include "usmart.h"  

  13. u16 i,shua1=0,shua2=0;          
  14. u16 aa=0,bb=0,lie=0,y=0,hang=0,x=0 ,a=0,b=0;
  15. u16 zhongxin1=0,zhongxin2=0,zhongxin3=0,zhongxin4=0;
  16. u32 u=0;
  17. extern u8 ov_sta;        //在exit.c里面定义
  18. extern u8 ov_frame;        //在timer.c里面定义       



  19. void swap (u16 *p1,u16 *p2)
  20. {
  21.    u16 temp;
  22.    temp=*p1;
  23.    *p1=*p2;
  24.    *p2=temp        ;


  25.             }
  26.          

  27. void camera_refresh(void)
  28. {
  29.         u32 j;
  30.         u16 color;         
  31.         if(ov_sta==2)
  32.         {
  33.                 LCD_Scan_Dir(U2D_L2R);                //从上到下,从左到右
  34.                 LCD_SetCursor(0x00,0x0000);        //设置光标位置
  35.                 LCD_WriteRAM_Prepare();     //开始写入GRAM       
  36.                 OV7670_CS=0;         
  37.                 OV7670_RRST=0;                                //开始复位读指针
  38.                 OV7670_RCK=0;
  39.                 OV7670_RCK=1;
  40.                 OV7670_RCK=0;
  41.                 OV7670_RRST=1;                                //复位读指针结束
  42.                 OV7670_RCK=1;  
  43.                 for(j=0;j<76800;j++)
  44.                 {
  45.                         GPIOB->CRL=0X88888888;                  
  46.                         OV7670_RCK=0;
  47.                         color=OV7670_DATA;                //读数据
  48.                         OV7670_RCK=1;        
  49.                         color<<=8;                                          
  50.                         OV7670_RCK=0;
  51.                         color|=OV7670_DATA;                //读数据                  
  52.                         OV7670_RCK=1;
  53.                         GPIOB->CRL=0X33333333;                                                          
  54.                         LCD_WR_DATA(color);         
  55.                 }  
  56.                 OV7670_CS=1;                                                          
  57.                 OV7670_RCK=0;
  58.                 OV7670_RCK=1;
  59.                 EXTI->PR=1<<15;                     //清除LINE8上的中断标志位
  60.                 ov_sta=0;                                        //开始下一次采集
  61.                 ov_frame++;
  62.                 LCD_Scan_Dir(DFT_SCAN_DIR);        //恢复默认扫描方向                                                     
  63.         }
  64. }       
  65. void  fengge (void)
  66. {
  67.        
  68.             for(bb=2;bb<230;bb++)               
  69.                        
  70.         {       
  71.        
  72.                 for(aa=0;aa<239;aa++)       
  73.                        
  74.           {       
  75.                  

  76.                   
  77.   u= (LCD_ReadPoint(20,20)+LCD_ReadPoint(21,21)+LCD_ReadPoint(22,22)+LCD_ReadPoint(23,23)+LCD_ReadPoint(220,20)+LCD_ReadPoint(221,21)+LCD_ReadPoint(222,22)+LCD_ReadPoint(223,23)+LCD_ReadPoint(20,319)+LCD_ReadPoint(21,318)+LCD_ReadPoint(22,317)+LCD_ReadPoint(23,316)+LCD_ReadPoint(220,319)+LCD_ReadPoint(221,318)+LCD_ReadPoint(222,317)+LCD_ReadPoint(223,317)  )/16;
  78.        
  79.                   
  80.                                  if((LCD_ReadPoint(aa-2,bb)<(u-10000)))
  81.                                 {
  82.                                 if((LCD_ReadPoint(aa,bb)<(u-10000)))   //白天45000
  83.                                {
  84.                                        if((LCD_ReadPoint(aa+1,bb)<(u-10000))&&(LCD_ReadPoint(aa+2,bb)<(u-10000)))
  85.                                             {
  86.                                                         POINT_COLOR=BLACK;
  87.                                                          LCD_DrawPoint(aa,bb);       
  88.                                                                          }                                                    
  89.                                                  }
  90.                                                                                                    }
  91.                                                                                                       }                                                                                                                                                                                                                                         
  92.                                                                                                              }
  93.                                                                                                                }                                 
  94.                                                               

  95. void  fanfenge(void)
  96. {
  97.           for(bb=0;bb<320;bb++)        //210                               
  98.             {               
  99.                     for(aa=0;aa<239;aa++)                               
  100.                 {                                       
  101.                                if(LCD_ReadPoint(aa,bb)>1000 )
  102.                                     {
  103.                                                 POINT_COLOR=WHITE ;
  104.                                             LCD_DrawPoint(aa,bb);       
  105.                                                                       }                                                    
  106.                                                  }                                                                                                  
  107.                                                                                                     }

  108.                 if(LCD_ReadPoint(aa-1,bb)<1000 )
  109.                 {
  110.                            if(LCD_ReadPoint(aa+1,bb)<1000 )
  111.                         {
  112.                                    POINT_COLOR=BLACK;
  113.                                 LCD_DrawPoint(aa,bb);               
  114.                                                              }
  115.                                                          }
  116.                                                                                                           
  117.                                                                                                           
  118.                                                                                                           
  119.                                                                                                            }                                                                                         
  120.                                                                                                           


  121.             

  122. void huaxin(void)
  123. {
  124.                
  125.             for(bb=80;bb<160;bb=bb+15)               
  126.                        
  127.         {       
  128.        
  129.                    lie=0;
  130.                 for(aa=0;aa<235;aa++)       
  131.                        
  132.           {       
  133.                
  134.                 /*         POINT_COLOR=RED ;
  135.                           LCD_ShowxNum(170,260,aa,8,16,0);//显示2个数字
  136.                         LCD_ShowxNum(170,280,bb,8,16,0);//显示2个数字
  137.                         LCD_ShowxNum(170,300,LCD_ReadPoint(aa,bb),8,16,0);//显示2个数字
  138.                         LCD_ShowxNum(10,300,y,8,16,0);//显示2个数字
  139.                         LCD_ShowxNum(10,260,lie,8,16,0);//显示2个数字
  140.                         LCD_ShowxNum(90,300,LCD_ReadPoint(20,20),8,16,0);//显示2个数字
  141.                         LCD_ShowxNum(90,280,LCD_ReadPoint(77,77),8,16,0);//显示2个数字
  142.                         LCD_ShowxNum(90,260,u,8,16,0);//显示2个数字                  */
  143.                                           //LCD_DrawLine(20, 20, 25, 25);          //画线

  144.                   //        if(LCD_ReadPoint(aa-3,bb)>20000)
  145.                         //    {
  146.                          //        if(LCD_ReadPoint(aa-2,bb)>20000)
  147.                         //        {
  148.                                 if((LCD_ReadPoint(aa,bb)>20000))   //白天45000
  149.                                {
  150.                                        if(LCD_ReadPoint(aa+1,bb)<(20000)&&(LCD_ReadPoint(aa+2,bb)<20000))
  151.                                             { lie++; }                                                    
  152.                                                  }
  153.                                                                                                    //}
  154.                                                                                                     //  }   
  155.                                                                                                                      
  156.                 //        if(lie>9)                                                                                                 
  157.                 //        {   y=bb; }

  158.                                 zhongxin3=lie;
  159.                                         if(zhongxin3>zhongxin4        )
  160.                                          {
  161.                                            swap(&zhongxin3,&zhongxin4);
  162.                                            y=bb;
  163.                                          
  164.                                                              }                                                                                                                                                                                                                                                                                                
  165.                                                                                         }                 
  166.                                                                                                                              }         
  167.                
  168.                                                                                                
  169.                                                                                                                        
  170.                                                                                                                        
  171.                                                                                                                        
  172.                         for(a=80;a<200;a=a+20)                                                                                                       
  173.                         {
  174.                             hang=0;
  175.                                 LED0=0;
  176.                                   for(b=0;b<230;b++)
  177.                                 {       
  178.                                 /*        POINT_COLOR=RED ;       
  179.                                          LCD_ShowxNum(170,260,a,8,16,0);//显示2个数字
  180.                              LCD_ShowxNum(170,280,b,8,16,0);//显示2个数字
  181.                             LCD_ShowxNum(170,300,LCD_ReadPoint(a,b),8,16,0);//显示2个数字
  182.                             LCD_ShowxNum(10,280,x,8,16,0);//显示2个数字
  183.                             LCD_ShowxNum(10,260,hang,8,16,0);//显示2个数字
  184.                                         LCD_ShowxNum(10,300,y,8,16,0);//显示2个数?
  185.                                         LCD_ShowxNum(90,260,u,8,16,0);//显示2个数字
  186.                                                                                                                                   */
  187.                                    if((LCD_ReadPoint(a,b-3)<(u-3000)))
  188.                                    {
  189.                                              if((LCD_ReadPoint(a,b-2)<(u-3000)))
  190.                                           {
  191.                                          if((LCD_ReadPoint(a,b)<(u-3000)))          //50000
  192.                                        {
  193.                                              if((LCD_ReadPoint(a,b+1)>(u-3000))&&(LCD_ReadPoint(a,b+2)>(u-3000)))
  194.                                                      { hang++; }       
  195.                                                                                       }
  196.                                                                                              }
  197.                                                                                                 }

  198.                                 //        if(hang>9)                                                                                                 
  199.                                  //     { x=a; }                                                                                                                                                         
  200.                                                            
  201.                                         zhongxin1=hang;
  202.                                         if(zhongxin1>zhongxin2        )
  203.                                          {
  204.                                            swap(&zhongxin1,&zhongxin2);
  205.                                            x=a;
  206.                                          
  207.                                                              }
  208.                                        
  209.                                                                   
  210.                                                                                               }                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
  211.                                                                                                                        
  212.                                                                                                                }
  213.                                                               }  


  214. int main(void)
  215. {       
  216.                
  217.            Stm32_Clock_Init(9);        //系统时钟设置
  218.         uart_init(72,9600);                 //串口初始化为9600
  219.         delay_init(72);                            //延时初始化
  220.           OV7670_Init();                                  

  221.         LED_Init();                                  //初始化与LED连接的硬件接口
  222.         LCD_Init();                                   //初始化LCD
  223.         if(lcddev.id==0X6804)         //强制设置屏幕分辨率为320*240.以支持3.5寸大屏
  224.         {
  225.                 lcddev.width=240;
  226.                 lcddev.height=320;
  227.                                     }
  228.         usmart_dev.init(72);        //初始化USMART               
  229.                             
  230.         POINT_COLOR=RED;//设置字体为红色
  231.         LCD_ShowString(60,50,200,200,16,"Mini STM32");       
  232.         LCD_ShowString(60,70,200,200,16,"OV7670 TEST");       
  233.         LCD_ShowString(60,90,200,200,16,"ATOM@ALIENTEK");
  234.         LCD_ShowString(60,110,200,200,16,"2012/10/31");           
  235.         LCD_ShowString(60,130,200,200,16,"Use USMART To Set!");         
  236.           LCD_ShowString(60,150,200,200,16,"OV7670 Init...");          
  237.         while(OV7670_Init())//初始化OV7670
  238.         {
  239.                 LCD_ShowString(60,150,200,200,16,"OV7670 Error!!");
  240.                 delay_ms(200);
  241.             LCD_Fill(60,230,239,246,WHITE);
  242.                 delay_ms(200);
  243.                                                      }
  244.         LCD_ShowString(60,150,200,200,16,"OV7670 Init OK");
  245.         delay_ms(1500);                              
  246.         Timerx_Init(10000,7199);                        //TIM3,10Khz计数频率,1秒钟中断                                                                          
  247.         EXTI15_Init();                                                //使能定时器捕获
  248.         OV7670_Window_Set(10,174,240,320);        //设置窗口          
  249.           OV7670_CS=0;                                                          
  250.         while(1)
  251.         {       
  252.                         camera_refresh();        //更新显示         
  253.                 if(i!=ov_frame)                //DS0闪烁.
  254.                 {
  255.                         i=ov_frame;
  256.                         LED0=!LED0;
  257.                 }
  258.                   if(KEY0==0)
  259.                 {
  260.             for(shua1=0;shua1<30000;shua1++)
  261.                 {       
  262.                           for(shua2=0;shua2<10;shua2++)         
  263.                         {
  264.                                  camera_refresh();         
  265.                                  if(i!=ov_frame)               
  266.                                 {i=ov_frame;}
  267.                                       }         
  268.                                                                 }
  269.          
  270.       fengge();
  271.           fanfenge();
  272.           aa=0;
  273.           bb=0;         
  274.           huaxin();                                                                                                                                        
  275.       LCD_Fill(x,y,x+5,y+5,RED);       
  276.          delay_ms(3000);
  277.      // while(1);
  278.                                                           }
  279.                                                    }   
  280.                                              
  281.                                                                                          
  282.                                                                                          
  283.                                                                                               }
复制代码

所有资料51hei提供下载:
智能寻找中心按键触发.zip (131.96 KB, 下载次数: 17)


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

使用道具 举报

沙发
ID:456780 发表于 2019-8-6 15:31 | 只看该作者
感谢楼主分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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