找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STM32+ov7670颜色识别追踪程序

[复制链接]
跳转到指定楼层
楼主
ID:591762 发表于 2019-7-29 12:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include "sys.h"
  2. #include "ov7670.h"
  3. #include "ov7670cfg.h"
  4. #include "timer.h"          
  5. #include "delay.h"
  6. #include "usart.h"                         
  7. #include "sccb.h"       
  8. #include "exti.h"
  9.             
  10. //初始化OV7670
  11. //返回0:成功
  12. //返回其他值:错误代码
  13. u8 temp;
  14. u8 OV7670_Init(void)
  15. {
  16.         //u8 temp;
  17.         u16 i=0;          
  18.         //设置IO
  19.         GPIO_InitTypeDef  GPIO_InitStructure;
  20.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOG|RCC_APB2Periph_AFIO, ENABLE);         //使能相关端口时钟

  21.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8;         //PA8 输入 上拉
  22.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  23.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  24.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  25.         GPIO_SetBits(GPIOA,GPIO_Pin_8);
  26.        
  27.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8;         //PB8
  28.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  29.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  30.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  31.         //GPIO_ResetBits(GPIOB,GPIO_Pin_8);
  32. delay_ms(5);
  33.         GPIO_SetBits(GPIOB,GPIO_Pin_8);
  34.                
  35.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4;                                 // 端口配置
  36.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  37.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  38.         GPIO_SetBits(GPIOB,GPIO_Pin_3|GPIO_Pin_4);       

  39.        
  40.         GPIO_InitStructure.GPIO_Pin  = 0xff; //PC0~7 输入 上拉
  41.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  42.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  43.          
  44.        
  45.   GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_6;  
  46.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  47.         GPIO_Init(GPIOD, &GPIO_InitStructure);
  48.         GPIO_SetBits(GPIOD,GPIO_Pin_6);
  49.        
  50.         GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_14|GPIO_Pin_15;  
  51.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  52.         GPIO_Init(GPIOG, &GPIO_InitStructure);
  53.         GPIO_SetBits(GPIOG,GPIO_Pin_14|GPIO_Pin_15);
  54.        
  55.     GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);        //SWD

  56.         SCCB_Init();                        //初始化SCCB 的IO口                     
  57.         if(SCCB_WR_Reg(0x12,0x80))return 1;        //复位SCCB          
  58.           
  59.         //读取产品型号
  60.         temp=SCCB_RD_Reg(0x0b);   
  61.         if(temp!=0x73)return 2;  
  62.         temp=SCCB_RD_Reg(0x0a);   
  63.         if(temp!=0x76)return 2;
  64.         //delay_ms(50);
  65.         //初始化序列          
  66.         for(i=0;i<sizeof(ov7670_init_reg_tbl)/sizeof(ov7670_init_reg_tbl[0]);i++)
  67.         {
  68.                    SCCB_WR_Reg(ov7670_init_reg_tbl[i][0],ov7670_init_reg_tbl[i][1]);
  69.           }
  70.            return 0x00;         //ok
  71. }
  72. ////////////////////////////////////////////////////////////////////////////
  73. //OV7670功能设置
  74. //白平衡设置
  75. //0:自动
  76. //1:太阳sunny
  77. //2,阴天cloudy
  78. //3,办公室office
  79. //4,家里home
  80. void OV7670_Light_Mode(u8 mode)
  81. {
  82.         u8 reg13val=0XE7;//默认就是设置为自动白平衡
  83.         u8 reg01val=0;
  84.         u8 reg02val=0;
  85.         switch(mode)
  86.         {
  87.                 case 1://sunny
  88.                         reg13val=0XE5;
  89.                         reg01val=0X5A;
  90.                         reg02val=0X5C;
  91.                         break;       
  92.                 case 2://cloudy
  93.                         reg13val=0XE5;
  94.                         reg01val=0X58;
  95.                         reg02val=0X60;
  96.                         break;       
  97.                 case 3://office
  98.                         reg13val=0XE5;
  99.                         reg01val=0X84;
  100.                         reg02val=0X4c;
  101.                         break;       
  102.                 case 4://home
  103.                         reg13val=0XE5;
  104.                         reg01val=0X96;
  105.                         reg02val=0X40;
  106.                         break;       
  107.         }
  108.         SCCB_WR_Reg(0X13,reg13val);//COM8设置
  109.         SCCB_WR_Reg(0X01,reg01val);//AWB蓝色通道增益
  110.         SCCB_WR_Reg(0X02,reg02val);//AWB红色通道增益
  111. }                                  
  112. //色度设置
  113. //0:-2
  114. //1:-1
  115. //2,0
  116. //3,1
  117. //4,2
  118. void OV7670_Color_Saturation(u8 sat)
  119. {
  120.         u8 reg4f5054val=0X80;//默认就是sat=2,即不调节色度的设置
  121.         u8 reg52val=0X22;
  122.         u8 reg53val=0X5E;
  123.         switch(sat)
  124.         {
  125.                 case 0://-2
  126.                         reg4f5054val=0X40;           
  127.                         reg52val=0X11;
  128.                         reg53val=0X2F;                  
  129.                         break;       
  130.                 case 1://-1
  131.                         reg4f5054val=0X66;            
  132.                         reg52val=0X1B;
  133.                         reg53val=0X4B;          
  134.                         break;       
  135.                 case 3://1
  136.                         reg4f5054val=0X99;          
  137.                         reg52val=0X28;
  138.                         reg53val=0X71;          
  139.                         break;       
  140.                 case 4://2
  141.                         reg4f5054val=0XC0;          
  142.                         reg52val=0X33;
  143.                         reg53val=0X8D;          
  144.                         break;       
  145.         }
  146.         SCCB_WR_Reg(0X4F,reg4f5054val);        //色彩矩阵系数1
  147.         SCCB_WR_Reg(0X50,reg4f5054val);        //色彩矩阵系数2
  148.         SCCB_WR_Reg(0X51,0X00);                        //色彩矩阵系数3  
  149.         SCCB_WR_Reg(0X52,reg52val);                //色彩矩阵系数4
  150.         SCCB_WR_Reg(0X53,reg53val);                //色彩矩阵系数5
  151.         SCCB_WR_Reg(0X54,reg4f5054val);        //色彩矩阵系数6  
  152.         SCCB_WR_Reg(0X58,0X9E);                        //MTXS
  153. }
  154. //亮度设置
  155. //0:-2
  156. //1:-1
  157. //2,0
  158. //3,1
  159. //4,2
  160. void OV7670_Brightness(u8 bright)
  161. {
  162.         u8 reg55val=0X00;//默认就是bright=2
  163.           switch(bright)
  164.         {
  165.                 case 0://-2
  166.                         reg55val=0XB0;                  
  167.                         break;       
  168.                 case 1://-1
  169.                         reg55val=0X98;                  
  170.                         break;       
  171.                 case 3://1
  172.                         reg55val=0X18;                  
  173.                         break;       
  174.                 case 4://2
  175.                         reg55val=0X30;                  
  176.                         break;       
  177.         }
  178.         SCCB_WR_Reg(0X55,reg55val);        //亮度调节
  179. }
  180. //对比度设置
  181. //0:-2
  182. //1:-1
  183. //2,0
  184. //3,1
  185. //4,2
  186. void OV7670_Contrast(u8 contrast)
  187. {
  188.         u8 reg56val=0X40;//默认就是contrast=2
  189.           switch(contrast)
  190.         {
  191.                 case 0://-2
  192.                         reg56val=0X30;                  
  193.                         break;       
  194.                 case 1://-1
  195.                         reg56val=0X38;                  
  196.                         break;       
  197.                 case 3://1
  198.                         reg56val=0X50;                  
  199.                         break;       
  200.                 case 4://2
  201.                         reg56val=0X60;                  
  202.                         break;       
  203.         }
  204.         SCCB_WR_Reg(0X56,reg56val);        //对比度调节
  205. }
  206. //特效设置
  207. //0:普通模式   
  208. //1,负片
  209. //2,黑白   
  210. //3,偏红色
  211. //4,偏绿色
  212. //5,偏蓝色
  213. //6,复古            
  214. void OV7670_Special_Effects(u8 eft)
  215. {
  216.         u8 reg3aval=0X04;//默认为普通模式
  217.         u8 reg67val=0XC0;
  218.         u8 reg68val=0X80;
  219.         switch(eft)
  220.         {
  221.                 case 1://负片
  222.                         reg3aval=0X24;
  223.                         reg67val=0X80;
  224.                         reg68val=0X80;
  225.                         break;       
  226.                 case 2://黑白
  227.                         reg3aval=0X14;
  228.                         reg67val=0X80;
  229.                         reg68val=0X80;
  230.                         break;       
  231.                 case 3://偏红色
  232.                         reg3aval=0X14;
  233.                         reg67val=0Xc0;
  234.                         reg68val=0X80;
  235.                         break;       
  236.                 case 4://偏绿色
  237.                         reg3aval=0X14;
  238.                         reg67val=0X40;
  239.                         reg68val=0X40;
  240.                         break;       
  241.                 case 5://偏蓝色
  242.                         reg3aval=0X14;
  243.                         reg67val=0X80;
  244.                         reg68val=0XC0;
  245.                         break;       
  246.                 case 6://复古
  247.                         reg3aval=0X14;
  248.                         reg67val=0XA0;
  249.                         reg68val=0X40;
  250.                         break;         
  251.         }
  252.         SCCB_WR_Reg(0X3A,reg3aval);//TSLB设置
  253.         SCCB_WR_Reg(0X68,reg67val);//MANU,手动U值
  254.         SCCB_WR_Reg(0X67,reg68val);//MANV,手动V值
  255. }       
  256. //设置图像输出窗口
  257. //对QVGA设置。
  258. void OV7670_Window_Set(u16 sx,u16 sy,u16 width,u16 height)
  259. {
  260.         u16 endx;
  261.         u16 endy;
  262.         u8 temp;
  263.         endx=sx+width*2;        //V*2
  264.         endy=sy+height*2;
  265.         if(endy>784)endy-=784;
  266.         temp=SCCB_RD_Reg(0X03);                                //读取Vref之前的值
  267.         temp&=0XF0;
  268.         temp|=((endx&0X03)<<2)|(sx&0X03);
  269.         SCCB_WR_Reg(0X03,temp);                                //设置Vref的start和end的最低2位
  270.         SCCB_WR_Reg(0X19,sx>>2);                        //设置Vref的start高8位
  271.         SCCB_WR_Reg(0X1A,endx>>2);                        //设置Vref的end的高8位

  272.         temp=SCCB_RD_Reg(0X32);                                //读取Href之前的值
  273.         temp&=0XC0;
  274.         temp|=((endy&0X07)<<3)|(sy&0X07);
  275.         SCCB_WR_Reg(0X17,sy>>3);                        //设置Href的start高8位
  276.         SCCB_WR_Reg(0X18,endy>>3);                        //设置Href的end的高8位
  277. }


