使用OV7725進行采集數據,顯示到LCD屏幕上面,再進行灰度處理,然后再尋找圖像分割的灰度閾值,進行圖像二值化。 關于圖像分科可以自己百度。。。。 
首先進行攝像頭的圖像采集,使用的是野火帶FIFO的OV7725攝像頭,幀速率有點慢,但是勉強還能采集數據顯示。
單片機源程序如下:
- #include "led.h"
- #include "delay.h"
- #include "key.h"
- #include "sys.h"
- #include "lcd.h"
- #include "usart.h"
- #include "string.h"
- #include "ov7725.h"
- #include "tpad.h"
- #include "timer.h"
- #include "exti.h"
- #include "usmart.h"
- #define OV7725 1
- #define OV7725_WINDOW_WIDTH 320 // <=320
- #define OV7725_WINDOW_HEIGHT 240 // <=240
- u32 j,i,x=0,y=0;
- u16 color;
- u8 gm_red, gm_green, gm_blue;
- u8 tm=0;
- int r,tt;
- u8 lightmode=0,saturation=2,contrast=2;
- u8 effect=0,brightness=0;
- u8 showmode=0;
- u8 msgbuf[15];//消息緩存區
- extern u8 ov_sta; //在exit.c里 面定義
- extern u8 ov_frame; //在timer.c里面定義
- //更新LCD顯示(OV7725)
- void OV7725_camera_refresh(void)
- {
- if(ov_sta) //有幀中斷更新
- {
- LCD_Scan_Dir(U2D_L2R); //從上到下,從左到右
- if(lcddev.id==0X1963)
- LCD_Set_Window((lcddev.width-OV7725_WINDOW_WIDTH)/2,(lcddev.height-OV7725_WINDOW_HEIGHT)/2,OV7725_WINDOW_HEIGHT,OV7725_WINDOW_WIDTH);//將顯示區域設置到屏幕中央
- LCD_WriteRAM_Prepare(); //開始寫入GRAM
- OV7725_RRST=0; //開始復位讀指針
- OV7725_RCK_L;
- OV7725_RCK_H;
- OV7725_RCK_L;
- OV7725_RRST=1; //復位讀指針結束
- OV7725_RCK_H;
- for(i=0;i<OV7725_WINDOW_HEIGHT;i++)
- {
- for(j=0;j<OV7725_WINDOW_WIDTH;j++)
- {
- OV7725_RCK_L;
- color=GPIOC->IDR&0XFF;//讀數據
- OV7725_RCK_H;
- color<<=8;
- OV7725_RCK_L;
- color|=GPIOC->IDR&0XFF;//讀數據
- OV7725_RCK_H;
-
- gm_red = color>>11;
- gm_green = (color&0x07E0)>>5;
- gm_blue = (color&0x001F);
-
- if((gm_red<0X0008)&&(gm_blue<0X0020)&&(gm_green<0X0020))
- {
- color =0x0000;
- }
- else
- {
- color=0xffff;
- }
- LCD->LCD_RAM=color;
- }
-
- }
- ov_sta=0; //清零幀中斷標記
- ov_frame++;
- LCD_Scan_Dir(DFT_SCAN_DIR); //恢復默認掃描方向
- }
- }
- //更新LCD顯示(OV7725)
- void OV7726_camera_refresh(void)
- {
- if(ov_sta) //有幀中斷更新
- {
- LCD_Scan_Dir(U2D_L2R); //從上到下,從左到右
- if(lcddev.id==0X1963)
- LCD_Set_Window((lcddev.width-OV7725_WINDOW_WIDTH)/2,(lcddev.height-OV7725_WINDOW_HEIGHT)/2,OV7725_WINDOW_HEIGHT,OV7725_WINDOW_WIDTH);//將顯示區域設置到屏幕中央
- LCD_WriteRAM_Prepare(); //開始寫入GRAM
- OV7725_RRST=0; //開始復位讀指針
- OV7725_RCK_L;
- OV7725_RCK_H;
- OV7725_RCK_L;
- OV7725_RRST=1; //復位讀指針結束
- OV7725_RCK_H;
- for(i=0;i<OV7725_WINDOW_HEIGHT;i++)
- {
- for(j=0;j<OV7725_WINDOW_WIDTH;j++)
- {
- OV7725_RCK_L;
- color=GPIOC->IDR&0XFF; //讀數據
- OV7725_RCK_H;
- color<<=8;
- OV7725_RCK_L;
- color|=GPIOC->IDR&0XFF; //讀數據
- OV7725_RCK_H;
- LCD->LCD_RAM=color;
- }
-
- }
- ov_sta=0; //清零幀中斷標記
- ov_frame++;
- LCD_Scan_Dir(DFT_SCAN_DIR); //恢復默認掃描方向
- }
- }
- int main(void)
- {
- u8 sensor=0;
- u8 key;
- u8 i=0;
- u8 msgbuf[15];//消息緩存區
-
- delay_init(); //延時函數初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置中斷優先級分組為組2:2位搶占優先級,2位響應優先級
- uart_init(115200); //串口初始化為 115200
- usmart_dev.init(72); //初始化USMART
- LED_Init(); //初始化與LED連接的硬件接口
- KEY_Init(); //初始化按鍵
- LCD_Init(); //初始化LCD
- TPAD_Init(6); //觸摸按鍵初始化
- POINT_COLOR=RED; //設置字體為紅色
- LCD_ShowString(30,50,200,16,16,"AHUT");
- LCD_ShowString(30,70,200,16,16,"OV7725");
- LCD_ShowString(30,110,200,16,16,"2019/5/22");
- LCD_ShowString(30,210,200,16,16,"TPAD(SD2):Effects");
- LCD_ShowString(30,230,200,16,16,"OV7725 Init...");
- while(1)//初始化OV7725
- {
- if(OV7725_Init()==0)
- {
- sensor=OV7725;
- LCD_ShowString(30,230,200,16,16,"OV7725 Init OK ");
- OV7725_Light_Mode(lightmode);
- OV7725_Color_Saturation(saturation);
- OV7725_Brightness(brightness);
- OV7725_Contrast(contrast);
- OV7725_Special_Effects(effect);
- while(1)
- {
- key=KEY_Scan(0);
- if(key==S1)
- {
- OV7725_Window_Set(OV7725_WINDOW_WIDTH,OV7725_WINDOW_HEIGHT,0);//QVGA模式輸出
- break;
- }
- i++;
- if(i==100)
- LCD_ShowString(30,250,210,16,16,"S1:QVGA"); //閃爍顯示提示信息
- if(i==200)
- {
- LCD_Fill(30,250,210,250+16,WHITE);
- i=0;
- }
- delay_ms(5);
- }
- OV7725_CS=0;
- break;
- }
- }
- TIM6_Int_Init(10000,7199); //10Khz計數頻率,1秒鐘中斷
- EXTI8_Init(); //使能定時器捕獲
- LCD_Clear(BLACK);
- while(1)
- {
- key=KEY_Scan(0);//不支持連按
- if(key)
- {
- tm=20;
- switch(key)
- {
- case S1:
- showmode++;
- if(sensor==OV7725)
- {
- if(showmode>1)showmode=0;
- }
- break;
- }
- }
- if(sensor==OV7725)
- {
- if(showmode==0)
- OV7725_camera_refresh();//更新顯示
- else
- OV7726_camera_refresh();//更新顯示;
- }
- if(tm)
- {
- LCD_ShowString((lcddev.width-240)/2+30,(lcddev.height-320)/2+60,200,16,16,msgbuf);
- tm--;
- }
- i++;
- if(i>=15)//DS0閃爍.
- {
- i=0;
- LED0=!LED0;
- }
- }
- }
復制代碼
所有資料51hei提供下載:
erzhi2.7z
(238.56 KB, 下載次數: 61)
2019-5-28 04:49 上傳
點擊文件名下載附件
|