具有可变图像“子区域”的OpenCv cvRemap

我有一个使用具有“aoi”功能的相机的应用程序。 与openCv的ROI功能类似,摄像机允许指定要采集的总传感器图像的矩形子集(称为“子区域”)。

在相机中使用aoi功能比在openCv中执行ROI和复制操作更可取。 获得图像传感器数据的子区域所需的带宽被减小,这意味着更高的帧速率是可能的。 像素数量的减少也减轻了CPU的负担。

应用程序可以选择使用相机校准矩阵进行不失真。 我只想做一次相机校准(或者至少不是每次重新定义相机aoi时)。

当相机的aoi设置为完整图像时,不失真的工作正常。 但是,当我在相机中使用减少的aoi时,我无法使其工作。 黑线显示在未失真图像的底部。

我想我可以像这样制作mapx和mapy数据的副本:

cvSetImageROI(mapx,aoi_box);
mapx_aoi = cvCreateImage(cvSize(sensor_width,aoi_box.height), IPL_DEPTH_32F, 1 );
cvCopyImage(mapx,mapx_aoi);

cvSetImageROI(mapy,aoi_box);
mapy_aoi = cvCreateImage(cvSize(sensor_width,aoi_box.height), IPL_DEPTH_32F, 1 );
cvCopyImage(mapy,mapy_aoi);


cvResetImageROI(mapx);
cvResetImageROI(mapy);

其中,aoi_box是发送给相机以定义其ROI的。 不失真是用cvRemap完成的:

我认为这应该提取正确的偏移量以重新映射相机子区域中的每个像素。 但是,由此产生的未失真图像在图像底部有黑线。 当该分区域靠近顶部(小y)时,我只有几条黑线。 当y变大时,我会得到更多的黑线。 在y的某个值处,整个未失真的图像是黑色的。

图像右侧可能会出现类似的情况,但我总是使用图像的整个宽度,只缩小子区域的高度和y位置。

if (undistort_images)
{
    cvCvtColor(multiframe_images[0],distorted_image , CV_BayerBG2BGR);
    cvRemap(distorted_image,image,mapx_aoi,mapy_aoi);
}
else 
{
    cvCvtColor(multiframe_images[0],image , CV_BayerBG2BGR);

}

任何提示为什么这不正确?

谢谢

编辑:

我已经更仔细地观察了未失真的图像,并注意到未失真的图像具有与该次区域y相匹配的y偏移量。 该偏移导致黑线,因为许多线将从子区域图像中丢失。

例如,如果子区域是从y = 50开始的100行,我只看到图像的底部1/2(50行),向上移动。

所以,我想我可以通过对mapy_aoi应用偏移量来“解决”这个问题,但我不明白为什么这是必需的。


发现地图图像不包含像素偏移量,但是包含绝对像素位置。

因此,我不是试图使用地图子集,而是每次改变摄像机aoi时,我都决定从内在和失真系数中重新生成它们。

链接地址: http://www.djcxy.com/p/30621.html

上一篇: OpenCv cvRemap with variable image "subregion"

下一篇: Rectification of uncalibrated cameras, via fundamental matrix