最近在使用HandBot-S1采集的数据进行相机内参标定的过程中,踩过坑也收获不少。总结以了几个方面的内容,希望能帮你少走弯路,高效搞定标定!

一. 相机内参是什么?
内参(Intrinsics):就是相机自己的视力参数——它决定了三维世界中的点,在拍成照片时会落在图像的哪个位置。

如图所示一个空间三维点(X,Y,Z),投影到那一个像素坐标(U,V)上,就是由相机的内参所决定。
二. 常见的相机模型与畸变模型

注:Kalibr没有独立的fisheye投影模型,而是通过 pinhole 投影 + equidistant 畸变来建模鱼眼相机。这是其与OpenCV的fisheye模型的主要区别。
三. 如何进行内参标定?
3.1 准备标定板
这里我们使用Apriltag标定板,参数文件详解如下。

target_type: 'aprilgrid' #标定板类型:使用AprilTag阵列(AprilGrid)
tagCols: 4 # 列有4个AprilTag
tagRows: 6 # 行有6个AprilTag
tagSize: 0.07 # 单个AprilTag的边长tagSpacing: 0.3 # 白色间隔与tagSize的比值
codeOffset: 0 # 第一个AprilTag的ID起始编号
3.2 采集数据
这里我们用HandBot-S1录制采集数据,需要注意:标定板的位姿尽量丰富一些,使其出现在相机画面的各个位置;保持标定板清晰、无运动模糊。
3.3 运行标定命令
单目相机标定

双目相机标定

注:输出包含两个相机各自的内参,以及它们之间的相外参。
鱼眼相机标定(单目或双目)

关键:必须使用equidistant畸变模型,否则标定结果会很差。
3.4 输出结果说明
程序会输出三个文件:

.pdf:PDF版本的结果报告,包含重投影误差和标定姿态分布。
.txt:以文本文件储存的标定结果。
.yaml:以YAML格式储存的标定结果。

3.5 标定质量分析
- 看重投影误差:单目时重投影误差在1pix以内。
- 看标定板位姿是否丰富:尽量充满图像的所有区域。


注:重投影误差 > 1pixel时重新采集数据,避免模糊、遮挡、低纹理区域。
四. 新手如何避开常犯的三大典型误区?
平面不足——只有二维,没有三维:仅对一个静止平面进行多次拍摄,若该平面本身未发生空间姿态变化(即仅有平移、无旋转,尤其缺乏Z方向的高度变化),那么所有图像在几何上提供的信息本质上是冗余的——看似拍了20张,实则只相当于一张图像的约束。
解决方案 至少从3~5个不同的空间位置进行拍摄;其中应包含 至少2~3次明显的高度变化(Z方向位移);平面不能仅做平移,必须引入旋转或倾斜。这样才能确保多视角图像提供真正独立的三维信息,支撑可靠的重建或标定。
姿态单一(没有旋转,就没有几何信息):如果标定过程中相机或标定板的姿态缺乏有效旋转——例如仅轻微倾斜、仅沿单一方向移动,或所有姿态几乎共面——那么各图像之间的几何差异极小。算法难以从中提取足够的三维约束,导致标定结果不稳定或精度低下。
解决方案: 覆盖X、Y、Z三个旋转轴,避免仅绕单一轴转动; 每个轴上的旋转角度建议不小于 10°–20°,以产生显著的视角变化; 姿态分布应尽量均匀,避免全部集中在同一空间象限(如只在左上前方),以提升标定的鲁棒性和参数可观测性。只有这样,才能为标定算法提供丰富且独立的几何信息。
角度过小:当旋转角度过小时,从数学和几何的角度来看,这些微小的变化几乎等同于没有旋转。这意味着算法无法有效捕捉到足够的空间变换信息,导致标定或重建的精度严重下降。
解决方案: 平面倾角应不小于15°,以保证有足够的几何变换; 图像中的角点需展示出明显的透视变化,这是评估平面是否正确旋转的重要指标之一,透视变化越大,提供的三维信息越丰富。
本文转载自【计算机视觉工坊】
注:文章版权归原作者所有,本文内容、图片、视频来自网络,仅供交流学习之用,如涉及版权等问题,请您告知,我们将及时处理。









