2、机器人视觉基础:相机模型、成像原理、内参外参、畸变校正、深度相机与RGB相机对比

机器人视觉抓取系统的第一步,是让机器人“看懂”三维世界。而这一切的起点,并非深度学习或点云处理,而是对相机本身物理特性的深刻理解。相机将三维空间映射到二维像素平面的过程,遵循着严格的几何光学规律。如果工程师不理解针孔模型、不清楚内参外参的物理含义、不会处理镜头畸变,那么后续任何高级算法——无论是手眼标定还是目标检测——都将建立在错误的地基之上。本章将系统拆解视觉系统的底层逻辑,从成像原理出发,厘清内参、外参、畸变与深度相机的核心差异,为后续手眼标定与抓取规划打下坚实的数学与物理基础。

机器人视觉基础:相机模型与成像链路 世界坐标系 Xw, Yw, Zw 物体真实位置 外参 R|t 相机坐标系 Xc, Yc, Zc 光心为原点 内参 K矩阵 图像坐标系 x, y (mm) 物理成像平面 仿射变换 dx, dy, u0, v0 像素坐标系 u, v (pixel) 图像数组索引 畸变校正 径向畸变 k1,k2,k3 切向畸变 p1,p2 深度相机 ToF / 结构光 / 双目 输出 RGB-D 数据 RGB 相机 • 输出:2D 彩色图像 (u,v,R,G,B) • 原理:CMOS 感光元件,记录光强与波长 • 优势:分辨率高、帧率高、成本低 • 局限:无深度信息,依赖几何/纹理推断 • 适用:2D 目标检测、纹理匹配、视觉伺服 • 标定:需单独标定内参、外参、畸变 深度相机 (RGB-D) • 输出:2D 彩色 + 逐像素深度 Z (mm) • 原理:ToF/结构光/双目视差测距 • 优势:直接获取三维信息,便于抓取规划 • 局限:受环境光/反光影响,深度边缘噪声 • 适用:6D 位姿估计、点云分割、避障 • 标定:需 RGB 与 Depth 对齐联合标定

上图展示了从世界坐标系到像素坐标系的完整映射链路。理解这条链路是掌握相机标定与手眼标定的关键。下面我们将逐一拆解每个环节的数学含义与工程实践要点。

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 为主点坐标(光轴与成像平面的交点)。内参描述了相机本身的固有属性,一旦镜头与传感器固定,内参不再变化。

工程要点:在机器人抓取场景中,内参标定的精度直接影响三维重建的尺度。若 fx 存在 1% 的误差,在 1 米距离处,深度估计将产生约 10mm 的偏差,这对于精密装配(公差 ±0.5mm)是不可接受的。因此,建议使用 20-30 张不同姿态的棋盘格图像进行标定,并观察重投影误差是否小于 0.1 像素。

2.2 内参与外参的物理意义与标定方法

内参描述的是相机坐标系到像素坐标系的映射关系,它只与相机内部光学结构有关。而外参描述的是世界坐标系到相机坐标系的刚体变换(旋转矩阵 R 和平移向量 t),它取决于相机在世界中的安装位置与姿态。在机器人手眼标定中,外参正是我们最终要求解的目标之一。

参数类型 物理含义 维度 标定方法 在抓取中的作用
内参 K 焦距、主点、像素尺寸 3×3 矩阵 棋盘格/圆点格多姿态拍摄 将像素坐标转换为相机坐标(归一化平面)
外参 [R|t] 相机在世界坐标系中的位姿 3×4 矩阵 手眼标定(AX=XB)或外部测量 将物体世界坐标转换到相机坐标系
畸变系数 镜头光学缺陷导致的非线性偏移 5 个参数 (k1,k2,p1,p2,k3) 与内参同时标定 校正像素位置,提高三维定位精度

标定流程通常遵循以下步骤:

  1. 采集图像:使用棋盘格标定板,在视场内移动 15-25 个不同位置,覆盖画面中心与边缘,并保证标定板与成像平面有一定夹角(约 30°-45°)。
  2. 角点检测:使用 OpenCV 的 findChessboardCorners 提取亚像素级角点坐标。
  3. 求解初值:基于单应性矩阵估计内参初值,再通过最小二乘优化外参。
  4. 非线性优化:使用 Levenberg-Marquardt 算法最小化重投影误差,同时优化内参、外参与畸变系数。
  5. 验证:计算平均重投影误差,若大于 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),生成校正后的无畸变图像。在机器人抓取中,畸变校正必须在目标检测之前完成,否则像素坐标的误差会直接传递到三维坐标计算中。

实战经验:对于广角镜头(视场角 > 90°),径向畸变非常显著,边缘区域的像素偏移可达数十像素。此时建议使用更高阶的畸变模型(如 k3),并在标定后通过 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 可输出稠密深度图,双目在纹理丰富区域输出稠密,弱纹理区域输出稀疏。
案例拆解:某 3C 电子装配线需要抓取反光金属连接器(尺寸 10mm×5mm),工作距离 400mm。初始方案选用结构光相机(RealSense D435i),但实际测试发现金属反光导致深度图出现大量空洞。分析后改用双目相机(ZED 2)并增加辅助纹理光源,利用金属表面的划痕与刻印作为自然特征,成功获得完整点云。最终抓取成功率从 82% 提升至 97%。此案例说明,深度相机的选型必须结合目标物体表面特性进行实测验证,不能仅凭参数表决定。

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

这一步骤是后续点云生成、目标位姿估计的基础。需要注意的是,深度图在物体边缘、遮挡区域、反光表面会产生“飞点”(即深度值异常跳变),在反投影前应使用中值滤波或双边滤波进行预处理。

风险提示:深度相机的精度受温度影响较大。ToF 相机在开机后前 10 分钟深度值会漂移 1-3mm,因此在高精度抓取场景中,建议开机后预热 15 分钟再进行标定与作业。此外,深度相机的标定(内参、外参、畸变)与 RGB 相机独立进行,但两者之间的相对位姿(即手眼矩阵的一部分)需要通过联合标定获得,不可混用。

2.6 本章总结与工程复盘

本章从针孔模型出发,系统梳理了相机成像的完整数学链路:世界坐标 → 相机坐标(外参)→ 图像坐标(内参)→ 像素坐标(仿射变换)。畸变校正是保证像素精度的重要前置步骤,而深度相机的引入为抓取提供了直接的三维信息。在工程实践中,必须注意以下几点:

  • 标定精度决定系统上限:内参误差 0.1 像素,在 1m 距离处约产生 0.5mm 的三维误差。务必使用高质量标定板并严格控制标定流程。
  • 深度相机并非万能:反光、透明、吸光材料都会导致深度数据失效。选型前必须用真实工件进行测试。
  • RGB 与深度对齐是前提:未对齐的数据无法直接用于三维重建,必须使用 SDK 提供的对齐接口或自行实现外参变换。
  • 温度与时间稳定性:深度相机需要预热,且长时间工作后精度会下降,建议定期(每月)重新标定。
复盘建议:在搭建机器人视觉抓取系统时,建议先使用棋盘格对 RGB 相机进行内参标定,再使用标定板对深度相机进行联合标定(同时获取 RGB 与 Depth 的外参),最后进行手眼标定。每一步都记录重投影误差与深度误差,建立标定日志,便于后续排查问题。切勿跳过畸变校正直接进行手眼标定,否则误差会耦合进手眼矩阵,导致抓取位置偏移。