3、相机内参矩阵:内参矩阵的物理意义、焦距与主点、内参矩阵的数学表达
好,咱们今天聊聊相机内参矩阵。这东西,说白了就是相机的「身份证」。你想想看,一台相机拍出来的照片,像素坐标和真实世界的三维点之间,到底是怎么对应的?内参矩阵就是那个桥梁。
我刚开始做双目视觉那会儿,总觉得内参矩阵就是个公式,套进去算就完了。直到有一次,标定出来的结果怎么都对不上,重投影误差大得离谱。折腾了两天,最后发现是主点坐标搞错了。嗯,从那以后,我对内参矩阵的每一个参数都格外上心。
3.1 内参矩阵到底在描述什么?
咱们先抛开公式,用大白话理解一下。相机成像,本质上是把三维空间里的点,投影到二维图像平面上。这个投影过程,由两部分决定:
- 相机本身的光学特性:比如镜头焦距、感光芯片的尺寸、像素的排列方式。
- 相机在空间中的位置:这个由外参矩阵负责,咱们后面再聊。
内参矩阵,就是描述「相机本身光学特性」的那部分。它告诉你:
- 一个三维点,在相机坐标系下,最终会落在图像平面的哪个像素上。
- 这个映射关系是线性的,可以用一个 3x3 的矩阵完美表达。
核心理解:内参矩阵是「从相机坐标系到图像像素坐标系」的桥梁。没有它,你拍到的只是一堆没有物理意义的像素值。
3.2 焦距与主点:两个最关键的参数
内参矩阵里,最重要的两个概念就是焦距和主点。我习惯把它们拆开来看。
3.2.1 焦距(fx, fy)
焦距,大家都不陌生。镜头参数上写的 16mm、35mm,指的就是这个。但在内参矩阵里,焦距的单位不是毫米,而是像素。
为什么会这样?
你想想看,一个物理焦距为 16mm 的镜头,装在两台不同分辨率的相机上,拍出来的照片大小肯定不一样。所以,我们需要把物理焦距换算成像素单位,才能和图像坐标直接打交道。
换算公式很简单:
f_x = F / s_x
f_y = F / s_y
其中:
- F:物理焦距(单位:毫米)
- sx, sy:每个像素在 x 和 y 方向上的物理尺寸(单位:毫米/像素)
我在项目中遇到过一台工业相机,厂家给的参数里 sx 和 sy 写反了。结果标定出来的 fx 和 fy 差了好几十,怎么调都调不对。后来一查手册才发现问题。所以,拿到新相机,第一件事就是确认像素尺寸。
个人习惯:我一般会先查一下相机的 datasheet,确认 sx 和 sy 是否相等。如果不等,说明像素不是正方形,这时候 fx 和 fy 就会不同。
3.2.2 主点(cx, cy)
主点,就是光轴与图像平面的交点。理论上,它应该在图像的正中心。但实际生产中,由于镜头安装的微小偏差,主点往往不在正中心。
我见过最夸张的一次,一台廉价 USB 摄像头,主点偏了将近 20 个像素。如果不校正,做双目立体匹配时,视差图会整体偏移,测出来的距离全都不准。
主点的物理意义很简单:
- cx:光轴在图像上的 x 坐标(单位:像素)
- cy:光轴在图像上的 y 坐标(单位:像素)
对于一张 640x480 的图像,理想情况下 cx = 320,cy = 240。但实际标定出来的值,往往会有几个像素的偏差。
避坑指南:我曾经在标定一个双目系统时,发现左右相机的 cx 差了 5 个像素。一开始没在意,结果立体匹配出来的深度图全是斜的。后来重新标定,把主点校正到一致,问题才解决。所以,双目标定时,左右相机的主点偏差一定要控制在 1 个像素以内。
3.3 内参矩阵的数学表达
好了,咱们现在用数学语言把上面这些概念串起来。内参矩阵 K 是一个 3x3 的上三角矩阵:
K = | f_x 0 c_x |
| 0 f_y c_y |
| 0 0 1 |
这个矩阵的作用,就是把相机坐标系下的一个三维点 P = (X, Y, Z) 映射到图像像素坐标系下的点 p = (u, v):
| u | | f_x 0 c_x | | X |
| v | = | 0 f_y c_y | * | Y |
| 1 | | 0 0 1 | | Z |
展开来写就是:
u = f_x * (X / Z) + c_x
v = f_y * (Y / Z) + c_y
你看,这个公式非常直观:
- X/Z 和 Y/Z:就是归一化平面上的坐标,说白了就是「去掉深度影响后的位置」。
- fx, fy:把归一化坐标缩放到像素尺度。
- cx, cy:加上主点偏移,得到最终的像素坐标。
一句话总结:内参矩阵 K 就是「缩放 + 平移」的线性变换。它把相机坐标系下的点,先归一化,再缩放到像素坐标系。
3.4 知识体系结构图
下面这张图,把内参矩阵的核心逻辑串起来了。我建议你多看几遍,理解每个参数是怎么来的,又是怎么用的。
3.5 实际应用中的注意事项
内参矩阵看着简单,但实际用起来有几个坑,我帮你列出来:
- fx 和 fy 不相等怎么办?
很正常,尤其是用 CMOS 相机时,像素可能不是正方形。标定出来不一样,别慌,直接用就行。
- 主点偏得离谱?
如果 cx 和 cy 偏离图像中心超过 10%,建议检查一下镜头安装是否歪了,或者标定板图像是否拍全了。
- 内参矩阵会变吗?
会!变焦镜头、自动对焦、温度变化,都会导致内参变化。所以,每次重新安装相机,或者环境变化较大时,我建议重新标定一次。
我的经验:在项目中,我会把标定好的内参矩阵保存成一个 YAML 文件,每次启动程序时自动加载。如果发现重投影误差突然变大,就触发自动重新标定。这样既保证了精度,又省去了手动操作的麻烦。
好了,内参矩阵就聊到这儿。记住,它是你理解相机成像的起点,也是双目标定的基石。把这个搞透了,后面的立体校正和深度计算,你会觉得顺理成章。
公众号:蓝海资料掘金营,微信deep3321