3. 相机成像模型与内参标定

在机器人视觉引导抓取中,相机的作用是把三维世界中的点投影到二维图像上。要让机器人知道“图像里的这个像素对应空间中哪个位置”,就必须先建立相机的成像模型,并通过标定获得相机的内参。本节围绕针孔模型、畸变模型、内参矩阵、张正友标定法、标定板选择与标定误差评估展开,目标是让读者理解从空间点到像素点的完整映射链条,并能独立完成一次内参标定与结果判读。

一、针孔模型:从三维点到像素点

针孔模型是最常用的相机成像近似模型。它假设光线从物体表面出发,穿过一个理想的小孔,在成像平面上形成倒立的像。为便于计算,通常把成像平面等效地放到光心前方,得到正立的像,这就是“等效针孔模型”。

设相机坐标系下一点为 P_c = (X_c, Y_c, Z_c),其投影到图像上的像素坐标为 (u, v)。完整的投影关系可以写成:

u = fx * (X_c / Z_c) + cx
v = fy * (Y_c / Z_c) + cy

其中 fx、fy 是以像素为单位的焦距,cx、cy 是主点坐标,通常接近图像中心。写成矩阵形式就是内参矩阵 K:

K = [ fx   0   cx ]
    [  0  fy   cy ]
    [  0   0    1 ]

这里有一个关键约定:Z_c 是相机坐标系下沿光轴方向的距离,必须为正,表示点在相机前方。若使用 OpenCV 的像素坐标约定,图像原点在左上角,u 向右增大,v 向下增大。这个方向约定在后续手眼标定和抓取位姿计算中必须保持一致。

二、畸变模型:真实镜头的偏差

针孔模型是理想模型,真实镜头会引入畸变。最常见的两类是径向畸变和切向畸变。径向畸变使直线在图像边缘变弯,表现为桶形或枕形;切向畸变由镜头与成像平面不完全平行引起。

OpenCV 常用的畸变模型包含 5 个参数:k1、k2、p1、p2、k3。设归一化坐标为 (x, y),其中 x = X_c / Z_c,y = Y_c / Z_c,则畸变后的归一化坐标为:

r² = x² + y²
x_dist = x(1 + k1r² + k2r⁴ + k3r⁶) + 2p1xy + p2(r² + 2x²)
y_dist = y(1 + k1r² + k2r⁴ + k3r⁶) + p1(r² + 2y²) + 2p2xy

然后再用内参矩阵把畸变后的归一化坐标映射到像素坐标。实际标定中,如果使用鱼眼镜头或视场角很大,还需要使用鱼眼模型或更高阶畸变模型。对于普通工业相机和机器人抓取场景,5 参数模型通常足够。

三、张正友标定法:从多张棋盘格图像求解内参

张正友标定法利用一个平面标定板,在不同姿态下拍摄多张图像,通过平面单应性约束求解内参和畸变系数。其核心思想是:标定板平面上的点满足 Z_w = 0,因此世界坐标到像素坐标的映射可以简化为一个单应矩阵 H。

设标定板平面上的点为 (X_w, Y_w, 0),则:

s * [u, v, 1]^T = K * [r1 r2 t] * [X_w, Y_w, 1]^T

其中 r1、r2 是旋转矩阵的前两列,t 是平移向量。令 H = K * [r1 r2 t],由于旋转向量正交且长度为 1,可以得到两个约束方程。每张标定板图像提供一个单应矩阵,多个姿态下即可求解内参矩阵 K。之后再用最大似然估计优化所有参数,包括畸变系数。

实际操作中,通常拍摄 15~25 张不同角度、不同位置的棋盘格图像。标定板需要覆盖图像的不同区域,包括中心和边缘,并且要有一定的倾斜角度,以约束焦距和畸变参数。如果所有图像都正对相机,标定结果会不稳定。

