久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5593|回復: 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, 下載次數: 145)
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品久久一区 | 国产成人在线观看免费 | 日本亚洲欧美 | 99热国产免费 | 欧美久久国产精品 | 一级毛片视频在线观看 | 亚洲精品免费看 | 一区二区三区四区不卡视频 | 精品一级| h片在线看 | 91精品国产91久久久久久吃药 | 天天插天天狠天天透 | 午夜精品视频 | 欧美涩 | 美日韩免费视频 | 久久精品这里 | 国产成在线观看免费视频 | 欧美影院 | 人人干人人干人人 | 欧美日韩成人在线 | 亚洲欧美视频一区二区 | 综合久久久| 国产精品久久久久久久久久久免费看 | www日日日 | 成人久久久 | 日韩av黄色 | 中文字幕一区在线 | 在线视频中文字幕 | 久久69精品久久久久久久电影好 | 亚洲三区视频 | 精品视频一区二区三区在线观看 | 色黄爽 | 精品视频一区二区三区在线观看 | 久久久成人精品 | 91久久国产综合久久 | 91在线最新| 中文字幕一区二区三区乱码在线 | 国产一区二区高清在线 | 欧美a在线 | 国产精品久久久久aaaa樱花 | 国产精品亚洲成在人线 |