1. 针孔摄像机模型基础
针孔摄像机是计算机视觉中最基础的成像模型,它模拟了光线通过一个小孔投射到成像平面的过程。这个看似简单的模型却蕴含着深刻的几何原理,是理解现代相机工作原理的基石。
在实际应用中,虽然现代相机都使用透镜组而非真正的针孔,但针孔模型因其数学简洁性而成为计算机视觉领域的标准模型。我刚开始研究视觉几何时,曾误以为这个模型过于理想化,直到后来处理实际标定任务时才发现,只要合理考虑畸变参数,针孔模型能很好地描述大多数相机的成像特性。
2. 摄像机几何与坐标系转换
2.1 坐标系定义
理解摄像机几何需要明确三个关键坐标系:
- 世界坐标系:固定场景中的参考系
- 摄像机坐标系:以光心为原点的三维坐标系
- 图像坐标系:二维成像平面坐标系
在实际标定工作中,我习惯先用棋盘格建立世界坐标系,这样后续的转换会更直观。新手常犯的错误是混淆这些坐标系,导致后续的矩阵运算出现符号错误。
2.2 投影矩阵推导
从世界坐标到图像坐标的完整变换包含:
- 刚体变换(旋转R和平移t)
- 透视投影
- 图像平面缩放和平移
这个过程的矩阵表示为:
code复制[u] [f_x 0 c_x][r11 r12 r13 t1][X]
[v] = [0 f_y c_y][r21 r22 r23 t2][Y]
[1] [0 0 1 ][r31 r32 r33 t3][Z]
[0 0 0 1 ][1]
我在实验室带学生时发现,理解这个矩阵的每个元素对后续的标定和三维重建至关重要。特别是内参矩阵中的f_x和f_y,它们代表了像素单位的焦距,这个值与物理焦距的关系常常被初学者误解。
3. 摄像机标定实践
3.1 标定板选择与准备
常用的标定方法需要使用特定图案的标定板。根据我的经验:
- 棋盘格是最易获取的,但要注意黑白对比度要足够
- 圆形标定板精度更高,但需要特殊的检测算法
- 建议使用物理尺寸精确的标定板(如300mm×300mm)
一个实用技巧:将标定板贴在平整的刚性表面上,我见过不少同学用软质材料导致标定结果不稳定。
3.2 标定流程详解
完整的标定步骤包括:
- 采集多角度标定板图像(建议15-20张)
- 检测特征点(角点或圆心)
- 求解初始参数
- 非线性优化所有参数
使用OpenCV实现时要注意:
python复制# 角点检测示例
ret, corners = cv2.findChessboardCorners(gray, (9,6), None)
# 亚像素优化
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
corners = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria)
我曾在一个工业检测项目中,因为忽略了亚像素优化这一步,导致最终测量误差大了近一个像素。
4. 镜头畸变与校正
4.1 畸变模型分析
实际镜头都存在不同程度的畸变,主要包括:
- 径向畸变:图像边缘的弯曲现象
- 切向畸变:由镜头组装偏差引起
常用的Brown-Conrady模型表示为:
code复制x_corrected = x(1 + k1r² + k2r⁴ + k3r⁶) + [2p1xy + p2(r²+2x²)]
y_corrected = y(1 + k1r² + k2r⁴ + k3r⁶) + [p1(r²+2y²) + 2p2xy]
4.2 畸变校正实践
OpenCV提供了便捷的畸变校正函数:
python复制# 计算校正映射
mapx, mapy = cv2.initUndistortRectifyMap(...)
# 应用校正
dst = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)
在无人机视觉系统中,我发现广角镜头的畸变校正尤为关键。一个经验是:标定时要确保标定板覆盖图像的各个区域,特别是边缘部分,否则畸变参数估计不准确。
5. 实际应用中的问题排查
5.1 常见标定失败原因
根据我的项目经验,标定失败通常源于:
- 标定板图案检测失败(对比度不足或图案被遮挡)
- 图像采集角度过于单一(建议至少3个不同深度)
- 运动模糊导致特征点定位不准
5.2 精度验证方法
验证标定精度的可靠方法:
- 重投影误差分析(理想值应小于0.1像素)
- 使用未参与标定的图像测试
- 实际测量已知尺寸物体的投影
在医疗内窥镜标定项目中,我们开发了一套自动化的精度验证流程,通过特殊设计的测试夹具来验证不同工作距离下的投影精度。
6. 进阶话题与扩展
6.1 多相机系统标定
对于立体视觉系统,需要考虑:
- 相机间的外参标定
- 时间同步问题
- 共同视场范围验证
一个实用建议:先单独标定每个相机,再联合优化所有参数。
6.2 在线标定技术
在某些动态场景中,需要实时更新相机参数。这时可以考虑:
- 利用场景中的自然特征
- 基于SLAM的标定方法
- 深度学习辅助的标定技术
在机器人导航项目中,我们结合AprilTag和自然特征实现了相机参数的在线更新,大大提高了系统在温度变化环境下的稳定性。