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 张不同角度、不同位置的棋盘格图像。标定板需要覆盖图像的不同区域,包括中心和边缘,并且要有一定的倾斜角度,以约束焦距和畸变参数。如果所有图像都正对相机,标定结果会不稳定。
四、标定板选择与拍摄要点
标定板的选择直接影响标定质量。常见标定板有棋盘格、圆点阵列、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 通常为负值(桶形畸变),若绝对值过大,需确认镜头类型是否匹配模型。
总结来说,针孔模型给出了空间点到像素点的理想映射,畸变模型修正了真实镜头的偏差,内参矩阵把两者统一为可计算的参数集合,张正友标定法提供了从多张平面标定板图像求解这些参数的方法,而重投影误差则是判断标定是否可用的核心依据。掌握这条链路,才能为后续的手眼标定和抓取位姿转换打下可靠基础。