標題:
stm32F4+OV2640圖像rgb轉(zhuǎn)yuv轉(zhuǎn)二值化DMA傳輸源碼
[打印本頁]
作者:
的發(fā)給客人
時間:
2018-3-14 10:26
標題:
stm32F4+OV2640圖像rgb轉(zhuǎn)yuv轉(zhuǎn)二值化DMA傳輸源碼
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();
}
}
復(fù)制代碼
所有資料51hei提供下載:
攝像頭實驗.rar
(590.69 KB, 下載次數(shù): 134)
2018-3-14 17:19 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
aaaa1254
時間:
2018-5-17 15:41
程序出現(xiàn)了3分屏啊,且屏幕利用率低啊
作者:
2075619356
時間:
2019-5-8 17:04
這個程序是怎么用一個循環(huán)掃完所有點的,我想得到所有黑點的坐標,可是我只找到一個循環(huán),找不到橫縱坐標
作者:
shelling
時間:
2019-7-21 16:23
學(xué)習(xí)下
作者:
afsasfa
時間:
2019-8-5 16:03
aaaa1254 發(fā)表于 2018-5-17 15:41
程序出現(xiàn)了3分屏啊,且屏幕利用率低啊
你解決這個問題了 可以教教我不
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1