疑问:undistortPoints()与remap()畸变校正后,结果相差很大

    最近在做图像点畸变校正相关的项目,发现OpenCV中的校正函数:undistortPoints()与remap()二者矫正畸变后,结果相差很大,原因不明,这里记录下来,如有大神知其中差异,请赐教,感激不尽,欢迎在博客下方评论。
    下面先说一下函数的用法
undistortPoints()函数用法说明
void undistortPoints(InputArray src, OutputArray dst, InputArray cameraMatrix, InputArray distCoeffs, InputArrayR=noArray(), InputArray P=noArray())

参数说明:
疑问:undistortPoints()与remap()畸变校正后,结果相差很大_第1张图片
正确调用方法:
调用方法
std::vectorcv::Point2f inputDistortedPoints = …
std::vectorcv::Point2f outputUndistortedPoints;
cv::Mat cameraMatrix = …
cv::Mat distCoeffs = …

cv::undistortPoints(inputDistortedPoints, outputUndistortedPoints, cameraMatrix, distCoeffs, cv::noArray(), cameraMatrix);
不要像下面这样调用,输出的点为图像物理坐标系下坐标,结果很小,需再乘内参矩阵得到像面点坐标
cv::undistortPoints(inputDistortedPoints, outputUndistortedPoints, cameraMatrix, distCoeffs)

关于initUndistortRectifyMap()和remap()组合进行畸变校正的用法可参考如下博客,这里不再详述:
remap()畸变校正参考博客

    二者进行畸变校正后的比较,首先提取出了未进行畸变校正的一些特征点,如图1所示
疑问:undistortPoints()与remap()畸变校正后,结果相差很大_第2张图片
                                                                                  图1
使用undistortPoints()进行校正特征点,结果如图2

疑问:undistortPoints()与remap()畸变校正后,结果相差很大_第3张图片
                                                                                  图2
使用initUndistortRectifyMap()和remap()组合进行畸变校正结果如图3
疑问:undistortPoints()与remap()畸变校正后,结果相差很大_第4张图片
                                                                                  图3
    从结果可看出undistortPoints()校正效果特别不明显,原因不明,如有懂得小伙伴请指点一二,非常感谢~

你可能感兴趣的:(opencv)