使用OpenCV3.6双目相机校准:棋盘格尺寸设置及参数疑问
关于双目相机棋盘格校准的几个关键点解答
嘿,别担心,新手刚接触相机校准的时候,很容易把这些参数搞混,我来给你理清楚:
1. 棋盘格尺寸是校准的必要步骤,且需要提前设置
棋盘格的尺寸(准确说是内角点的行列数,比如常见的9x6指的是每行9个内角点、每列6个,不是棋盘格的方块数量)是校准的核心参数之一,你需要在生成世界坐标系下的三维点集合(也就是你的代码里的objpoints_l)时就明确它:
举个典型的生成代码例子:
import numpy as np # 假设你的棋盘格是8行6列的内角点(对应9x7个黑白方块) nx, ny = 8, 6 # 生成世界坐标系下的点(z轴默认为0) objp = np.zeros((nx * ny, 3), np.float32) objp[:, :2] = np.mgrid[0:nx, 0:ny].T.reshape(-1, 2)
这个nx和ny就是你要设置的棋盘格尺寸,后续的objpoints_l就是把这个objp复制到每个成功检测到棋盘格的图像对应的列表里。如果这一步没正确设置,cv2.calibrateCamera和cv2.stereoCalibrate都会得到错误的校准结果。
2. 你的criteria里的30不是棋盘格尺寸
先看你的准则代码:
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
这里的三个参数分别代表:
cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER:终止迭代的条件是满足其中一个即可30:最大迭代次数,意思是迭代最多跑30轮就停止0.001:误差阈值,当迭代的误差小于0.001时就停止
完全和棋盘格尺寸没有关系,这个参数是用来优化角点亚像素精度、以及校准过程中的迭代收敛判断的。
3. 关于cv2.stereoCalibrate的补充说明
你调用的cv2.stereoCalibrate函数里,gray_l.shape[::-1]是传入的图像尺寸(宽和高),而棋盘格的尺寸信息其实已经包含在objpoints_l里了——因为objpoints_l的每个元素都是对应棋盘格内角点数量的三维点集合,函数会自动从这里获取对应的点数量信息。
总结一下:棋盘格尺寸要在生成objpoints时就设置好,你的criteria里的30是最大迭代次数,和棋盘格无关~
内容的提问来源于stack exchange,提问作者gaetano ma
相关产品推荐
相关产品推荐

