找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 27649|回复: 41
收起左侧

ov7670摄像头循迹原理分析与stm32源码

  [复制链接]
ID:219527 发表于 2017-8-2 20:27 | 显示全部楼层 |阅读模式
摄像头循迹原理:
通过对ov7670采集的数据进 行相关寄存器配罝得到底片色(黑线为白线,白底为黑 色)处理•如图•因为寄存 器配罝的黑白色自己一直没的到自己想要的结果!然而 通过RGB565数据做相应处理后虽然得到了黑白照片,但 是存在一定开销。


0.png
采集三块像素点的数据块(每块20个像素点),如图。算法.•当2的白底个数小于13 (用于滤波的数字根据自己的定义选择)时,返回stop。当2的白大于13.且数据块1,3的黑点大于13向前。左侧检测到白线向右右俩检测到白线向左
0.png 0.png

stm32单片机源码预览:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"

  4. #include "lcd.h"
  5. #include "usart.h"         
  6. #include "ov7670.h"
  7. #include "exti.h"
  8. #include "motor.h"

  9. u8 ov_sta;        //在exit.c里面定义
  10. MOTOR GmLeft = {MOTOR_STOP,MOTOR_GOAHEAD,0,0,0};//定义并初始化左电机状态
  11. MOTOR GmRight = {MOTOR_STOP,MOTOR_GOAHEAD,0,0,0};//定义并初始化右电机状态                                                         

  12. u16 Array[60] ={
  13.          /*采集像素点矩阵【(46,150),(49,154)】 320列*/
  14.         14870,14871,14872,14873,14874,
  15.         15190,15191,15192,15193,15194,
  16.         15510,15511,15512,15513,15514,
  17.         15830,15831,15832,15833,15834,
  18.          /*采集像素点矩阵【(100,10),(104,13)】 320列*/
  19.         32010,32011,32012,32013,                        
  20.         32330,32331,32332,32333,
  21.         32650,32651,32652,32653,
  22.         32970,32971,32972,32973,
  23.         33290,33291,33292,33293,
  24.         /*采集像素点矩阵【(165,150),(168,154)】 320列  */
  25.         52950,52951,52952,52953,52954,                 
  26.         53270,53271,53272,53273,53274,
  27.         53590,53591,53592,53593,53594,
  28.         53910,53911,53912,53913,53914,

  29. };
  30. //更新LCD显示
  31. u8 camera_refresh(void)
  32. {
  33.         u32 j;
  34.         u8 k = 0;
  35.          u16 color;


  36.         u8 whitepoint = 0;
  37.         u8 leftblackpoint  = 0;
  38.         u8 rightblackpoint = 0;
  39.         u8 JudgeFlag = 0;
  40.         
  41.                  
  42.         if(ov_sta==2)
  43.         {
  44.                 LCD_Scan_Dir(U2D_L2R);                //从上到下,从左到右
  45.                 LCD_SetCursor(0x00,0x0000);        //设置光标位置
  46.                 LCD_WriteRAM_Prepare();     //开始写入GRAM        
  47.                 OV7670_RRST=0;                                //开始复位读指针
  48.                 OV7670_RCK=0;
  49.                 OV7670_RCK=1;
  50.                 OV7670_RCK=0;
  51.                 OV7670_RRST=1;                                //复位读指针结束
  52.                 OV7670_RCK=1;

  53.         
  54.         for(j=0;j<76800;j++)
  55.                 {        
  56.                         GPIOB->CRL=0X88888888;
  57.                         OV7670_RCK=0;
  58.                         color=GPIOB->IDR&0x00FF;        //读数据
  59.                         OV7670_RCK=1;
  60.                         color<<=8;  
  61.                         OV7670_RCK=0;
  62.                         color|=GPIOB->IDR&0x00FF;        //读数据
  63.                         OV7670_RCK=1;
  64.                         GPIOB->CRL=0X33333333;        
  65.                         LCD_WR_DATA(color);


  66. //                        EXTI_ClearITPendingBit(EXTI_Line15);



  67.                         if(j == Array[k]&&(k<=60))//init(k) = 0                                                                          -=
  68.                         {
  69.                                 if(k < 20)
  70.                                 {
  71.                                           
  72.                                          if(!(color&0x8000))  //检测底片  黑,如果bit15为0,则黑点
  73.                                                 leftblackpoint++;
  74.                                                 
  75.                                 }
  76.                                 else if(k < 40)
  77.                                 {
  78.                                         if(color&0x8000)
  79.                                         whitepoint++;                //测得白点
  80.                                        
  81.                                 }
  82.                                 else if(k < 60)
  83.                                 {
  84.                                                 if(!(color&0x8000))  //检测底片  黑,如果bit15为0,则黑点
  85.                                                 rightblackpoint++;
  86.                                        
  87.                                 }                                                                                                                           
  88.                         k++;
  89.                         }   
  90.                    }                                                
  91.                                 
  92.                 ov_sta=0;                                        //开始下一次采集
  93. //                LCD_Scan_Dir(DFT_SCAN_DIR);        //恢复默认扫描方向
  94.                 k=0;
  95.                 if(whitepoint<=13)            //中间端未检测到白色则停止
  96.         {
  97.                 JudgeFlag = 0;// stop
  98.         }
  99.                 else
  100.         {

  101.                 if((whitepoint>13)&&(leftblackpoint>13)&&(rightblackpoint>13))//如果左端块黑色  中端块白色 右端块黑色 则前进
  102.                 {
  103.                         JudgeFlag = 1;
  104.                 }
  105.         
  106.                 if(leftblackpoint <= 13 && rightblackpoint >13)        //左端白色 右端黑色 则向往右
  107.                 {
  108.                         JudgeFlag = 2;  //rihgt
  109.                 }

  110.                 if(leftblackpoint > 13 && rightblackpoint <= 13)        //右端白色 左端黑色 则向往左
  111.                 {
  112.                         JudgeFlag = 3;  //left
  113.                 }
  114.     }        


  115.         }

  116.          


  117.         return JudgeFlag;
  118. }               
  119. int main(void)
  120. {         
  121.         
  122.         delay_init();                     //延时函数初始化         
  123.         uart_init(9600);                 //串口初始化为9600
  124.          LED_Init();                             //LED端口初始化
  125.         LCD_Init();        
  126.         Motor_Init();
  127.                     
  128.          POINT_COLOR=RED;//设置字体为红色

  129.         LCD_ShowString(60,110,200,16,16,"OV7670 Init...");  
  130.          
  131.         while(OV7670_Init())//初始化OV7670
  132.         {
  133.                 LCD_ShowString(60,230,200,16,16,"OV7670 Error!!");
  134.                 delay_ms(200);
  135.             LCD_Fill(60,230,239,246,WHITE);
  136.                 delay_ms(200);
  137.         }
  138.          LCD_ShowString(60,110,200,16,16,"OV7670 Init OK");
  139.         delay_ms(1500);                                                                                                      
  140.         EXTI15_Init();

  141.         OV7670_Special_Effects(1);
  142.         OV7670_Light_Mode(2);

  143.         ov_sta=0;         
  144.           OV7670_CS=0;
  145.                                                                   
  146.          while(1)
  147.         {        
  148.                 u8 flag ;
  149.                 flag = camera_refresh();
  150.                 /*LED0 red \ LED1 green */
  151.                 switch(flag)
  152.                 {
  153.                         case 0:Motor_Stop();break;                                                    //0 stop
  154.                         case 1:Motor_GOStraight();delay_ms(500);break;                 //每一TIMER(20ms),走20step,
  155.                         case 2:Motor_GORight();delay_ms(500);break;                        //2 往右 左步进电机转动                                                           LED1= 1
  156.                         case 3:Motor_GOLeft();delay_ms(500);break;                        //3 往左 右步进电机转动
  157.                         default:break;
  158.                 }
  159.         }
  160. }

