MCU:STM32F407攝像頭:OV2640
處理方法:rgb轉(zhuǎn)yuv轉(zhuǎn)二值化圖
數(shù)據(jù)傳輸: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數(shù)據(jù)緩存jpeg_buf的大小(*4字節(jié))
- 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數(shù)據(jù)緩存buf
- volatile u32 jpeg_data_len=0; //buf中的JPEG有效數(shù)據(jù)長度
- volatile u8 jpeg_data_ok=0; //JPEG數(shù)據(jù)采集完成標志
- u16 fps[320];
- u16 yuv[320];
- u16 yuv422_y_to_bitmap(u8 threshold,u16 yuv422)
- {
- u8 temp; //用于儲存yuv422格式數(shù)據(jù)中的亮度值Y量
- temp = (u8)(yuv422>>8);//把yuv422格式數(shù)據(jù)中的亮度值Y量提取出來賦值給temp變量(Y值在高字節(jié),根據(jù)OV2640寄存器設(shè)置決定)
- if(temp >= threshold)//如果,Y值 大于等于閥值
- {
- //白
- return 1;
- }
- else
- { //黑
- return 0;
- }
- }
- //中斷處理函數(shù)
- 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數(shù)據(jù)直接顯示在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); //按鍵掃描函數(shù)
- if(key)
- {
- switch(key)
- {
- case WKUP_PRES: //閥值+1
- threshold++;break;
- case KEY1_PRES: //閥值-1
- threshold--;break;
- }
- }
- }
- }
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級分組2
- delay_init(168); //初始化延時函數(shù)
- 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計數(shù),1秒鐘中斷一次
- usmart_dev.init(84); //初始化USMART
- POINT_COLOR=RED;//設(shè)置字體為紅色
- 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, 下載次數(shù): 134)
2018-3-14 17:19 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|