3. 相机成像原理:针孔相机模型、内参矩阵、畸变模型与标定流程

在 Eye-in-Hand 系统中,相机固定在机器人末端,其成像质量与几何精度直接决定了抓取位姿的准确性。理解相机如何将三维世界映射到二维图像,是后续标定与位姿解算的数学基础。本节从经典的针孔模型出发,逐步引入内参矩阵、畸变模型,并概述相机标定的完整流程。

3.1 针孔相机模型

针孔相机模型是几何光学中最简化的成像模型。它假设光线通过一个无限小的孔径(针孔)在成像平面上形成倒立的实像。为便于数学描述,通常将成像平面对称到相机前方,形成虚拟成像平面,使图像保持正立。

设空间点 P 在相机坐标系下的坐标为 (X, Y, Z),其在图像平面上的投影点 p 的像素坐标为 (u, v)。根据相似三角形关系,有:

u = f_x * (X / Z) + c_x
v = f_y * (Y / Z) + c_y

其中:

  • f_x, f_y:分别为 x 和 y 方向上的焦距(以像素为单位),通常 f_x ≈ f_y。
  • c_x, c_y:主点(光轴与成像平面交点)的像素坐标,通常位于图像中心附近。
关键理解:针孔模型本质上是透视投影,即从 3D 到 2D 的降维映射。深度 Z 出现在分母中,导致“近大远小”的透视效应。该模型是线性的,但实际镜头会引入非线性畸变。

3.2 内参矩阵

将上述投影关系写成齐次坐标形式,得到相机内参矩阵 K:

    [ f_x   0   c_x ]
K = [  0   f_y  c_y ]
    [  0    0    1  ]

内参矩阵将相机坐标系下的 3D 点映射到像素坐标系。其参数完全由相机内部光学结构决定,与相机在世界中的位姿无关。下表总结了内参矩阵各元素的物理含义:

参数 符号 物理含义 典型值范围
焦距 x f_x 镜头焦距在像素宽度上的度量 500 ~ 2000
焦距 y f_y 镜头焦距在像素高度上的度量 500 ~ 2000
主点 x c_x 光轴在图像上的列坐标 图像宽度/2
主点 y c_y 光轴在图像上的行坐标 图像高度/2
标定目标:相机标定的核心任务之一就是精确估计内参矩阵 K 中的四个参数(f_x, f_y, c_x, c_y),以及后续的畸变系数。

3.3 畸变模型

实际镜头并非理想针孔,光线通过透镜时会发生折射,导致图像产生畸变。畸变主要分为两类:径向畸变和切向畸变。

3.3.1 径向畸变

径向畸变由透镜形状不完美引起,光线离光轴越远,弯曲程度越大。表现为图像边缘的直线向内(桶形畸变)或向外(枕形畸变)弯曲。数学模型使用泰勒级数展开:

x_distorted = x * (1 + k1 * r^2 + k2 * r^4 + k3 * r^6)
y_distorted = y * (1 + k1 * r^2 + k2 * r^4 + k3 * r^6)

其中 (x, y) 是归一化平面上的理想坐标,r² = x² + y²,k1, k2, k3 为径向畸变系数。对于普通镜头,通常只使用 k1, k2;对于鱼眼或广角镜头,需要 k3。

3.3.2 切向畸变

切向畸变由镜头与成像平面不平行(装配误差)引起。数学模型为:

x_distorted = x + [2 * p1 * x * y + p2 * (r^2 + 2 * x^2)]
y_distorted = y + [p1 * (r^2 + 2 * y^2) + 2 * p2 * x * y]

其中 p1, p2 为切向畸变系数。

标定注意事项:畸变系数通常有 5 个(k1, k2, p1, p2, k3)。在 Eye-in-Hand 标定中,畸变校正必须优先进行,否则后续的手眼标定和位姿计算会引入系统性误差。建议在标定前先对相机做一次完整的单目标定。

3.4 相机标定流程概述

相机标定的目的是求解内参矩阵 K 和畸变系数。最常用的方法是张正友标定法,使用棋盘格标定板。完整流程如下:

  1. 准备标定板:打印一张棋盘格(如 9×6 内角点),粘贴在平整平面上。
  2. 采集图像:从不同角度、不同距离拍摄 15~25 张标定板图像,确保棋盘格覆盖图像各个区域。
  3. 角点检测:使用 OpenCV 的 findChessboardCorners() 提取亚像素级角点坐标。
  4. 初始化内参:基于针孔模型和单应性矩阵,闭式求解内参初值。
  5. 非线性优化:使用 Levenberg-Marquardt 算法,最小化重投影误差,同时优化内参和畸变系数。
  6. 评估结果:计算平均重投影误差,通常应小于 0.5 像素。

下表总结了标定流程中的关键步骤与输出:

步骤 输入 输出 常用函数 (OpenCV)
角点检测 标定板图像 2D 角点坐标 findChessboardCorners()
标定计算 2D-3D 点对 内参 K, 畸变系数 calibrateCamera()
畸变校正 原始图像 + K + 畸变系数 去畸变图像 undistort()
重投影验证 标定结果 + 原始点对 重投影误差 projectPoints()

3.5 成像与畸变校正流程 SVG

下图展示了从三维世界点到最终像素坐标的完整成像链路,以及畸变校正的介入位置:

相机成像与畸变校正流程 相机成像与畸变校正流程 3D 世界点 针孔投影 理想像素坐标 畸变模型 实际像素坐标 畸变校正 说明 标定过程同时估计内参矩阵和畸变系数;畸变校正在实际像素坐标与理想像素坐标之间建立映射关系。

3.6 标定结果验证与使用

标定完成后,应使用 calibrateCamera() 返回的重投影误差(RMS)评估标定质量。经验法则:

  • RMS < 0.3 像素:优秀
  • RMS 0.3 ~ 0.5 像素:良好
  • RMS > 0.5 像素:需检查标定板图像质量或增加图像数量

在 Eye-in-Hand 系统中,标定结果将用于:

  1. 对实时图像进行畸变校正(undistort())。
  2. 结合手眼标定结果,将 2D 检测点反投影为 3D 空间射线。
  3. 计算目标物体在机器人基坐标系下的精确位姿。
实践建议:在 Eye-in-Hand 标定前,务必先完成相机的单目标定并保存内参和畸变系数。后续所有图像处理步骤(如特征提取、位姿估计)都应在去畸变图像上进行,以保证几何一致性。