相机内参模型:针孔相机模型、畸变模型与内参矩阵K
做车道线检测,绕不开相机模型。说白了,你得知道相机是怎么把三维世界“拍”成二维图像的。这个映射关系,就是内参模型的核心。我个人习惯把内参比作相机的“基因”——它决定了图像里每个像素对应的真实物理方向。
针孔相机模型:最朴素的成像原理
针孔模型是最基础的成像模型。你想想看,光线通过一个小孔,在后面的感光元件上形成倒像。这就是最原始的相机。
数学上,它描述了一个从3D世界点到2D图像点的投影关系:
// 齐次坐标下的投影关系
λ * [u, v, 1]^T = K * [R|t] * [X, Y, Z, 1]^T
这里有几个关键点:
- 世界坐标系:我们关心的车道线、路沿都在这个坐标系里
- 相机坐标系:以相机光心为原点,Z轴指向拍摄方向
- 图像坐标系:成像平面上的物理坐标(毫米级)
- 像素坐标系:我们最终看到的图像,单位是像素
我在项目中遇到过一个问题:用针孔模型标定出来的参数,在图像边缘区域误差特别大。后来才发现,是忽略了畸变。嗯,这里要注意,针孔模型只是一个理想模型,真实相机都有畸变。
畸变模型:现实总是不完美的
为什么会有畸变?因为镜头不是完美的针孔。透镜的曲率、装配误差都会导致光线偏折。畸变主要分两类:
径向畸变
这是最常见的畸变。说白了,就是图像边缘的直线变弯了。有两种表现:
- 桶形畸变:图像向外膨胀,像桶一样。广角镜头常见
- 枕形畸变:图像向内收缩,像枕头。长焦镜头常见
数学上,径向畸变用三个参数描述:k1, k2, k3。校正公式是:
x_corrected = x * (1 + k1*r^2 + k2*r^4 + k3*r^6)
y_corrected = y * (1 + k1*r^2 + k2*r^4 + k3*r^6)
其中 r 是像素到图像中心的距离。r 越大,畸变越明显。
我的经验: 对于自动驾驶常用的车载相机(视场角60-120度),一般只用k1和k2就够了。k3通常很小,加了反而容易过拟合。我曾经在一个项目中用了k3,结果标定出来的参数在图像边缘反而更差了。
切向畸变
切向畸变是镜头和成像平面不平行导致的。想象一下,镜头装歪了,图像就会倾斜。它用两个参数描述:p1, p2。
x_corrected = x + [2*p1*x*y + p2*(r^2 + 2*x^2)]
y_corrected = y + [p1*(r^2 + 2*y^2) + 2*p2*x*y]
注意: 切向畸变在车载相机中通常很小。如果标定出来的p1、p2数值很大(比如超过0.1),说明镜头安装有问题,或者标定板图像质量太差。我曾经遇到过这种情况,后来发现是标定板反光太严重。
内参矩阵K:相机的“身份证”
内参矩阵K把相机坐标系下的点映射到像素坐标系。它的形式是:
K = [fx, 0, cx;
0, fy, cy;
0, 0, 1]
各参数含义:
| 参数 | 含义 | 单位 |
|---|---|---|
| fx, fy | 焦距在x、y方向上的像素长度 | 像素 |
| cx, cy | 主点坐标(光心在图像上的投影) | 像素 |
你想想看,fx和fy通常很接近,但不完全相等。为什么?因为像素不是完美的正方形。cx和cy理论上应该在图像正中心,但实际会有偏移。这个偏移量,就是镜头装配的误差。
核心理解: 内参矩阵K + 畸变参数(k1,k2,k3,p1,p2) = 完整的相机内参模型。缺一不可。
知识体系结构图
下面这张图,是我自己总结的相机内参模型知识体系。你可以把它当作一个快速索引:
实际标定中的注意事项
做车道线检测的外参标定时,内参的准确性直接影响结果。我总结了几条经验:
- 内参要提前标好:外参标定前,先固定内参。不要内外参一起优化,容易发散
- 畸变参数要合理:k1通常在-0.5到0.5之间,k2在-0.2到0.2之间。超出这个范围,说明标定有问题
- 主点偏移别太大:cx、cy偏离图像中心超过10%的像素宽度,就要检查镜头安装
- 多角度拍摄标定板:至少20张不同角度的标定板图像,覆盖图像各个区域
一个小技巧: 标定完成后,可以用棋盘格图像验证。把标定好的内参代入,对图像做去畸变。如果棋盘格的直线都变直了,说明内参标定成功。我每次标定完都会做这个验证,省得后面踩坑。
嗯,关于相机内参模型,核心就是这些。针孔模型是骨架,畸变模型是修正,内参矩阵是最终的表达。三者结合,才能准确描述一个真实相机的成像过程。