找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 10502|回復(fù): 3
收起左側(cè)

OV7670攝像頭實(shí)驗(yàn),任意窗口輸出,灰度輸出

[復(fù)制鏈接]
ID:223055 發(fā)表于 2017-8-9 17:06 | 顯示全部樓層 |閱讀模式
1.實(shí)驗(yàn)描述:
通過(guò)config_ov7670_OutPut(u16 xsta,u16 ysta,u16 width,u16 height,u8 ouput_mode)可以設(shè)置攝像頭顯示圖片的位置,窗口的大小,顯示的模式(彩色還是灰度)。

2.說(shuō)明:
  灰度輸出:將攝像頭設(shè)置輸出為YUV格式(YUYV輸出,意思就是第一個(gè)字節(jié)是Y,第二個(gè)字節(jié)是U,第三個(gè)字節(jié)是Y,第四個(gè)字節(jié)是V輪流輸出),取Y分量,去掉U,V,并將Y分量轉(zhuǎn)換為RGB565就可以顯示灰度圖像了。

3.如何提高幀數(shù):
  a:提高攝像頭輸出的幀數(shù)
  當(dāng)ov_sta==2的時(shí)候們才開始顯示圖像。如果攝像頭能輸出30FPS,那么在液晶顯示速度足夠的情況下,最多只能顯示15FPS,所以想要提高顯示幀率可以提高攝像頭輸出的幀率。
  這里有一個(gè)公式:1s=510*784*2*2*PCLK*攝像頭輸出幀數(shù)。(至于原理可以看下時(shí)序圖) 。這里初始化的代碼設(shè)置的像素輸出時(shí)鐘PCLK為48MHZ,所以我們只能輸出30FPS,可以通過(guò)設(shè)置0x6b將PCLK的時(shí)鐘設(shè)置為96MHZ(最高了,外部輸入時(shí)鐘為12MHZ 這了8倍頻),那么就可以輸出60FPS,就可以提高顯示的幀率了。
  b:送數(shù)據(jù)的顯示速度,例如 用FSMC控制液晶,快速IO,移位等等。

4.如何調(diào)試:
利用usmart調(diào)試攝像頭很方便的哦, 將函數(shù)config_ov7670_OutPut(u16 xsta,u16 ysta,u16 width,u16 height,u8 ouput_mode)和SCCB_WR_Reg(u8 reg,u8 data)添加到usmart_config.c文件就好了^_^