复制代码
全部资料下载地址:
摄像头循迹V1.0.rar (663.22 KB, 下载次数: 584)

评分

参与人数 2黑币 +15 收起 理由
高层ym + 5 很给力!
564654654 + 10 绝世好帖!

查看全部评分

回复

使用道具 举报

ID:222119 发表于 2017-8-5 16:42 | 显示全部楼层
谢谢楼主了,这对我帮助很大
回复

使用道具 举报

ID:223938 发表于 2017-8-8 19:49 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

ID:245877 发表于 2017-11-13 16:10 | 显示全部楼层
最近用ov7670做东西,lz的分享很实用
回复

使用道具 举报

ID:252949 发表于 2017-11-24 09:59 | 显示全部楼层
太好了
回复

使用道具 举报

ID:317116 发表于 2018-4-30 10:25 | 显示全部楼层
楼主,你好,很想问你一下你那个像素矩阵是怎么取的?
回复

使用道具 举报

ID:378940 发表于 2018-7-25 13:49 | 显示全部楼层
谢谢楼主了,这对我帮助很大
回复

使用道具 举报

ID:384418 发表于 2018-8-26 17:51 | 显示全部楼层
小白,,想问下采集像素点阵那部分是怎么来的
回复

使用道具 举报

ID:311200 发表于 2018-8-26 20:34 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:384418 发表于 2018-8-26 23:37 | 显示全部楼层
新视野 发表于 2018-4-30 10:25
楼主,你好,很想问你一下你那个像素矩阵是怎么取的?

