第二章 相机成像原理:从三维世界到二维像素
做过多相机同步采集的人都知道,搞不懂成像原理,后面全是坑。我刚开始接触这个领域时,总觉得不就是拍照嘛,有啥好学的?直到第一次做多相机标定,数据怎么都对不上,才老老实实回来啃基础。
这一章,咱们就把相机成像这件事彻底讲明白。说白了,就是搞清楚一个问题:三维空间里的一个点,是怎么变成照片上的一个像素的?
2.1 针孔相机模型:最朴素的成像方式
先别被「模型」两个字吓到。针孔相机模型,其实就是你小时候玩过的那个小孔成像实验。
想象一个密闭的盒子,前面戳个小孔,后面放一张感光纸。外面的光线穿过小孔,在纸上形成一个倒立的像。这就是最原始的相机。
数学上怎么描述这个过程?很简单:
假设三维空间点 P = (X, Y, Z)
经过小孔后,在成像平面上的位置 p = (x, y)
它们满足:x = f * X / Z, y = f * Y / Z
这里的 f 就是小孔到成像平面的距离,我们叫它焦距。
关键点:针孔模型是线性的,但实际镜头有畸变。我在项目中遇到过,用针孔模型标定出来的结果,边缘误差能达到十几个像素。所以后面我们还得讲畸变校正。
2.2 四个坐标系,一次旅行
一个三维点要变成像素,需要经历四次坐标变换。我习惯把这比作一次「旅行」:
- 世界坐标系:你放了个物体在真实世界中,它的位置用 (Xw, Yw, Zw) 表示
- 相机坐标系:以相机光心为原点,光轴为 Z 轴,位置变成 (Xc, Yc, Zc)
- 图像坐标系:投影到成像平面上,用物理单位 (x, y) 表示
- 像素坐标系:最终照片上的像素位置 (u, v)
为什么会搞这么复杂?你想想看,每个坐标系都有自己的「语言」。世界坐标系说米,像素坐标系说像素个数。不翻译一下,怎么沟通?
我的经验:做多相机同步时,我建议把所有相机的世界坐标系统一到第一个相机上。这样后面做三维重建会省很多事。
2.3 内参矩阵:相机自己的「身份证」
内参矩阵描述的是相机内部的光学特性。说白了,就是告诉你:一个物理世界中的点,在照片上对应哪个像素。
数学形式长这样:
K = [fx, 0, cx]
[ 0, fy, cy]
[ 0, 0, 1]
其中:
- fx, fy:焦距在 x 和 y 方向的像素当量(单位:像素/毫米)
- cx, cy:主点坐标,也就是光轴与成像平面的交点
这里有个坑:fx 和 fy 通常不相等。为什么?因为相机传感器的像素不一定是正方形的。我遇到过一台工业相机,fx=1200, fy=1198,差了两个像素。别小看这两个像素,在多相机拼接时,误差会累积。
避坑指南:我曾经用默认的 cx, cy 值(图像中心)去做标定,结果误差一直下不去。后来才发现,实际的主点偏移了十几个像素。记住:永远不要假设主点在图像中心,一定要通过标定得到。
2.4 外参矩阵:相机在空间中的「位置和朝向」
外参矩阵描述的是相机在世界坐标系中的位姿。它由两部分组成:
- 旋转矩阵 R:3x3 矩阵,描述相机的朝向
- 平移向量 t:3x1 向量,描述相机的位置
完整的变换公式:
Pc = R * Pw + t
其中 Pc 是相机坐标系下的坐标,Pw 是世界坐标系下的坐标。
嗯,这里要注意:R 和 t 有 6 个自由度(3 个旋转角 + 3 个平移量)。在多相机系统中,每个相机都有自己的外参,这就是我们做同步采集时需要标定的核心参数。
2.5 完整成像流程:从世界到像素
把上面所有步骤串起来,一个三维点变成像素的完整过程是:
1. 世界坐标 → 相机坐标:Pc = R * Pw + t
2. 相机坐标 → 图像坐标:x = fx * Xc / Zc, y = fy * Yc / Zc
3. 图像坐标 → 像素坐标:u = x + cx, v = y + cy
用矩阵形式写就是:
s * [u] = K * [R | t] * [Xw]
[v] [Yw]
[1] [Zw]
[1 ]
这里的 s 是尺度因子,因为从三维到二维丢失了深度信息。
核心理解:整个成像过程,本质上就是用一个 3x4 的投影矩阵 P = K * [R | t] 把三维点映射到二维平面。这个矩阵包含了相机的所有参数。
2.6 知识体系总览
下面这张图,是我自己总结的相机成像知识框架。每次做新项目前,我都会看一眼,确保没有遗漏:
2.7 实际项目中的注意事项
讲完了理论,说点实际的。我在做多相机深度同步采集时,遇到过几个典型问题:
| 问题 | 现象 | 解决方案 |
|---|---|---|
| 内参不一致 | 同一物体在不同相机中位置偏差大 | 每个相机单独标定,不要共用内参 |
| 外参漂移 | 长时间运行后拼接错位 | 定期重新标定,或使用自标定算法 |
| 畸变未校正 | 图像边缘弯曲,三维重建误差大 | 标定时加入畸变参数,实时校正 |
| 深度信息丢失 | 单目无法确定物体远近 | 使用双目或多目立体视觉 |
个人建议:如果你刚开始做多相机系统,先别急着上复杂的算法。把内参和外参标定准确了,后面的事情就顺了。我见过太多项目,标定没做好,后面花十倍的时间去调参,得不偿失。
好了,这一章的内容就到这里。成像原理是基础中的基础,搞懂了它,后面讲同步触发、多相机标定、深度估计,你才能听得明白。
公众号:蓝海资料掘金营,微信deep3321