使用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)
|