您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> BF533 双缓冲方式采集高帧率摄像头图像问题... 
本帖共有415个阅读者
发表帖子 发表投票 回复主题
BF533 双缓冲方式采集高帧率摄像头图像问题
slackman(论坛新手)
slackman
头衔:社区公民
帮派:无帮无派
帖数:10
金钱:182
积分:14
注册时间:2017/4/29
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
BF533 双缓冲方式采集高帧率摄像头图像问题
求助:BF533板子上采集高帧率图像出现的问题,请大家帮助。先谢谢了


描述如下:

<code>
// 发起采集
void PPI_Capture_Frame(void)
{
*pPPI_FRAME       = 240;  
*pPPI_COUNT       = 319;
*pPPI_DELAY       = 0;
*pPPI_CONTROL     = 0x01AC;

// 根据 frame_id 传入对应的内存地址
*pDMA0_START_ADDR = (frame_id == 1) ? src_buffer1 : src_buffer0;
*pDMA0_X_COUNT    = 160;
*pDMA0_X_MODIFY   = 0x2;
*pDMA0_Y_COUNT    = 240;
*pDMA0_Y_MODIFY   = 0x2;
*pDMA0_PERIPHERAL_MAP = 0x0;
*pDMA0_CONFIG   =  WNR | WDSIZE_16| DMA2D | RESTART | DI_EN;
*pDMA0_CONFIG  |= DMAEN;
ssync();
*pPPI_CONTROL  |= PORT_EN;
ssync();
}
<code />

<code>
// PPI 中断处理函数,简单使标志位置1
EX_INTERRUPT_HANDLER(DMA0_PPI_ISR)
{    
    *pDMA0_IRQ_STATUS = 0x1;
    //*pPPI_CONTROL &= 0xfffe;    

if(frame_id >= 0) {
frame_dirty[frame_id] = 1;
}
}
<code />

采集方法一:
顺序采集,图像采集正常,即 frame_dirty[frame_id] 赋0,发起采集后,等待 frame_dirty[frame_id] 为1再继续。
此方法图像正常。

代码如下:

<code>
// 采集到 0 缓存
frame_id = 0;
PPI_Capture_Frame();
    
// 等待采集完成
while(frame_dirty[0] == 0);

// 处理或显示图像
.......

frame_dirty[0] = 0;
<code />

采集方法二:
后来因更换的CMOS帧率较高,为了充分利用视频采集的时间间隔,我们想在发起采集之后,先处理上一帧保存的图像,结果发现采集到图像出现问题

<code>
// 遍历查找空闲的缓存 id
frame_id = -1;
for (i = 0; i < 2; i++) {
if(frame_dirty[i] == 0) {
frame_id = i;
break;
}
}
if(frame_id >= 0) {
// 发起采集
PPI_Capture_Frame();
        // 利用空闲时间处理上一帧的缓存,
int id = 1 - frame_id;
if(frame_dirty[id] == 1) {
// 处理或显示图像
                ....
frame_dirty[id] = 0;
}    
// 等待采集完成
while(frame_dirty[frame_id] == 0);  
}
<code />




图像问题的具体表现:

1. 正常图像:
上传的图片
  20177119535234.bmp [ 76.05 KB 320×240 ] (缩略时请点击查看原图)

 


2. 移动样品后,采用第二种方式采集的图像
上传的图片
  20177119542834.bmp [ 76.05 KB 320×240 ] (缩略时请点击查看原图)

 



比较神奇的是,如果不移动样品,图像就不会发生错乱的现象。


「该帖子被 slackman 在 2017-07-11 10:06:55 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2017/7/11 10:06:06
slackman(论坛新手)
slackman
头衔:社区公民
帮派:无帮无派
帖数:10
金钱:182
积分:14
注册时间:2017/4/29
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
补充:我是通过 Visual DSP++ 的 Image Viewer 工具来查看内存的,会不会是查看的方式有问题?

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2017/7/11 10:15:42
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5187
金钱:34761
积分:6369
注册时间:2011/6/7
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
可能是开的视频缓存有重叠,导致下一帧采集时,上一帧数据被覆盖。或者硬件上地址线短路或者没配对。

可以这样,采完一帧后看看图像,处理时,看看图像在哪里被破坏,可以快速找到内存重叠部分

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2017/7/16 20:01:36
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154485 Call, 1 Queries, Processed in 0.015625 second(s),