仅校准径向失真的相机

时间:2016-11-23 22:21:54

标签: python opencv camera-calibration

我试图在python中使用opencv运行相机校准。我正在使用:

cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)

它似乎适用于5个失真系数。但是,我想尝试在没有切向失真的情况下运行它,并且可能只有2个径向失真系数。这可能吗?

2 个答案:

答案 0 :(得分:0)

我找到了答案。

没有切向扭曲:

 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None, 4,None,None,cv2.CALIB_ZERO_TANGENT_DIST,
                                                   criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 2e-16))

对于仅2个径向失真系数,似乎文档建议使用4而不是5来表示系数。这似乎不起作用。相反,我修复了k3参数:

ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None, 4,None,None,cv2.CALIB_ZERO_TANGENT_DIST+cv2.CALIB_FIX_K3,
                                                   criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 2e-16))

答案 1 :(得分:0)

The relevant documentation

distCoeffs – 4、5或8个元素的失真系数formula的输出向量。

CV_CALIB_USE_INTRINSIC_GUESS cameraMatrix包含有效的初始 进一步优化的fx,fy,cx,cy值。否则,(cx, cy)最初设置为图像中心(使用imageSize),并且 焦距以最小二乘法计算。请注意,如果 内部参数是已知的,不需要使用此功能 只是为了估计外部参数。改用solvePnP()。

CV_CALIB_FIX_K1,...,CV_CALIB_FIX_K6 在优化过程中,失真系数不变。如果 设置了CV_CALIB_USE_INTRINSIC_GUESS,由提供的系数 使用distCoeffs矩阵。否则,它设置为0。

CV_CALIB_ZERO_TANGENT_DIST 切向失真系数formula设置为零并保持为零。

重要:在Python中,cv标志不要与CV_开始。因此,我将从现在开始将其删除。


文档的含义是:

如果您已经相机矩阵 AND 失真系数矢量,则可以将其作为初始值提供给校准,然后从那里进行猜测(使用{{ 1}})。您可以使用CALIB_USE_INTRINSIC_GUESS,…,CALIB_FIX_K1标志来提供初始失真矢量并使它的某些分量变为静态(将始终是提供的值)。

但::如果您设置了CALIB_FIX_K6CALIB_FIX_K1CALIB_FIX_K2CALIB_FIX_K3CALIB_FIX_K4CALIB_FIX_K5无需给出初始估算,它们将被设置为零

请注意,结果distCoeffs向量将是:[{CALIB_FIX_K6K1K2tangential1tangential2]。仅当您使用K3明确要求OpenCV时,它才会为您提供K4,K5或K6。

因此,如果您不希望切向畸变因子,而只想要两个径向畸变因子,则可以提供CALIB_RATIONAL_MODEL。您不需要flags=CALIB_FIX_K3 + CALIB_ZERO_TANGENT_DIST或仅将其作为distCoeffs传递。

distCoeffs=None

这将导致这样的失真矢量:

success, mtx, distCoeffs, rvecs, tvecs = cv2.calibrateCamera( objectPoints, imagePoints, (width, height), flags=CALIB_FIX_K3 + CALIB_ZERO_TANGENT_DIST) print(distCoeffs)