相机内参标定流程与参数关系 标定板(棋盘格) 已知方格尺寸,如 25mm 多姿态拍摄 15~25 张图像 覆盖中心与边缘 倾斜角度 15°~45° 不同距离与旋转 避免全部正对相机 角点检测与单应 提取棋盘格角点 计算单应矩阵 H H = K [r1 r2 t] 正交约束 → 内参 输出 fx, fy cx, cy k1,k2,k3 p1, p2 内参矩阵与畸变参数关系 内参矩阵 K [ fx 0 cx ] [ 0 fy cy ] [ 0 0 1 ] fx, fy:像素焦距 畸变参数 径向:k1, k2, k3 切向:p1, p2 r² = x² + y² 边缘畸变更明显 误差评估 重投影误差 RMSE 单位:像素 一般 < 0.5 px 可接受 检查每张图像误差分布

四、标定板选择与拍摄要点

标定板的选择直接影响标定质量。常见标定板有棋盘格、圆点阵列、ArUco 码和 ChArUco 板。棋盘格角点检测精度高,适合普通镜头;圆点阵列对模糊和噪声更鲁棒,但圆心提取存在偏心误差;ChArUco 板结合了棋盘格和 ArUco 码的优点,即使部分遮挡也能识别,适合现场快速标定。

选择标定板时需要考虑:

  • 尺寸:标定板应占据图像面积的 1/3 到 2/3,太小会导致角点定位精度不足,太大则难以覆盖边缘区域。
  • 方格精度:打印或加工精度应优于 0.01mm,否则会直接引入系统误差。
  • 平整度:标定板必须平整,翘曲会破坏平面假设,导致内参求解偏差。
  • 材质:陶瓷或铝基板比纸质更稳定,适合工业现场反复使用。

拍摄时,让标定板在图像中呈现不同位置和角度。建议至少包含:正对相机、左右倾斜、上下倾斜、旋转 45°、靠近边缘等姿态。每张图像中棋盘格应完整可见,避免过曝、欠曝和运动模糊。

五、标定误差评估与结果判读

标定完成后,最重要的评估指标是重投影误差。它表示用标定得到的内参和畸变系数,把世界坐标点重新投影到图像上,与检测到的角点位置之间的平均距离。OpenCV 的 calibrateCamera 会返回总体 RMS 误差和每张图像的误差。

ret, K, dist, rvecs, tvecs = cv2.calibrateCamera(
    object_points, image_points, image_size, None, None)
print("RMS:", ret)
print("K:\n", K)
print("dist:", dist)

判读标定结果时,可以从以下几个方面检查:

  • 总体 RMS:一般要求小于 0.5 像素;若大于 1 像素,说明拍摄质量或标定板精度存在问题。
  • 单张图像误差:如果某张图像误差明显偏大,应检查该图像是否存在模糊、角点误检或标定板倾斜过大。
  • fx 与 fy 的比值:对于方形像素相机,fx/fy 应接近 1;若偏差超过 5%,需检查标定板是否平整或图像是否存在拉伸。
  • 主点位置:cx、cy 应接近图像中心;若偏离过大,可能是角点分布不均匀或镜头存在明显偏心。
  • 畸变系数:k1 通常为负值(桶形畸变),若绝对值过大,需确认镜头类型是否匹配模型。
标定不是一次性的工作。相机受到碰撞、温度变化或镜头重新调焦后,内参可能发生变化。在机器人抓取系统中,建议定期复标,或在抓取精度下降时优先检查标定状态。
不要用标定图像本身去评估标定精度后就直接投入抓取。正确做法是:用标定结果去畸变一张新图像,观察直线是否恢复为直线;再用已知尺寸的物体验证像素到物理尺寸的换算是否准确。只有独立验证通过,标定结果才可用于手眼标定和抓取位姿计算。

总结来说,针孔模型给出了空间点到像素点的理想映射,畸变模型修正了真实镜头的偏差,内参矩阵把两者统一为可计算的参数集合,张正友标定法提供了从多张平面标定板图像求解这些参数的方法,而重投影误差则是判断标定是否可用的核心依据。掌握这条链路,才能为后续的手眼标定和抓取位姿转换打下可靠基础。