MCU:STM32F407摄像头:OV2640
处理方法:rgb转yuv转二值化图
数据传输:DMA
单片机源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "key.h"
- #include "lcd.h"
- #include "usmart.h"
- #include "usart2.h"
- #include "timer.h"
- #include "ov2640.h"
- #include "dcmi.h"
- #define jpeg_buf_size 31*1024 //定义JPEG数据缓存jpeg_buf的大小(*4字节)
- u32 black=0,white=0;
- float precent;
- u16 ov2640_mode=0,i=0,cnt,threshold=60,line; //工作模式:0,RGB565模式;1,JPEG模式
- __align(4) u32 jpeg_buf[jpeg_buf_size]; //JPEG数据缓存buf
- volatile u32 jpeg_data_len=0; //buf中的JPEG有效数据长度
- volatile u8 jpeg_data_ok=0; //JPEG数据采集完成标志
- u16 fps[320];
- u16 yuv[320];
- u16 yuv422_y_to_bitmap(u8 threshold,u16 yuv422)
- {
- u8 temp; //用于储存yuv422格式数据中的亮度值Y量
- temp = (u8)(yuv422>>8);//把yuv422格式数据中的亮度值Y量提取出来赋值给temp变量(Y值在高字节,根据OV2640寄存器设置决定)
- if(temp >= threshold)//如果,Y值 大于等于阀值
- {
- //白
- return 1;
- }
- else
- { //黑
- return 0;
- }
- }
- //中断处理函数
- void DCMI_IRQHandler(void)
- {
- if(DCMI_GetITStatus(DCMI_IT_FRAME)==SET)//捕获到一帧图像
- {
- DCMI_ClearITPendingBit(DCMI_IT_FRAME);//清除帧中断
- LED1=!LED1;
- precent=((black/1.0)/((black/1.0+white/1.0)))*100;
- USART_SendData(USART1,precent);
- black=0;white=0;
- DCMI_Start(); //启动传输
- DCMI_CaptureCmd(ENABLE);
- }
- if (DCMI_GetITStatus(DCMI_IT_LINE) != RESET)//DCMI_ITConfig(DCMI_IT_LINE, ENABLE);
- {
- DCMI_ClearITPendingBit(DCMI_IT_LINE);
- for(i=0;i<320;i++)
- {
- cnt=yuv422_y_to_bitmap(threshold,fps[i]);
- if(cnt==1)
- {
- white++;
- LCD->LCD_RAM=0xffff;
- }
- else
- {
- LCD->LCD_RAM=0x0000;
- black++;
- }
- }
- }
- }
- //RGB565测试
- //RGB数据直接显示在LCD上面
- void yuv_test(void)
- {
- u8 key;
- LCD_Clear(WHITE);
- POINT_COLOR=RED;
- OV2640_YUV422_Mode(); //RGB565模式
- My_DCMI_Init(); //DCMI配置
- DCMI_DMA_Init((u32)fps,320,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable);//DCMI DMA配置
- OV2640_OutSize_Set(lcddev.width,lcddev.height);
- DCMI_Start(); //启动传输
- while(1)
- {
- key=KEY_Scan(1); //按键扫描函数
- if(key)
- {
- switch(key)
- {
- case WKUP_PRES: //阀值+1
- threshold++;break;
- case KEY1_PRES: //阀值-1
- threshold--;break;
- }
- }
- }
- }
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
- delay_init(168); //初始化延时函数
- uart_init(115200); //初始化串口波特率为115200
- usart2_init(42,115200); //初始化串口2波特率为115200
- LED_Init(); //初始化LED
- LCD_Init(); //LCD初始化
- KEY_Init(); //按键初始化
- TIM3_Int_Init(10000-1,8400-1);//10Khz计数,1秒钟中断一次
- usmart_dev.init(84); //初始化USMART
- POINT_COLOR=RED;//设置字体为红色
- while(OV2640_Init())//初始化OV2640
- {
- LCD_ShowString(30,130,240,16,16,"OV2640 ERR");
- delay_ms(200);
- LCD_Fill(30,130,239,170,WHITE);
- delay_ms(200);
- }
- while(1)
- {
- yuv_test();
- }
- }
-
复制代码
所有资料51hei提供下载:
摄像头实验.rar
(590.69 KB, 下载次数: 134)
|