什么是标定图案?为何需要使用?
可打印的平面标定图案主要用途:
- 相机内参标定:求解相机内部参数,详见OpenCV官方《相机标定》教程。
- 双目/多相机系统外参标定:求解各相机间外部参数(旋转矩阵、平移向量),详情参见
cv::stereoCalibrate函数。 - 相机位姿配准:标定相机相对三维世界已知坐标点的位姿,可参考OpenCV 5.x多视角标定教程。
标定图案类型
1. 棋盘格图案
经典黑白相间方格标定图案。所有标定算法均以棋盘格内角点作为特征点。
可通过cv::findChessboardCorners检测棋盘格,再用cv::cornerSubPix做亚像素级角点坐标精修。
棋盘格尺寸以内角点行列数定义,而非黑白方格数量。
⚠️ 关键注意点:
- 若某一维度角点数量为偶数,位姿存在180°歧义解(2种解);
- 若为N×N正方形棋盘格,位姿存在90°歧义解(4种解);
- 以上两种有歧义的棋盘格不适合用于标定。
标定物点坐标生成示例代码:
std::vector<cv::Point3f> objectPoints;
for (int i = 0; i < boardSize.height; ++i) {
for (int j = 0; j < boardSize.width; ++j) {
objectPoints.push_back(Point3f(j*squareSize, i*squareSize, 0));
}
}
可打印棋盘格模板:https://github.com/opencv/opencv/blob/4.x/doc/pattern.png
(9×6内角点棋盘格,A4纸张尺寸:宽210mm、高297mm)

2. 圆点网格图案
分为对称圆点网格与非对称圆点网格(偶数行圆点错位排布),白底黑圆或黑底白圆均可。
通过cv::findCirclesGrid函数检测,可直接输出亚像素级圆心坐标,无需额外精修。
网格尺寸以横竖方向圆点总数定义;非对称网格需额外计入行错位偏移量,适用于相机内参标定。
对称圆点网格存在和偶数棋盘格相同问题:位姿存在180°歧义解。
对称圆点网格物点生成代码:
std::vector<cv::Point3f> objectPoints;
for (int i = 0; i < boardSize.height; ++i) {
for (int j = 0; j < boardSize.width; ++j) {
objectPoints.push_back(Point3f(j*squareSize, i*squareSize, 0));
}
}
非对称圆点网格物点生成代码:
std::vector<cv::Point3f> objectPoints;
for (int i = 0; i < boardSize.height; i++) {
for (int j = 0; j < boardSize.width; j++) {
objectPoints.push_back(Point3f((2 * j + i % 2)*squareSize, i*squareSize, 0));
}
}
可打印非对称圆点网格模板:https://github.com/opencv/opencv/blob/4.x/doc/acircles_pattern.png
(11×4非对称圆点网格,A4尺寸)

3. ChAruco棋盘格(棋盘格+ArUco标记融合图案)
在传统棋盘格基础上嵌入ArUco标记,每个内角点由相邻两个ArUco标记唯一标识。
图案尺寸以单元行列数定义,N×M规格ChAruco板等效于(N-1)×(M-1)棋盘格。
OpenCV提供cv::aruco::CharucoDetector专用检测类:先识别ArUco标记,再依据标记配对关系拼接还原完整棋盘格。
相比前两种图案优势:支持局部遮挡检测(所有角点均带唯一标识)、具备旋转不变性。
⚠️ 限制:检测器必须预先知晓所用ArUco字典及标记排布,无法随机匹配未知标记集的ChAruco板。
ChAruco板物点生成代码:
std::vector<cv::Point3f> objectPoints;
for (int i = 0; i < boardSize.height-1; ++i) {
for (int j = 0; j < boardSize.width-1; ++j) {
objectPoints.push_back(Point3f(j*squareSize, i*squareSize, 0));
}
}
可打印ChAruco模板:https://github.com/opencv/opencv/blob/4.x/doc/charuco_board_pattern.png
(7×5规格,方格边长30mm,ArUco标记边长15mm,采用DICT_5X5_100字典,A4尺寸)

