我试图在python中使用opencv运行相机校准。我正在使用:
cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)
它似乎适用于5个失真系数。但是,我想尝试在没有切向失真的情况下运行它,并且可能只有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)
distCoeffs – 4、5或8个元素的失真系数的输出向量。
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 切向失真系数设置为零并保持为零。
重要:在Python中,cv标志不要与CV_
开始。因此,我将从现在开始将其删除。
文档的含义是:
如果您已经相机矩阵 AND 失真系数矢量,则可以将其作为初始值提供给校准,然后从那里进行猜测(使用{{ 1}})。您可以使用CALIB_USE_INTRINSIC_GUESS
,…,CALIB_FIX_K1
标志来提供初始失真矢量并使它的某些分量变为静态(将始终是提供的值)。
但::如果您设置了CALIB_FIX_K6
,CALIB_FIX_K1
,CALIB_FIX_K2
,CALIB_FIX_K3
,CALIB_FIX_K4
或CALIB_FIX_K5
无需给出初始估算,它们将被设置为零。
请注意,结果distCoeffs向量将是:[{CALIB_FIX_K6
,K1
,K2
,tangential1
,tangential2
]。仅当您使用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)