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:主点(光轴与成像平面交点)的像素坐标,通常位于图像中心附近。
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 |
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 为切向畸变系数。
3.4 相机标定流程概述
相机标定的目的是求解内参矩阵 K 和畸变系数。最常用的方法是张正友标定法,使用棋盘格标定板。完整流程如下:
- 准备标定板:打印一张棋盘格(如 9×6 内角点),粘贴在平整平面上。
- 采集图像:从不同角度、不同距离拍摄 15~25 张标定板图像,确保棋盘格覆盖图像各个区域。
- 角点检测:使用 OpenCV 的
findChessboardCorners()提取亚像素级角点坐标。 - 初始化内参:基于针孔模型和单应性矩阵,闭式求解内参初值。
- 非线性优化:使用 Levenberg-Marquardt 算法,最小化重投影误差,同时优化内参和畸变系数。
- 评估结果:计算平均重投影误差,通常应小于 0.5 像素。
下表总结了标定流程中的关键步骤与输出:
| 步骤 | 输入 | 输出 | 常用函数 (OpenCV) |
|---|---|---|---|
| 角点检测 | 标定板图像 | 2D 角点坐标 | findChessboardCorners() |
| 标定计算 | 2D-3D 点对 | 内参 K, 畸变系数 | calibrateCamera() |
| 畸变校正 | 原始图像 + K + 畸变系数 | 去畸变图像 | undistort() |
| 重投影验证 | 标定结果 + 原始点对 | 重投影误差 | projectPoints() |
3.5 成像与畸变校正流程 SVG
下图展示了从三维世界点到最终像素坐标的完整成像链路,以及畸变校正的介入位置:
3.6 标定结果验证与使用
标定完成后,应使用 calibrateCamera() 返回的重投影误差(RMS)评估标定质量。经验法则:
- RMS < 0.3 像素:优秀
- RMS 0.3 ~ 0.5 像素:良好
- RMS > 0.5 像素:需检查标定板图像质量或增加图像数量
在 Eye-in-Hand 系统中,标定结果将用于:
- 对实时图像进行畸变校正(
undistort())。 - 结合手眼标定结果,将 2D 检测点反投影为 3D 空间射线。
- 计算目标物体在机器人基坐标系下的精确位姿。