复制代码

  1. #include "delay.h"

  2. #include "sys.h"
  3. #include "lcd.h"
  4. #include "usart.h"         
  5. #include "string.h"
  6. #include "ov7670.h"
  7. #include "timer.h"
  8. #include "exti.h"
  9. #include "ColorTracer.h"



  10. const u8*LMODE_TBL[5]={"Auto","Sunny","Cloudy","Office","Home"};                                                        //5种光照模式            
  11. const u8*EFFECTS_TBL[7]={"Normal","Negative","B&W","Redish","Greenish","Bluish","Antique"};        //7种特效
  12. extern u8 ov_sta;        //在exit.c里 面定义
  13. extern u8 ov_frame;        //在timer.c里面定义        
  14. extern volatile uint8_t Ov7725_Vsync;
  15. //更新LCD显示
  16. u8 R,G,B;
  17. void camera_refresh(void)
  18. {
  19.         u32 j;
  20.          u16 color;         
  21.         if(ov_sta)//有帧中断更新?
  22.         {
  23.                 LCD_Scan_Dir(U2D_L2R);                //从上到下,从左到右  
  24.                 if(lcddev.id==0X1963)LCD_Set_Window((lcddev.width-240)/2,(lcddev.height-320)/2,240,320);//将显示区域设置到屏幕中央
  25.                 else if(lcddev.id==0X5510||lcddev.id==0X5310)LCD_Set_Window((lcddev.width-320)/2,(lcddev.height-240)/2,320,240);//将显示区域设置到屏幕中央
  26.                 LCD_WriteRAM_Prepare();     //开始写入GRAM        
  27.                 OV7670_RRST=0;                                //开始复位读指针
  28.                 OV7670_RCK_L;
  29.                 OV7670_RCK_H;
  30.                 OV7670_RCK_L;
  31.                 OV7670_RRST=1;                                //复位读指针结束
  32.                 OV7670_RCK_H;
  33.                 for(j=0;j<76800;j++)
  34.                 {
  35.                         OV7670_RCK_L;
  36.                         color=GPIOC->IDR&0XFF;        //读数据
  37.                         OV7670_RCK_H;
  38.                         color<<=8;  
  39.                         OV7670_RCK_L;
  40.                         color|=GPIOC->IDR&0XFF;        //读数据
  41.                         OV7670_RCK_H;
  42.                         LCD->LCD_RAM=color;
  43.                 }                                                            
  44.                  ov_sta=0;                                        //清零帧中断标记
  45.                 LCD_Scan_Dir(DFT_SCAN_DIR);        //恢复默认扫描方向
  46.         }
  47. }           

  48. u8 i=0;        
  49. int main(void)
  50. {         
  51.         u8 lightmode=0,saturation=2,brightness=2,contrast=2;
  52.         u8 effect=0;         
  53.         delay_init();                     //延时函数初始化         
  54.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  55.         uart_init(921600);                 //串口初始化为 115200        
  56.         LCD_Init();                                           //初始化LCD  


  57.   
  58.         while(OV7670_Init())//初始化OV7670
  59.         {
  60.                 LCD_ShowString(30,230,200,16,16,"OV7670 Error!!");
  61.                 delay_ms(200);
  62.             LCD_Fill(30,230,239,246,WHITE);
  63.                 delay_ms(200);
  64.         }
  65.         POINT_COLOR=RED;
  66.          LCD_ShowString(30,230,200,16,16,"OV7670 Init OK");
  67.         delay_ms(1500);                    
  68.         OV7670_Light_Mode(lightmode);
  69.         OV7670_Color_Saturation(saturation);
  70.         OV7670_Brightness(brightness);
  71.         OV7670_Contrast(contrast);
  72.          OV7670_Special_Effects(effect);         
  73.         TIM6_Int_Init(10000,7199);                        //10Khz计数频率,1秒钟中断                                                                          
  74.         EXTI8_Init();                                                //使能定时器捕获
  75.         OV7670_Window_Set(12,176,240,320);        //设置窗口         
  76.           OV7670_CS=0;                                       
  77.         LCD_Clear(BLACK);
  78.          while(1)
  79.         {        
  80.                         camera_refresh();//更新显示
  81.                         
  82.                         if(Ov7725_Vsync == 2)
  83.                         {
  84.                                 Ov7725_Vsync = 0;
  85.                                 
  86.                                         switch(i)
  87.                                         {
  88.                                                 case 0:
  89.                                                         if(Trace(&condition0, &result))
  90.                                                         {
  91.                                                                 LCD_DrawRectangle ( result.x-result.w/2, result.y-result.h/2, result.x+result.w/2, result.y+result.h/2);
  92.                                                                 printf("绿色");
  93.                                                         }
  94.                                                         else
  95.                                                         {
  96.                                                                 i = 1;
  97.                                                         }
  98.                                                                 break;
  99.                                                 case 1:
  100.                                                         if(Trace(&condition1, &result))
  101.                                                         {
  102.                                                                 LCD_DrawRectangle ( result.x-result.w/2, result.y-result.h/2, result.x+result.w/2, result.y+result.h/2);
  103.                                                                 printf("蓝色");
  104.                                                         }
  105.                                                         else
  106.                                                         {
  107.                                                                 i = 2;
  108.                                                         }
  109.                                                         break;
  110.                                                 case 2:
  111.                                                         if(Trace(&condition2, &result))
  112.                                                         {
  113.                                                                 LCD_DrawRectangle ( result.x-result.w/2, result.y-result.h/2, result.x+result.w/2, result.y+result.h/2);
  114.                                                                 printf("紫色");
  115.                                                         }
  116.                                                         else
  117.                                                         {
  118.                                                                 i = 3;
  119.                                                         }
  120.                                                         break;
  121.                                                 case 3:
  122.                                                         if(Trace(&condition3, &result))
  123.                                                         {
  124.                                                                 LCD_DrawRectangle ( result.x-result.w/2, result.y-result.h/2, result.x+result.w/2, result.y+result.h/2);
  125.                                                                 printf("黑色");
  126.                                                         }
  127.                                                         else
  128.                                                         {
  129.                                                                 i = 4;
  130.                                                         }
  131.                                                         break;
  132.                                                 case 4:
  133.                                                         if(Trace(&condition4, &result))
  134.                                                         {
  135.                                                                 LCD_DrawRectangle ( result.x-result.w/2, result.y-result.h/2, result.x+result.w/2, result.y+result.h/2);
  136.                                                                 printf("橙色");
  137.                                                         }
  138.                                                         else
  139.                                                         {
  140.                                                                 i = 5;
  141.                                                         }
  142.                                                         break;
  143.                                                 case 5:
  144.                                                         if(Trace(&condition5, &result))
  145.                                                         {
  146.                                                                 LCD_DrawRectangle ( result.x-result.w/2, result.y-result.h/2, result.x+result.w/2, result.y+result.h/2);
  147.                                                 
  148.                                                                 printf("黄色");
  149.                                                         }
  150.                                                         else
  151.                                                         {
  152.                                                                 i = 6;
  153.                                                         }
  154.                                                         break;
  155.                                                 case 6:
  156.                                                         if(Trace(&condition6, &result))
  157.                                                         {
  158.                                                                 LCD_DrawRectangle ( result.x-result.w/2, result.y-result.h/2, result.x+result.w/2, result.y+result.h/2);
  159.                                                                 printf("棕色");
  160.                                                         }
  161.                                                         else
  162.                                                         {
  163.                                                                 i = 8;
  164.                                                         }
  165.                                                         break;
  166. //                                                case 7:
  167. //                                                        if(Trace(&condition7, &result))
  168. //                                                        {
  169. //                                                                LCD_DrawRectangle ( result.x-result.w/2, result.y-result.h/2, result.x+result.w/2, result.y+result.h/2);
  170. //                                                                //k = 1;
  171. //                                                        }
  172. //                                                        else
  173. //                                                        {
  174. //                                                                i = 8;
  175. //                                                        }
  176. //                                                        break;
  177.                                                 case 8:
  178.                                                         if(Trace(&condition8, &result))
  179.                                                         {
  180.                                                                 LCD_DrawRectangle ( result.x-result.w/2, result.y-result.h/2, result.x+result.w/2, result.y+result.h/2);
  181.                                                                 //k = 1;
  182.                                                                 printf("红色");
  183.                                                         }
  184.                                                         else
  185.                                                         {
  186.                                                                 i = 0;
  187.                                                         }
  188.                                                         break;
  189.                                                         
  190.                                        
  191.                                 }
  192.                                        
  193.                                 
  194.                         }
  195.                         
  196.         }           
  197. }
复制代码


全部资料51hei下载地址:
颜色识别追踪.7z (231.66 KB, 下载次数: 144)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:835435 发表于 2022-4-13 13:34 | 只看该作者
怎么没人回复大佬
回复

使用道具 举报

板凳
ID:310441 发表于 2022-4-13 20:55 来自手机 | 只看该作者
是否能介绍一下颜色追踪的思路啊?
回复

使用道具 举报

地板
ID:955668 发表于 2022-4-20 10:38 | 只看该作者
楼主,能讲解一下颜色识别的思路吗,感激不尽
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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