原子哥,我使用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_data前100行数据覆盖,无法得到摄像头真正捕获的视频。 //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_data前100行数据覆盖,得到的正确的红色图片。 //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内部做图像处理的思路,希望得到大家的帮助,谢谢!!!
|