2、机器人视觉基础:相机模型、成像原理、内参外参、畸变校正、深度相机与RGB相机对比
机器人视觉抓取系统的第一步,是让机器人“看懂”三维世界。而这一切的起点,并非深度学习或点云处理,而是对相机本身物理特性的深刻理解。相机将三维空间映射到二维像素平面的过程,遵循着严格的几何光学规律。如果工程师不理解针孔模型、不清楚内参外参的物理含义、不会处理镜头畸变,那么后续任何高级算法——无论是手眼标定还是目标检测——都将建立在错误的地基之上。本章将系统拆解视觉系统的底层逻辑,从成像原理出发,厘清内参、外参、畸变与深度相机的核心差异,为后续手眼标定与抓取规划打下坚实的数学与物理基础。
上图展示了从世界坐标系到像素坐标系的完整映射链路。理解这条链路是掌握相机标定与手眼标定的关键。下面我们将逐一拆解每个环节的数学含义与工程实践要点。
2.1 针孔相机模型与成像几何
针孔模型是相机成像的最基本近似。它假设光线沿直线传播,穿过相机光心(小孔)后在成像平面上形成倒立的实像。实际相机使用透镜代替小孔,以增加进光量并缩短物理距离,但其几何关系仍可用针孔模型等效描述。核心数学表达式为:
λ * [u, v, 1]^T = K * [R|t] * [Xw, Yw, Zw, 1]^T
其中,K 为内参矩阵(3×3),[R|t] 为外参矩阵(3×4),λ 为深度缩放因子。内参矩阵具体形式为:
K = [fx 0 cx]
[ 0 fy cy]
[ 0 0 1]
fx、fy 分别为 x、y 方向上的归一化焦距(单位:像素),cx、cy 为主点坐标(光轴与成像平面的交点)。内参描述了相机本身的固有属性,一旦镜头与传感器固定,内参不再变化。
2.2 内参与外参的物理意义与标定方法
内参描述的是相机坐标系到像素坐标系的映射关系,它只与相机内部光学结构有关。而外参描述的是世界坐标系到相机坐标系的刚体变换(旋转矩阵 R 和平移向量 t),它取决于相机在世界中的安装位置与姿态。在机器人手眼标定中,外参正是我们最终要求解的目标之一。
| 参数类型 | 物理含义 | 维度 | 标定方法 | 在抓取中的作用 |
|---|---|---|---|---|
| 内参 K | 焦距、主点、像素尺寸 | 3×3 矩阵 | 棋盘格/圆点格多姿态拍摄 | 将像素坐标转换为相机坐标(归一化平面) |
| 外参 [R|t] | 相机在世界坐标系中的位姿 | 3×4 矩阵 | 手眼标定(AX=XB)或外部测量 | 将物体世界坐标转换到相机坐标系 |
| 畸变系数 | 镜头光学缺陷导致的非线性偏移 | 5 个参数 (k1,k2,p1,p2,k3) | 与内参同时标定 | 校正像素位置,提高三维定位精度 |
标定流程通常遵循以下步骤:
- 采集图像:使用棋盘格标定板,在视场内移动 15-25 个不同位置,覆盖画面中心与边缘,并保证标定板与成像平面有一定夹角(约 30°-45°)。
- 角点检测:使用 OpenCV 的
findChessboardCorners提取亚像素级角点坐标。 - 求解初值:基于单应性矩阵估计内参初值,再通过最小二乘优化外参。
- 非线性优化:使用 Levenberg-Marquardt 算法最小化重投影误差,同时优化内参、外参与畸变系数。
- 验证:计算平均重投影误差,若大于 0.15 像素,需剔除异常图像并重新标定。
2.3 畸变校正:径向畸变与切向畸变
实际镜头并非完美针孔,光线通过透镜时会发生折射偏移,导致图像畸变。主要分为两类:
- 径向畸变:由透镜形状引起,光线离中心越远弯曲越严重。表现为“桶形畸变”(负畸变)或“枕形畸变”(正畸变)。数学模型为:
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_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]
畸变校正的工程流程为:先通过标定获得畸变系数,然后对原始图像逐像素进行重映射(remap),生成校正后的无畸变图像。在机器人抓取中,畸变校正必须在目标检测之前完成,否则像素坐标的误差会直接传递到三维坐标计算中。
cv2.getOptimalNewCameraMatrix 调整主点位置,以平衡校正后的视场范围与边缘质量。对于抓取任务,优先保证画面中心区域(通常为抓取工作区)的校正精度。
2.4 深度相机与 RGB 相机对比及选型
RGB 相机仅能提供二维纹理信息,而深度相机(RGB-D)能够同时输出彩色图像与逐像素深度值。深度相机的实现原理主要有三种:
| 技术方案 | 工作原理 | 测量范围 | 精度 | 帧率 | 环境光敏感性 | 典型代表 |
|---|---|---|---|---|---|---|
| 结构光 | 投射红外散斑,通过图案变形计算深度 | 0.2 - 5 m | ±1mm @ 1m | 30 fps | 强光下易失效 | Intel RealSense D435i |
| ToF (飞行时间) | 测量红外光脉冲往返时间 | 0.1 - 10 m | ±3mm @ 1m | 30-60 fps | 受环境红外干扰 | Microsoft Kinect v2 |
| 双目立体视觉 | 双 RGB 相机视差三角测量 | 0.3 - 20 m | 随距离平方恶化 | 30 fps | 依赖纹理,弱纹理失效 | ZED 2 |
在机器人抓取场景中,选型需考虑以下因素:
- 工作距离:近距离(< 1m)优先选择结构光或 ToF,精度高;远距离(> 3m)选择双目或 ToF。
- 环境光照:室外或强光环境,双目视觉更鲁棒;室内可控光照,结构光与 ToF 精度更高。
- 物体表面特性:反光、透明物体对 ToF 和结构光不友好,双目在弱纹理表面(如白墙)会失效。
- 点云密度:结构光与 ToF 可输出稠密深度图,双目在纹理丰富区域输出稠密,弱纹理区域输出稀疏。
2.5 深度数据与 RGB 数据的融合策略
在实际抓取系统中,RGB 图像与深度图像需要精确对齐。由于 RGB 传感器与深度传感器存在物理位置偏移,两者的像素坐标并不一一对应。因此,必须进行深度-彩色对齐(Depth-to-Color Registration)。以 RealSense 为例,可通过以下方式实现:
# 使用 pyrealsense2 获取对齐后的帧
pipeline = rs.pipeline()
config = rs.config()
config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30)
config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30)
align = rs.align(rs.stream.color) # 将深度对齐到彩色坐标系
frames = pipeline.wait_for_frames()
aligned_frames = align.process(frames)
depth_frame = aligned_frames.get_depth_frame()
color_frame = aligned_frames.get_color_frame()
对齐后的深度图与彩色图具有相同的分辨率与视场角,每个像素 (u,v) 同时包含 RGB 值与深度 Z。此时,可通过内参矩阵反投影得到相机坐标系下的三维点:
Xc = (u - cx) * Z / fx
Yc = (v - cy) * Z / fy
Zc = Z
这一步骤是后续点云生成、目标位姿估计的基础。需要注意的是,深度图在物体边缘、遮挡区域、反光表面会产生“飞点”(即深度值异常跳变),在反投影前应使用中值滤波或双边滤波进行预处理。
2.6 本章总结与工程复盘
本章从针孔模型出发,系统梳理了相机成像的完整数学链路:世界坐标 → 相机坐标(外参)→ 图像坐标(内参)→ 像素坐标(仿射变换)。畸变校正是保证像素精度的重要前置步骤,而深度相机的引入为抓取提供了直接的三维信息。在工程实践中,必须注意以下几点:
- 标定精度决定系统上限:内参误差 0.1 像素,在 1m 距离处约产生 0.5mm 的三维误差。务必使用高质量标定板并严格控制标定流程。
- 深度相机并非万能:反光、透明、吸光材料都会导致深度数据失效。选型前必须用真实工件进行测试。
- RGB 与深度对齐是前提:未对齐的数据无法直接用于三维重建,必须使用 SDK 提供的对齐接口或自行实现外参变换。
- 温度与时间稳定性:深度相机需要预热,且长时间工作后精度会下降,建议定期(每月)重新标定。