在 Python 中使用 OpenCV 不扭曲点时的不良结果

Posted

技术标签:

【中文标题】在 Python 中使用 OpenCV 不扭曲点时的不良结果【英文标题】:Bad results when undistorting points using OpenCV in Python 【发布时间】:2014-02-25 22:15:05 【问题描述】:

我在使用 OpenCV 的 Python 绑定使用校准相机拍摄的图像上不失真点时遇到问题。未失真点的坐标与图像中检测到的原始点的坐标完全不同。

这是有问题的电话:

undistorted = cv2.undistortPoints(image_points,
                                  camera_matrix,
                                  distortion_coefficients)

其中image_points 是由cv2.findChessboardCorners 返回的检测到的棋盘角的numpy 数组,并重新调整形状以匹配cv2.undistortPoints 的尺寸要求,camera_matrixdistortion_coefficientscv2.calibrateCamera 返回。

camera_matrixdistortion_coefficients 在我看来还可以,image_points 也是如此。尽管如此,distorted 似乎与image_points 没有任何关系。以下是值的摘要:

>>> image_points
array([[[ 186.95303345,  163.25502014]],

       [[ 209.54478455,  164.62690735]],

       [[ 232.26443481,  166.10734558]],

       ..., 

       [[ 339.03695679,  385.97784424]],

       [[ 339.20108032,  400.38635254]],

       [[ 339.13067627,  415.30780029]]], dtype=float32)
>>> undistorted
array([[[-0.19536583, -0.07900728]],

       [[-0.16608481, -0.0772614 ]],

       [[-0.13660771, -0.07537176]],

       ..., 

       [[ 0.00228534,  0.21044853]],

       [[ 0.00249786,  0.22910291]],

       [[ 0.00240568,  0.24841554]]], dtype=float32)
>>> camera_matrix
array([[ 767.56947802,    0.        ,  337.27849576],
   [   0.        ,  767.56947802,  224.04766824],
   [   0.        ,    0.        ,    1.        ]])
>>> distortion_coefficients
array([[ 0.06993424, -0.32645465,  0.        ,  0.        , -0.04310827]])

我正在使用参考 C 代码,并且在我调用之前一切都匹配。怎么了?

【问题讨论】:

【参考方案1】:

我认为您忘记在调用undistortPoints 时指定新相机矩阵。如果你看the documentation of the function,它会说签名是:

Python: cv.UndistortPoints(src, dst, cameraMatrix, distCoeffs, R=None, P=None) → None

其中dst 是未失真后的点数组,“如果P 是恒等或省略,则它包含归一化点坐标”,意思是在使用校准矩阵投影到图像之前。

如果您将P 设置为您的cameraMatrix,该函数应该会执行您所期望的操作。

【讨论】:

做到了!我使用了来自cv2的(未记录的)签名:cv2.undistortPoints(image_points, camera_matrix, distortion_coefficients, P=camera_matrix) 我对 undistortPoints 到底在做什么有点困惑,文档中的理想图像坐标是什么意思? @PyWalker2797 理想图像坐标是 2D 图像坐标,如果镜头是理想的零失真,则可以观察到该坐标。对于真正的非理想镜头,您必须考虑失真,这会在图像坐标上增加偏移。更多相机投影模型详情请见here。 那么 undistortPoints 根据零镜头畸变给我们返回图像坐标?

以上是关于在 Python 中使用 OpenCV 不扭曲点时的不良结果的主要内容,如果未能解决你的问题,请参考以下文章

使用opencv3鱼眼模型的圆形鱼眼扭曲

OpenCV:录制扭曲的视频

如何在opencv中对鱼眼图像生成的去扭曲?

人脸检测实战终极:使用 OpenCV 和 Python 进行人脸对齐

实战用OpenCV实现页面扭曲矫正

通过鱼眼扭曲功能扭曲直线并在图像中正确绘制