实验38 摄像头实验 OV5640

2019-07-20 12:26发布

原子哥,我使用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,读取buf0pbuf =(u16*)(&dcmi_line_buf[0][0]);  else                                                    //DMA使用buf0,读取buf1pbuf=(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,读取buf0pbuf =(u16*)(&dcmi_line_buf[0][0]);  else                                                    //DMA使用buf0,读取buf1pbuf=(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:使用红 {MOD}将RGB565_data100行数据覆盖,得到的正确的红 {MOD}图片。//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,读取buf0pbuf =(u16*)(&dcmi_line_buf[0][0]);  else                                                    //DMA使用buf0,读取buf1pbuf=(u16*)(&dcmi_line_buf[1][0]);       if(curline-yoffset<H){   for(j=0;j<600;j++)RGB565_data[curline-yoffset][j]=0xF800;//这里赋值成红 {MOD}}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内部做图像处理的思路,希望得到大家的帮助,谢谢!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
快乐之路
1楼-- · 2019-07-20 17:57
 精彩回答 2  元偷偷看……
正点原子
2楼-- · 2019-07-20 20:30
你想处理就直接处理SDRAM里面的数据,传输完一帧,就处理这一帧的数据就可以了。

快乐之路
3楼-- · 2019-07-20 22:45
 精彩回答 2  元偷偷看……
正点原子
4楼-- · 2019-07-21 01:02
 精彩回答 2  元偷偷看……
快乐之路
5楼-- · 2019-07-21 04:36
正点原子 发表于 2017-8-23 00:33
我们例程也是类似的,不过是存储在LTDC的GRAM
你改为SDRAM数组一样是可以的

直接从LTDC的GRAM中拷贝数据,然后重新显示的话就会出错,我也很郁闷
几楼卖鞋
6楼-- · 2019-07-21 08:22
可以看一下我的帖子

一周热门 更多>