标题:
stm32F4+OV2640图像rgb转yuv转二值化DMA传输源码
[打印本页]
作者:
的发给客人
时间:
2018-3-14 10:26
标题:
stm32F4+OV2640图像rgb转yuv转二值化DMA传输源码
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)
2018-3-14 17:19 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
aaaa1254
时间:
2018-5-17 15:41
程序出现了3分屏啊,且屏幕利用率低啊
作者:
2075619356
时间:
2019-5-8 17:04
这个程序是怎么用一个循环扫完所有点的,我想得到所有黑点的坐标,可是我只找到一个循环,找不到横纵坐标
作者:
shelling
时间:
2019-7-21 16:23
学习下
作者:
afsasfa
时间:
2019-8-5 16:03
aaaa1254 发表于 2018-5-17 15:41
程序出现了3分屏啊,且屏幕利用率低啊
你解决这个问题了 可以教教我不
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1