You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:45:46