你好,我也想知道这个像素矩阵的取法,想问下你现在明白了么?
回复

使用道具 举报

ID:372307 发表于 2018-10-31 11:50 | 显示全部楼层
学习了
回复

使用道具 举报

ID:372307 发表于 2018-10-31 11:51 | 显示全部楼层
最近刚好在OV7670循迹平衡车
回复

使用道具 举报

ID:418572 发表于 2018-10-31 15:52 | 显示全部楼层
谢谢楼主分享,这个对我很有用
回复

使用道具 举报

ID:362670 发表于 2018-11-1 12:16 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:423055 发表于 2018-11-13 10:14 | 显示全部楼层
谢谢楼主的分享
回复

使用道具 举报

ID:454808 发表于 2018-12-29 16:12 | 显示全部楼层
你们好厉害
回复

使用道具 举报

ID:486178 发表于 2019-3-7 13:11 | 显示全部楼层
学习学习
回复

使用道具 举报

ID:383112 发表于 2019-3-16 18:45 | 显示全部楼层
不需要二值化吗
回复

使用道具 举报

ID:411101 发表于 2019-3-22 17:23 | 显示全部楼层
谢谢楼主,不过有几个问题想问一下,如果在直线检测中加入图像颜色识别该怎么办
回复

使用道具 举报

ID:411101 发表于 2019-3-22 17:23 | 显示全部楼层
谢谢楼主,,正好需要
回复

使用道具 举报

ID:139042 发表于 2019-4-2 08:44 | 显示全部楼层
谢谢楼主了,这对我帮助很大
回复

使用道具 举报

ID:430197 发表于 2019-4-2 12:11 | 显示全部楼层
很有用,谢谢分享
回复

使用道具 举报

ID:138247 发表于 2019-4-4 16:41 | 显示全部楼层

谢谢分享。。。。。。
回复

使用道具 举报

ID:428381 发表于 2019-4-20 21:51 | 显示全部楼层
新视野 发表于 2018-4-30 10:25
楼主,你好,很想问你一下你那个像素矩阵是怎么取的?

看哪块顺眼取哪块,了解每个点在哪里就行了
回复

使用道具 举报

ID:470307 发表于 2019-5-16 16:45 | 显示全部楼层
感谢分享  学习学习!
回复

使用道具 举报

ID:152715 发表于 2019-5-20 10:23 | 显示全部楼层
不错,学习下
回复

使用道具 举报

ID:489285 发表于 2019-6-12 12:47 | 显示全部楼层
有没有循迹控制方面的内容
回复

使用道具 举报

ID:567432 发表于 2019-6-20 01:35 | 显示全部楼层
谢了,帮助很大
回复

使用道具 举报

ID:514567 发表于 2019-6-23 12:19 | 显示全部楼层
太需要了,谢谢楼主
回复

使用道具 举报

ID:282095 发表于 2019-6-23 16:45 | 显示全部楼层
里面涉及到灰度识别的相关知识
回复

使用道具 举报

ID:563173 发表于 2019-7-24 09:42 | 显示全部楼层
谢谢楼主,很有帮助
回复

使用道具 举报

ID:319023 发表于 2019-7-24 13:20 | 显示全部楼层
这资料太好了,很给力
回复

使用道具 举报

ID:600388 发表于 2019-8-16 11:54 | 显示全部楼层
谢谢楼主,采集像素点的矩阵是图像像素点对应lcd的位置么
回复

使用道具 举报

ID:585455 发表于 2019-8-18 23:17 | 显示全部楼层
感謝分享
回复

使用道具 举报

ID:621334 发表于 2019-10-11 20:19 | 显示全部楼层
用的单片机的具体型号可以给一下吗
回复

使用道具 举报

ID:595688 发表于 2019-10-15 20:52 | 显示全部楼层
楼主有电路原理图么?
回复

使用道具 举报

ID:419247 发表于 2019-10-16 19:14 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

ID:595688 发表于 2019-10-30 09:56 | 显示全部楼层
你这个不需要二值化么?
回复

使用道具 举报

ID:664043 发表于 2019-12-28 09:48 | 显示全部楼层
谢了,帮助很大
回复

使用道具 举报

ID:733136 发表于 2020-4-19 23:25 | 显示全部楼层
谢谢楼主了 对我帮助很大
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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