首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只对摄像机进行径向畸变标定

只对摄像机进行径向畸变标定
EN

Stack Overflow用户
提问于 2016-11-23 22:21:54
回答 2查看 2.8K关注 0票数 1

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

代码语言:javascript
复制
cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)

对于5个失真系数,它似乎工作得很好。然而,我想尝试运行它没有切向失真,可能只有2个径向失真系数。这有可能吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-14 18:10:19

我找到了答案。

没有切线扭曲:

代码语言:javascript
复制
 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参数:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-10-05 02:33:25

相关文献

distCoeffs -失真系数的输出矢量

[](https://chart.googleapis.com/chart?cht=tx&chl=(k_1%2C%20k_2%2C%20p_1%2C%20p_2%5B%2C%20k_3%5B%2C%20k_4%2C%20k_5%2C%20k_6%20%5B%2C%20s_1%2C%20s_2%2C%20s_3%2C%20s_4%5B%2C%20%5Ctau_x%2C%20%5Ctau_y%5D%5D%5D%5D%29)

由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_K1CALIB_FIX_K2CALIB_FIX_K3CALIB_FIX_K4CALIB_FIX_K5CALIB_FIX_K6,那么将被设置为零E 230

注意,结果distCoeffs向量将是:K1K2tangential1tangential2K3。只有当您明确要求使用OpenCV时,K4、K5或K6才会给您。

所以,如果你不想要切向失真因子和两个径向失真因子,你可以提供flags=CALIB_FIX_K3 + CALIB_ZERO_TANGENT_DIST。您不需要distCoeffs,也不需要将其作为distCoeffs=None传递。

代码语言:javascript
复制
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. ]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40775102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档