使用OV7725進(jìn)行采集數(shù)據(jù),顯示到LCD屏幕上面,再進(jìn)行灰度處理,然后再尋找圖像分割的灰度閾值,進(jìn)行圖像二值化。 關(guān)于圖像分科可以自己百度。。。。 
首先進(jìn)行攝像頭的圖像采集,使用的是野火帶FIFO的OV7725攝像頭,幀速率有點(diǎn)慢,但是勉強(qiáng)還能采集數(shù)據(jù)顯示。
單片機(jī)源程序如下:
- #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];//消息緩存區(qū)
- 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);//將顯示區(qū)域設(shè)置到屏幕中央
- LCD_WriteRAM_Prepare(); //開始寫入GRAM
- OV7725_RRST=0; //開始復(fù)位讀指針
- OV7725_RCK_L;
- OV7725_RCK_H;
- OV7725_RCK_L;
- OV7725_RRST=1; //復(fù)位讀指針結(jié)束
- 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;//讀數(shù)據(jù)
- OV7725_RCK_H;
- color<<=8;
- OV7725_RCK_L;
- color|=GPIOC->IDR&0XFF;//讀數(shù)據(jù)
- 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; //清零幀中斷標(biāo)記
- ov_frame++;
- LCD_Scan_Dir(DFT_SCAN_DIR); //恢復(fù)默認(rèn)掃描方向
- }
- }
- //更新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);//將顯示區(qū)域設(shè)置到屏幕中央
- LCD_WriteRAM_Prepare(); //開始寫入GRAM
- OV7725_RRST=0; //開始復(fù)位讀指針
- OV7725_RCK_L;
- OV7725_RCK_H;
- OV7725_RCK_L;
- OV7725_RRST=1; //復(fù)位讀指針結(jié)束
- 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; //讀數(shù)據(jù)
- OV7725_RCK_H;
- color<<=8;
- OV7725_RCK_L;
- color|=GPIOC->IDR&0XFF; //讀數(shù)據(jù)
- OV7725_RCK_H;
- LCD->LCD_RAM=color;
- }
-
- }
- ov_sta=0; //清零幀中斷標(biāo)記
- ov_frame++;
- LCD_Scan_Dir(DFT_SCAN_DIR); //恢復(fù)默認(rèn)掃描方向
- }
- }
- int main(void)
- {
- u8 sensor=0;
- u8 key;
- u8 i=0;
- u8 msgbuf[15];//消息緩存區(qū)
-
- delay_init(); //延時(shí)函數(shù)初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置中斷優(yōu)先級(jí)分組為組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
- uart_init(115200); //串口初始化為 115200
- usmart_dev.init(72); //初始化USMART
- LED_Init(); //初始化與LED連接的硬件接口
- KEY_Init(); //初始化按鍵
- LCD_Init(); //初始化LCD
- TPAD_Init(6); //觸摸按鍵初始化
- POINT_COLOR=RED; //設(shè)置字體為紅色
- 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計(jì)數(shù)頻率,1秒鐘中斷
- EXTI8_Init(); //使能定時(shí)器捕獲
- 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;
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
erzhi2.7z
(238.56 KB, 下載次數(shù): 61)
2019-5-28 04:49 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|