我有一个使用具有“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 应用偏移来“解决”这个问题,但我不明白为什么需要这样做。