我试图运行相机校准使用opencv在python。我在用:
cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)对于5个失真系数,它似乎工作得很好。然而,我想尝试运行它没有切向失真,可能只有2个径向失真系数。这有可能吗?
发布于 2017-11-14 18:10:19
我找到了答案。
没有切线扭曲:
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))发布于 2020-10-05 02:33:25
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切向畸变系数
[](https://chart.googleapis.com/chart?cht=tx&chl=(p_1,%20p_2%29)
设置为零并保持为零。
重要:在CV_中,cv标志不以CV_开头。所以从现在开始我要把它们移走。
文件的含义是:
如果你已经有一个相机矩阵和失真系数向量,你可以把它们作为一个初始值提供给校准,让它从那里猜测(使用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或CALIB_FIX_K6,那么将被设置为零E 230。
注意,结果distCoeffs向量将是:K1、K2、tangential1、tangential2、K3。只有当您明确要求使用OpenCV时,K4、K5或K6才会给您。
所以,如果你不想要切向失真因子和两个径向失真因子,你可以提供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)这将导致像这样的失真矢量:
[ 0.10509459 -0.31389323 0. 0. 0. ]
https://stackoverflow.com/questions/40775102
复制相似问题