OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 17467|回复: 17

stm32f4+ov2640颜色识别

[复制链接]

12

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2016-2-16
在线时间
71 小时
发表于 2016-4-13 17:48:11 | 显示全部楼层 |阅读模式
5金钱
我想用f4+ov2640做颜色识别,基本原理是摄像头捕获一帧数据,关闭DMA,调用lcd读点函数读取颜色值,处理过后开启DMA传输下一帧数据。用的是原子的摄像头实验的程序并做了些修改。结果lcd只显示一次,之后再也不刷新了。但是LED1灯一直闪。
//DCMI中断服务函数
void DCMI_IRQHandler(void)   
{
        if(DCMI_GetITStatus(DCMI_IT_FRAME)==SET)//捕获到一帧图像
        {
                rgb_data_process();     来一次帧中断进入这个函数处理。            
                DCMI_ClearITPendingBit(DCMI_IT_FRAME);//清除帧中断
                LED1=!LED1;
                ov_frame++;  
        }
}

下面是main.c里面的函数。
void rgb_data_process(void)         在这个函数里面开启或者关闭dma。
{
       
                if(rgb_data_ok==0)        //rgb数据还未采集完?                     
                {       
                        DMA_Cmd(DMA2_Stream1,DISABLE);//关闭DMA2,Stream1
                        while (DMA_GetCmdStatus(DMA2_Stream1) != DISABLE){}//等待DMA2_Stream1可配置  
                        rgb_data_ok=1;                                 //标记rgb数据采集完按成,等待其他函数处理
                }
                if(rgb_data_ok==2)        //上一次的rgb数据已经被处理了
                {
                        DMA2_Stream1->NDTR=1;
                        LCD_SetCursor(0,0);                       
                        DMA_Cmd(DMA2_Stream1,ENABLE);//开启DMA2,Stream1
                        rgb_data_ok=0;                                                //标记数据未采集
                }
       
}

//RGB565测试
//RGB数据直接显示在LCD上面
void rgb565_test(void)
{
        u8 key;
        u8 effect=0,saturation=2,contrast=2;
        u8 scale=1;                //默认是全尺寸缩放
        u8 msgbuf[15];        //消息缓存区
        LCD_Clear(WHITE);
        POINT_COLOR=RED;
        LCD_ShowString(30,50,200,16,16,"ALIENTEK STM32F4");
        LCD_ShowString(30,70,200,16,16,"OV2640 RGB565 Mode");
       
        LCD_ShowString(30,100,200,16,16,"KEY0:Contrast");                        //对比度
        LCD_ShowString(30,130,200,16,16,"KEY1:Saturation");                 //色彩饱和度
        LCD_ShowString(30,150,200,16,16,"KEY2:Effects");                         //特效
        LCD_ShowString(30,170,200,16,16,"KEY_UP:FullSize/Scale");        //1:1尺寸(显示真实尺寸)/全尺寸缩放
       
        OV2640_RGB565_Mode();        //RGB565模式
        My_DCMI_Init();                        //DCMI配置
        DCMI_DMA_Init((u32)&LCD->LCD_RAM,1,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Disable);//DCMI DMA配置  
        OV2640_OutSize_Set(lcddev.width,lcddev.height);
        DCMI_Start();                 //启动传输
        while(1)
        {
               
                if(rgb_data_ok==1)        //已经采集完一帧图像了
                {
                         LCD_Read(115,160);                                                               ----->这一部分进行lcd的读点和颜色值的处理。
                         equr=(G[0]+G[1]+G[2]+G[3]+G[4]+G[5])/6;         
                         if(0x35<equr&&equr<0x39)
                         {
                                        LED0=!LED0;
                         }
                   rgb_data_ok=2;        //标记rgb数据处理完了,可以让DMA去采集下一帧了.       
           }               
        }   
}
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;//设置字体为红色
        LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");       
        LCD_ShowString(30,70,200,16,16,"OV2640 TEST");       
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2014/5/14");           
        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);
        }
        LCD_ShowString(30,130,200,16,16,"OV2640 OK");            
        rgb565_test();
}