自定义标定图案
若官方模板无法满足需求,可自行生成图案。
OpenCV源码目录apps/pattern-tools或发行版中提供generate_pattern.py生成工具,仅需Python3环境即可运行。
生成示例命令
- 生成9行6列、方格边长20mm的棋盘格,保存为
chessboard.svg:
python generate_pattern.py -o chessboard.svg --rows 9 --columns 6 --type checkerboard --square_size 20
- 生成7行5列、圆点半径15mm的圆点网格:
python generate_pattern.py -o circleboard.svg --rows 7 --columns 5 --type circles --square_size 15
- 生成7行5列、方格边长10mm、圆点间距缩小的非对称圆点网格:
python generate_pattern.py -o acircleboard.svg --rows 7 --columns 5 --type acircles --square_size 10 --radius_rate 2
- 生成适配
findChessboardCornersSB()的Radon棋盘格,指定标记单元格位置:
python generate_pattern.py -o radon_checkerboard.svg --rows 10 --columns 15 --type radon_checkerboard -s 12.1 -m 7 4 7 5 8 5
- 生成7行5列ChAruco板:方格30mm、标记15mm,使用DICT_5X5_100字典:
python generate_pattern.py -o charuco_board.svg --rows 7 --columns 5 -T charuco_board --square_size 30 --marker_size 15 -f DICT_5X5_100.json.gz
工具参数说明
-u:切换单位(毫米mm、英寸inches、像素px、米m);-w/-h:自定义纸张宽高尺寸;- 自定义ChAruco:指定私有字典文件路径即可。
自定义ArUco字典
可通过示例工具samples/cpp/aruco_dict_utils.cpp生成私有字典:
bin/example_cpp_aruco_dict_utils.exe my_dict.json -nMarkers=30 -markerSize=5
生成含30个标记、5位编码的字典文件my_dict.json。
图案尺寸选型
标定图案由物理整体尺寸、单元(方格/圆点)物理尺寸、特征点数量共同决定,影响标定精度的核心因素:
-
特征点数量
OpenCV标定接口内置优化与随机一致性算法,特征点越多,优化约束越强、标定精度越高。若图案特征点偏少,可通过增加标定采样图片数量补偿精度。 -
单元尺寸
单元物理尺寸与拍摄距离、像素占比强相关。各检测算法均有最小可检测阈值:圆点网格看半径、棋盘格看方格边长、ChAruco看ArUco标记尺寸。
通用建议:增大图案在画面中的像素占比,可降低检测误差。 -
整体板尺寸
图案需完整入镜、成像清晰、可稳定检测。常规场景下大板标定效果更优,小幅图案则更利于精细角点拟合。
通用标定实操建议
- 标定图案纸张尽量平整无褶皱,提升标定精度;
- 优先选用哑光纸质,镜面反光易产生光斑、阴影,严重干扰图案检测;
- 多数检测算法依赖图案外围黑白边框,请勿裁剪、遮挡边缘边框。
专业术语对照表
| 英文术语 | 中文释义 |
|---|---|
| camera calibration | 相机标定 |
| pose estimation | 位姿估计 |
| intrinsics | 内参 |
| extrinsics | 外参 |
| sub-pixel accuracy | 亚像素精度 |
| stereoCalibrate | 双目标定 |
| Cheesboard | 棋盘格 |
| Circles Grid | 圆点网格 |
| ChAruco board | ChAruco融合标定板 |
| ArUco markers | ArUco标记 |
| object points | 标定物点 |
| rotation/translation | 旋转/平移 |
| pattern ambiguity | 图案歧义解 |
&spm=1001.2101.3001.5002&articleId=160930399&d=1&t=3&u=3c13c2f1de8248ce843a4e2ef62f8ba0)
7847

被折叠的 条评论
为什么被折叠?



