我在使用OpenCV的Python绑定使用校准相机拍摄的图像上没有失真点时遇到问题。未失真点的坐标与图像中检测到的原始点完全不同。
以下是令人不快的电话:
undistorted = cv2.undistortPoints(image_points,
camera_matrix,
distortion_coefficients)
其中image_points
是由cv2.findChessboardCorners
返回的检测到的棋盘角落的数量块,并重新整形以匹配cv2.undistortPoints
,camera_matrix
和distortion_coefficients
的尺寸要求由cv2.calibrateCamera
返回。
camera_matrix
和distortion_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代码,所有内容都匹配,直到我拨打电话。出了什么问题?
答案 0 :(得分:8)
我认为您忘记在致电undistortPoints
时指定新相机矩阵。如果您查看the documentation of the function,则表示签名为:
Python: cv.UndistortPoints(src, dst, cameraMatrix, distCoeffs, R=None, P=None) → None
其中dst
是非失真后的点数组,“如果P
是同一性或省略,则它包含标准化点坐标”,意味着在使用校准矩阵投影到图像之前。
如果您将P
设置为cameraMatrix
,该功能应该符合您的预期。