OpenEdv-开源电子网

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

实验38 摄像头实验 OV5640

[复制链接]

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-8-2
在线时间
17 小时
发表于 2017-8-21 10:31:57 | 显示全部楼层 |阅读模式
15金钱
原子哥,我使用STM32F767实验板,做摄像头捕获视频,并希望在STM32F767内部做图像处理,并进一步在LCD上面显示,但是现在遇到下面的问题,希望原子哥可以解答一下。程序的主体使用的Hal库版本的 实验38 摄像头实验
1、  光盘原始测试程序:
void rgblcd_dcmi_rx_callback(void)
{
u16 *pbuf;
if(DMA2_Stream1->CR&(1<<19))//DMA使用buf1,读取buf0
         pbuf= (u16*)(&dcmi_line_buf[0][0]);
else                                                    //DMA使用buf0,读取buf1
         pbuf=(u16*)(&dcmi_line_buf[1][0]);
LTDC_Color_Fill(0,curline,lcddev.width-1,curline,pbuf);//DM2D填充
if(curline<lcddev.height)
         curline++;
}
结果见1.jpg。

2、测试2:在图片显示之前加了一段延时后,依然使用pbuf指针作为显示函数LTDC_Color_Fill入参时,可以得到摄像头捕获的视频。
//RGB屏数据接收回调函数
const u16 H=100,W=600;
u16 RGB565_data[H][W]={0};
void rgblcd_dcmi_rx_callback(void)
{
int i=0,j=0;
u16 *pbuf;
if(DMA2_Stream1->CR&(1<<19))//DMA使用buf1,读取buf0
pbuf =(u16*)(&dcmi_line_buf[0][0]);  
else                                                    //DMA使用buf0,读取buf1
pbuf=(u16*)(&dcmi_line_buf[1][0]);      
if(curline-yoffset<H)
memcpy(RGB565_data[curline-yoffset],pbuf,1200);
if(curline-yoffset==H-1)
{
for(i=0;i<H;i++)
{
delay_us(100);
}
}
LTDC_Color_Fill(0,curline,lcddev.width-1,curline,pbuf);//DM2D填充
if(curline<lcddev.height)
curline++;
}
结果见2.jpg。
3、测试3:使用pbuf指针指向的内容将RGB565_data100行数据覆盖,无法得到摄像头真正捕获的视频。
//RGB屏数据接收回调函数
const u16 H=100,W=600;
u16 RGB565_data[H][W]={0};
void rgblcd_dcmi_rx_callback(void)
{
int i=0,j=0;
u16 *pbuf;
if(DMA2_Stream1->CR&(1<<19))//DMA使用buf1,读取buf0
pbuf =(u16*)(&dcmi_line_buf[0][0]);  
else                                                    //DMA使用buf0,读取buf1
pbuf=(u16*)(&dcmi_line_buf[1][0]);
if(curline-yoffset<H)
{   
for(j=0;j<600;j++)
RGB565_data[curline-yoffset][j]=*(pbuf+j);//直接在这赋值***********不同之处
}
if(curline-yoffset==H-1)
{
for(i=0;i<H;i++)
{
LTDC_Color_Fill(0,yoffset+i,W-1,yoffset+i,RGB565_data);//DM2D填充
delay_us(100);
}
}
//LTDC_Color_Fill(0,curline,lcddev.width-1,curline,pbuf);//DM2D填充
if(curline<lcddev.height)
curline++;
}
结果见3.jpg:出来图像每一行结果是一样的。单步调试的时候,发现数值是不一样的

4、测试4:使用红色将RGB565_data100行数据覆盖,得到的正确的红色图片。
//RGB屏数据接收回调函数
const u16 H=100,W=600;
u16 RGB565_data[H][W]={0};
void rgblcd_dcmi_rx_callback(void)
{
int i=0,j=0;
u16 *pbuf;
if(DMA2_Stream1->CR&(1<<19))//DMA使用buf1,读取buf0
pbuf =(u16*)(&dcmi_line_buf[0][0]);  
else                                                    //DMA使用buf0,读取buf1
pbuf=(u16*)(&dcmi_line_buf[1][0]);      
if(curline-yoffset<H)
{   
for(j=0;j<600;j++)
RGB565_data[curline-yoffset][j]=0xF800;//这里赋值成红色
}
if(curline-yoffset==H-1)
{
for(i=0;i<H;i++)
{
LTDC_Color_Fill(0,yoffset+i,W-1,yoffset+i,RGB565_data);//DM2D填?
delay_us(100);
}
}
if(curline<lcddev.height)
curline++;
}
结果见4.jpg。
如果这种方法不行,希望提供一个在STM32F767内部做图像处理的思路,希望得到大家的帮助,谢谢!!!

1.jpg
2.jpg
3.jpg
4.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-8-2
在线时间
17 小时
 楼主| 发表于 2017-8-21 14:52:27 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-8-22 00:49:19 | 显示全部楼层
你想处理就直接处理SDRAM里面的数据,传输完一帧,就处理这一帧的数据就可以了。

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-8-2
在线时间
17 小时
 楼主| 发表于 2017-8-22 22:06:48 | 显示全部楼层
正点原子 发表于 2017-8-22 00:49
你想处理就直接处理SDRAM里面的数据,传输完一帧,就处理这一帧的数据就可以了。

但是先要把数据保存在另外一个数组里面啊。保存后让重新显示这一行的时候就会出错
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2017-8-23 00:33:59 | 显示全部楼层
快乐之路 发表于 2017-8-22 22:06
但是先要把数据保存在另外一个数组里面啊。保存后让重新显示这一行的时候就会出错

我们例程也是类似的,不过是存储在LTDC的GRAM
你改为SDRAM数组一样是可以的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2017-8-2
在线时间
17 小时
 楼主| 发表于 2017-8-23 12:08:02 | 显示全部楼层
正点原子 发表于 2017-8-23 00:33
我们例程也是类似的,不过是存储在LTDC的GRAM
你改为SDRAM数组一样是可以的

直接从LTDC的GRAM中拷贝数据,然后重新显示的话就会出错,我也很郁闷
回复

使用道具 举报

3

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2017-8-11
在线时间
13 小时
发表于 2017-8-23 12:11:09 | 显示全部楼层
可以看一下我的帖子
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-18 04:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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