STM32F4摄像头.zip (7.12 MB, 下载次数: 25529)

最佳答案

查看完整内容[请看2#楼]

找到原因了,少了一句 : LCD_WriteRAM_Prepare();
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2016-2-16
在线时间
71 小时
 楼主| 发表于 2016-4-13 17:48:12 | 显示全部楼层
本帖最后由 xws 于 2016-4-13 21:29 编辑

找到原因了,少了一句 : LCD_WriteRAM_Prepare();       
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2016-4-13 20:48:13 | 显示全部楼层
看着没问题哦
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2016-4-16
在线时间
11 小时
发表于 2016-4-16 22:13:04 | 显示全部楼层
xws 发表于 2016-4-13 17:48
找到原因了,少了一句 : LCD_WriteRAM_Prepare();

楼主哪里少这句啊?我也在做视觉呢,帧中断里做这么多事不会出问题吗?
回复

使用道具 举报

12

主题

41

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2016-2-16
在线时间
71 小时
 楼主| 发表于 2016-4-17 20:52:51 | 显示全部楼层
Lilo 发表于 2016-4-16 22:13
楼主哪里少这句啊?我也在做视觉呢,帧中断里做这么多事不会出问题吗?

不会出问题,M4的速度还是够快的,你把DCMI设置成快照模式就行了。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2016-4-19
在线时间
0 小时
发表于 2016-4-19 20:05:18 | 显示全部楼层
请问楼主哪里少了一名LCD_WriteRAM_Prepare();
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2018-6-22
在线时间
7 小时
发表于 2018-10-22 17:35:44 | 显示全部楼层

请问原子哥,问题在哪里啊
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手入门

积分
1
金钱
1
注册时间
2018-10-22
在线时间
2 小时
发表于 2018-11-19 11:24:59 | 显示全部楼层
请问楼主哪里少了一名LCD_WriteRAM_Prepare();
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2018-11-6
在线时间
6 小时
发表于 2018-11-22 01:07:20 | 显示全部楼层
请问楼主是哪里少了一句??谢谢。
回复

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2018-11-6
在线时间
6 小时
发表于 2018-11-24 16:22:05 | 显示全部楼层
xws 发表于 2016-4-13 17:48
找到原因了,少了一句 : LCD_WriteRAM_Prepare();

但是就算加上那一句也识别不了呀
回复

使用道具 举报

0

主题

9

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2019-4-11
在线时间
7 小时
发表于 2019-7-20 15:20:33 | 显示全部楼层
passerby 发表于 2018-11-24 16:22
但是就算加上那一句也识别不了呀

应该可以的,试试用两种颜色去识别,色差越大越好,多调试一下,反复测试,至少基本原理没啥大问题
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2020-10-12
在线时间
2 小时
发表于 2020-10-12 22:11:16 | 显示全部楼层

请问楼主哪里少了一名LCD_WriteRAM_Prepare();
回复

使用道具 举报

2

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2021-5-21
在线时间
28 小时
发表于 2021-5-21 17:07:10 | 显示全部楼层
牛啊!
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2021-1-21
在线时间
24 小时
发表于 2021-7-3 19:10:53 | 显示全部楼层

那里少了一句啊
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2021-1-21
在线时间
24 小时
发表于 2021-7-3 19:11:26 | 显示全部楼层
passerby 发表于 2018-11-24 16:22
但是就算加上那一句也识别不了呀

兄弟。那里少了一句啊
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2021-1-21
在线时间
24 小时
发表于 2021-7-3 19:12:22 | 显示全部楼层
xws 发表于 2016-4-13 17:48
找到原因了,少了一句 : LCD_WriteRAM_Prepare();

那里少了一句呢
回复

使用道具 举报

0

主题

12

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2021-11-17
在线时间
6 小时
发表于 2021-11-29 09:00:40 来自手机 | 显示全部楼层
支持一下
回复

使用道具 举报

2

主题

47

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2022-4-23
在线时间
7 小时
发表于 2022-4-24 19:30:56 | 显示全部楼层
bucuo,henhao
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 21:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表