源程序:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "lcd.h"
  6. #include "usart.h"         
  7. #include "string.h"
  8. #include "ov7670.h"
  9. #include "tpad.h"
  10. #include "timer.h"
  11. #include "exti.h"
  12. #include "usmart.h"

  13. extern u8 ov_sta;        //在exit.c里面定義
  14. extern u8 ov_frame;        //在timer.c里面定義       
  15. extern u8 data_ready;       

  16. u16 color_r;
  17. u16 color_g;
  18. u16 color_b;




  19. //設(shè)置CPU的頻率
  20. void ov7670_clock_set(u8 PLL)
  21. {
  22.         u8 temp=0;          
  23.         RCC->CFGR&=0XFFFFFFFC;       
  24.         RCC->CR&=~0x01000000;            
  25.         RCC->CFGR&=~(0XF<<18);       
  26.         PLL-=2;//抵消2個(gè)單位
  27.         RCC->CFGR|=PLL<<18;          
  28.         RCC->CFGR|=1<<16;                  //PLLSRC ON  
  29.         FLASH->ACR|=0x12;          
  30.         RCC->CR|=0x01000000;          //PLLON
  31.         while(!(RCC->CR>>25));       
  32.         RCC->CFGR|=0x02;       
  33.         while(temp!=0x02)     
  34.         {   
  35.                 temp=RCC->CFGR>>2;
  36.                 temp&=0x03;
  37.         }   
  38. }

  39. //更新LCD顯示
  40. void camera_refresh()
  41. {
  42.         u32 i,j;
  43.         u16 color;
  44.         if(ov_sta==2)
  45.         {
  46.                 LCD_Scan_Dir(U2D_L2R);                //從上到下,從左到右
  47.                 LCD_SetCursor(0x00,0x0000);        //設(shè)置光標(biāo)位置
  48.                 LCD_WriteRAM_Prepare();     //開始寫入GRAM       
  49.                 OV7670_RRST=0;                                //開始復(fù)位讀指針
  50.                 OV7670_RCK_L;
  51.                 OV7670_RCK_H;
  52.                 OV7670_RCK_L;
  53.                 OV7670_RRST=1;                                //復(fù)位讀指針結(jié)束
  54.                 OV7670_RCK_H;  
  55.                 if(ov7670_config.mode){
  56.                         for(i=0; i<ov7670_config.height; i++)
  57.                         {
  58.                         //        LCD_SetCursor(i+ov7670_config.xsta,ov7670_config.ysta);        //設(shè)置光標(biāo)位置
  59.                         //        LCD_WriteRAM_Prepare();     //開始寫入GRAM       
  60.                                 for(j=0; j<ov7670_config.width; j++)
  61.                                 {
  62.                                         OV7670_RCK_L;
  63.                                         color = GPIOC->IDR&0XFF;        //讀數(shù)據(jù)
  64.                                         OV7670_RCK_H;
  65.                                        
  66.                                         color<<=8;
  67.                                         OV7670_RCK_L;//因?yàn)樵O(shè)置的是 YUYV輸出,第二個(gè)字節(jié)沒用,不需要讀
  68.                                 //        color |= GPIOC->IDR&0XFF;        //
  69.                                         OV7670_RCK_H;
  70.                                        
  71.                                        
  72.                                         color_r = color&0xf800;
  73.                                         color_b = color>>11;
  74.                                         color >>=5;
  75.                                         color_g =color&0x07e0;
  76.                                        
  77.                                         LCD->LCD_RAM= color_r + color_g + color_b;   
  78.                                 }
  79.          
  80.                         }
  81.                 }else{
  82.                         for(i=0; i<ov7670_config.height; i++)
  83.                         {
  84.                         //        LCD_SetCursor(i+ov7670_config.xsta,ov7670_config.ysta);        //設(shè)置光標(biāo)位置
  85.                         //        LCD_WriteRAM_Prepare();     //開始寫入GRAM       
  86.                                 for(j=0; j<ov7670_config.width; j++)
  87.                                 {
  88.                                         OV7670_RCK_L;
  89.                                         color = GPIOC->IDR&0XFF;        //讀數(shù)據(jù)
  90.                                         OV7670_RCK_H;
  91.                                        
  92.                                         color<<=8;
  93.                                         OV7670_RCK_L;
  94.                                         color |= GPIOC->IDR&0XFF;        //讀數(shù)據(jù)
  95.                                         OV7670_RCK_H;
  96.                                        
  97.                                         LCD->LCD_RAM=color;   
  98.                                 }
  99.          
  100.                         }
  101.                 }               
  102.                 EXTI_ClearITPendingBit(EXTI_Line8);  //清除LINE8上的中斷標(biāo)志位
  103.                 ov_sta=0;                                        //開始下一次采集
  104.                 ov_frame++;
  105.           LCD_Scan_Dir(DFT_SCAN_DIR);        //恢復(fù)默認(rèn)掃描方向
  106.         }
  107. }       


  108. int main(void)
  109. {         
  110.         delay_init();                     //延時(shí)函數(shù)初始化          
  111.         NVIC_Configuration();          //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
  112.         uart_init(9600);                 //串口初始化為9600
  113.         LED_Init();                             //LED端口初始化
  114.         LCD_Init();       
  115.         KEY_Init();                
  116.         TPAD_Init(72);                        //觸摸按鍵初始化
  117.         usmart_dev.init(72);        //初始化USMART                            
  118.         POINT_COLOR=RED;//設(shè)置字體為紅色
  119.         LCD_ShowString(60,50,200,16,16,"WarShip STM32");       
  120.         LCD_ShowString(60,70,200,16,16,"OV7670 TEST");       
  121.         LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
  122.         LCD_ShowString(60,110,200,16,16,"2012/9/14");           
  123.           LCD_ShowString(60,130,200,16,16,"OV7670 Init...");          
  124.         while(OV7670_Init())//初始化OV7670
  125.         {
  126.                 LCD_ShowString(60,130,200,16,16,"OV7670 Error!!");
  127.                 delay_ms(200);
  128.             LCD_Fill(60,130,239,246,WHITE);
  129.                 delay_ms(200);
  130.         }
  131.         LCD_ShowString(60,130,200,16,16,"OV7670 Init OK");
  132.           

  133.        
  134.         TIM6_Int_Init(10000,7199);                        //10Khz計(jì)數(shù)頻率,1秒鐘中斷                                                                          
  135.         EXTI8_Init();                                                //使能定時(shí)器捕獲
  136.           OV7670_CS=0;                       
  137.        
  138.         config_ov7670_OutPut(20,60,320,240,1);

  139.         while(1)
  140.         {       
  141.                 camera_refresh();//更新顯示
  142.         }
  143. }

復(fù)制代碼
源碼以及參考的文檔見附件:

攝像頭實(shí)驗(yàn)(彩色,灰度,任意窗口).rar (359.28 KB, 下載次數(shù): 126)
ov7670攝像頭分辨率設(shè)置方法詳解:
http://www.torrancerestoration.com/bbs/dpj-92272-1.html




回復(fù)

使用道具 舉報(bào)

ID:583148 發(fā)表于 2019-7-21 09:41 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:545992 發(fā)表于 2019-5-23 23:12 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:138247 發(fā)表于 2019-4-4 16:16 | 顯示全部樓層

謝謝分享。。。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表