4. 相机模型与标定

在无人机视觉里程计中,相机是唯一的“感知入口”。如果相机模型不准确,后续的特征匹配、三角化、位姿估计都会产生系统性偏差。因此,理解针孔成像的几何关系、畸变来源以及内外参标定方法,是搭建可靠视觉里程计的第一步。

一、针孔模型:从三维点到像素的投影链

针孔模型把相机简化为一个理想小孔成像系统。设相机坐标系下一点 P_c = (X, Y, Z),归一化平面坐标为 (x, y) = (X/Z, Y/Z),再经内参矩阵 K 映射到像素坐标:

u   fx  0  cx     X/Z
v =  0  fy  cy  ·  Y/Z
1    0   0   1      1

K = [fx, 0, cx; 0, fy, cy; 0, 0, 1]

其中 fx、fy 是以像素为单位的焦距,cx、cy 是主点。内参描述“相机自身如何成像”,外参描述“相机在世界中的位姿”,即旋转 R 与平移 t。视觉里程计的核心任务之一,就是利用已知内参和匹配点,估计相邻帧之间的 R、t。

针孔模型是理想线性模型,实际镜头还会引入畸变。标定的本质,就是同时求取内参、畸变系数和外参,使重投影误差最小。

二、畸变模型:径向与切向误差

真实镜头由于制造和装配误差,会使直线在图像中变弯。常见畸变分为两类:

  • 径向畸变:由镜头形状引起,表现为桶形或枕形,常用 k1、k2、k3 描述。
  • 切向畸变:由镜头与成像平面不平行引起,常用 p1、p2 描述。

设归一化坐标为 (x, y),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

无人机常用广角镜头,径向畸变明显。若忽略畸变,边缘区域的特征点会产生数像素到数十像素的偏移,直接破坏对极几何约束。因此,视觉里程计通常先对图像去畸变,再提取特征。

针孔投影与畸变标定关系图 世界点 P_w 外参 R, t 世界→相机 相机坐标 P_c (X, Y, Z) 归一化平面 (X/Z, Y/Z) 畸变模型 k1,k2,p1,p2 像素 (u,v) 内参 K 标定目标:最小化重投影误差 Σ || p_obs − π(K, k, p, R, t, P_w) ||² 内参 K 与畸变系数决定成像精度,外参 R,t 决定帧间位姿关系

三、内参外参标定方法

标定通常使用已知尺寸的棋盘格或圆点标定板。核心流程如下:

  1. 采集多张不同角度、不同距离的标定板图像,覆盖画面中心和边缘。
  2. 检测标定板角点,得到亚像素级图像坐标。
  3. 利用单应矩阵初估计内参,再通过非线性优化同时求解畸变系数和外参。
  4. 使用重投影误差评估标定质量,剔除误差过大的图像。

OpenCV 提供了完整的标定接口,典型命令如下:

// 角点检测
bool found = findChessboardCorners(gray, boardSize, corners,
                                   CALIB_CB_ADAPTIVE_THRESH | CALIB_CB_NORMALIZE_IMAGE);
// 亚像素优化
cornerSubPix(gray, corners, Size(11,11), Size(-1,-1),
             TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 30, 0.001));
// 标定
double rms = calibrateCamera(objectPoints, imagePoints, imageSize,
                             cameraMatrix, distCoeffs, rvecs, tvecs);

对于无人机视觉里程计,外参标定还包括相机与 IMU 之间的相对旋转和平移。常用方法有基于 Kalman 滤波的在线估计、基于手眼标定的离线求解,以及基于联合优化的 VIO 标定。

标定对象 典型参数 常用工具 误差指标
相机内参 fx, fy, cx, cy OpenCV、MATLAB 重投影误差 < 0.3 px
畸变系数 k1, k2, p1, p2, k3 OpenCV、Kalibr 边缘残差 < 0.5 px
相机-IMU 外参 R_ci, t_ci Kalibr、VINS-Calib 旋转误差 < 0.5°
时间偏移 t_d Kalibr 偏移 < 1 ms

四、标定实验与误差分析

一次完整的标定实验应包含数据采集、标定计算和验证三个阶段。以棋盘格标定为例,建议采集 20~30 张图像,棋盘格在画面中占比不低于 1/3,并覆盖四个角和中心区域。标定完成后,用未参与标定的图像做验证,观察重投影误差分布。

若重投影误差在图像边缘明显增大,说明畸变模型阶数不足或标定板未覆盖边缘区域;若整体误差偏大,应检查角点检测是否准确、标定板是否平整。

常见误差来源包括:

  • 角点检测误差:光照不均、运动模糊导致角点偏移。
  • 标定板不平整:打印纸张弯曲引入系统性误差。
  • 模型不匹配:广角镜头仅用 k1、k2 不足以描述强畸变。
  • 外参耦合:相机与 IMU 标定时,时间偏移与空间外参相互影响。
标定不是一次性的工作。无人机更换镜头、调整相机安装位置或经历剧烈振动后,都应重新标定。在线标定虽然方便,但初值仍需离线标定提供。

在视觉里程计中,标定误差会通过三角化和位姿估计不断累积。实际工程中,通常将内参和畸变系数视为固定值,将相机-IMU 外参作为优化变量,在滑动窗口优化中联合估计。这样既能保证实时性,又能适应安装误差和轻微形变。

总结来说,针孔模型给出了理想投影关系,畸变模型修正了真实镜头的非线性误差,内外参标定则把这两者与实际硬件对齐。只有把标定做扎实,后续的特征跟踪、三角化、位姿估计和回环检测才有可靠的基础。