仅对从失真图像获得的坐标应用重新映射,而不是在整个图像上应用

时间:2016-02-29 01:41:58

标签: c++ opencv

opencv中的initUndistortRectifyMap函数在x和y方向上产生maap,其中包含未失真像素的坐标,它根据内在的相机矩阵,失真矩阵和旋转矩阵计算这些贴图。

initUndistortRectifyMap(cam1,dst1,R1,P1, imageSize, CV_16SC2, map1x,map1y);

cam1(内在相机矩阵) dst1(失真系数) R1(旋转矩阵) map1x(图像大小的新地图,表示移位的x坐标在未失真图像中的位置) map2x((图像大小的新地图,表示移位的y坐标在未失真图像中的位置) 所以如果新的图像坐标扭曲的图像(xdistort,ydistort) 可以使用

计算未失真
x_undistort = map1x.at<short>(ydistort,xdistort);
y_undistort = map2x.at<short>(ydistort,xdistort);

我检查了未失真图像中的相应点,它们不会产生同一点。我在(0,0)检查了map1x的值,它包含负值,当我点击控制台找到坐标值时,它给出了相应的结果(0:im_width,0:imheight)。有没有规范化程序?如何在不处理整个图像的情况下直接计算点数。

1 个答案:

答案 0 :(得分:0)

像素的坐标是整数。因此,将它们作为浮点数是毫无意义的。

如果您需要Point2f,则只需从检索到的Point2f构建Point

double minVal; double maxVal; Point minLoc; Point maxLoc;
minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );

Point2f minLocF(minLoc);
Point2f maxLocF(maxLoc);

如果需要具有该签名的函数,可以在包装函数中应用它,或者更改OpenCV源代码并重新编译(不推荐)。