我有一个使用具有“aoi”功能的相机的应用程序。与openCv的ROI功能类似,摄像机允许指定要采集的总传感器图像的矩形子集(称为“子区域”)。
在相机中使用aoi功能比在openCv中执行ROI和复制操作更可取。获得图像传感器数据的子区域所需的带宽减小,这意味着可能的帧速率更高。减少像素数也可以减轻CPU负担。
应用程序可以选择使用相机校准矩阵进行无失真。我只想做一次相机校准(或者至少不是每次我重新定义相机aoi)。
当相机的aoi设置为完整图像时,undistort工作正常。但是,当我在相机中使用减少的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应用偏移量来解决问题,但我不明白为什么需要这样做。
答案 0 :(得分:1)
原来地图图像不包含像素偏移,但包含绝对像素位置。
因此,我决定在每次更改相机aoi时从内在函数和失真系数中重新生成它们,而不是尝试使用地图的子集。