畸变类型详解:径向畸变与切向畸变
各位同学,今天我们来聊聊摄像头畸变。说实话,这是车载视觉里最基础也最绕不开的一个坑。我刚开始做车载项目时,拿到一个广角镜头的画面,第一反应是「这画面怎么跟鱼眼一样?」——后来才知道,这就是典型的径向畸变。
畸变说白了,就是镜头把真实世界的直线拍成了曲线。为什么会这样?因为镜头是凸透镜,光线经过透镜时会发生折射,边缘的光线弯曲得更厉害。嗯,这里要注意,畸变不是镜头坏了,而是物理规律决定的。我们做车载视觉的,必须学会怎么跟它打交道。
1. 径向畸变:桶形与枕形
径向畸变是最常见的畸变类型。它的特点是:越靠近图像边缘,变形越明显。我习惯把它分成两类:
- 桶形畸变:图像边缘向外凸出,像木桶的形状。广角镜头容易出现这种。
- 枕形畸变:图像边缘向内凹陷,像枕头。长焦镜头常见。
我在项目中遇到过一台车载摄像头,装在后视镜位置,画面边缘的停车线弯得跟香蕉一样。那就是典型的桶形畸变。你想想看,如果直接用这种画面做车道线检测,结果肯定一塌糊涂。
数学公式推导
径向畸变的数学模型其实不复杂。我们用归一化坐标来表示:
假设理想的无畸变坐标为 (x, y),畸变后的坐标为 (x_distorted, y_distorted)。那么:
x_distorted = x * (1 + k1 * r² + k2 * r⁴ + k3 * r⁶)
y_distorted = y * (1 + k1 * r² + k2 * r⁴ + k3 * r⁶)
其中 r² = x² + y²,k1、k2、k3 是径向畸变系数。
这里有个细节:k1 控制主要畸变程度,k2 和 k3 用来修正边缘的精细变形。我个人的经验是,对于车载摄像头,通常只用 k1 和 k2 就够了,k3 一般用在鱼眼镜头那种超大视场角的情况。
关键点:当 k1 > 0 时,产生枕形畸变;当 k1 < 0 时,产生桶形畸变。绝对值越大,畸变越严重。
2. 切向畸变:镜头装配误差
切向畸变,说白了就是镜头没装正。你想想看,镜头模组在组装时,如果透镜和成像平面不平行,就会产生切向畸变。这种畸变会让图像看起来像被「拧」了一下。
我记得有一次,客户反馈说他们车的环视系统拼接有错位。我排查了半天,发现是其中一个摄像头的切向畸变特别大。后来拆开一看,果然是镜头装配时歪了。嗯,这种问题在量产中其实不少见。
数学公式推导
切向畸变的公式稍微复杂一点,但原理很直观:
x_distorted = x + [2 * p1 * x * y + p2 * (r² + 2 * x²)]
y_distorted = y + [p1 * (r² + 2 * y²) + 2 * p2 * x * y]
其中 p1 和 p2 是切向畸变系数。
你看这个公式,它跟径向畸变不一样——径向畸变只跟半径 r 有关,而切向畸变跟 x 和 y 的具体位置都有关系。这意味着切向畸变在不同方向上变形程度不一样。
我的建议:在做标定时,一定要同时标定径向和切向畸变。我曾经见过有人只标径向不标切向,结果图像中心区域看起来还行,边缘的拼接缝却对不齐。说白了,切向畸变虽然数值通常比径向小,但影响不可忽略。
3. 畸变参数的实际意义
我们做车载视觉的,标定板拍完后会得到一组参数。我习惯把它们整理成表格:
| 参数 | 含义 | 典型范围(车载摄像头) |
|---|---|---|
| k1 | 径向畸变主系数 | -0.5 ~ 0.5 |
| k2 | 径向畸变次系数 | -0.2 ~ 0.2 |
| k3 | 径向畸变三阶系数 | -0.1 ~ 0.1(通常不用) |
| p1 | 切向畸变系数1 | -0.05 ~ 0.05 |
| p2 | 切向畸变系数2 | -0.05 ~ 0.05 |
你看这个表,切向畸变的数值通常比径向小一个数量级。但别小看它,在鸟瞰图拼接时,哪怕 0.01 的偏差,在图像边缘也会造成几个像素的错位。
4. 畸变校正的工程实践
讲完理论,说说实际怎么做。在 OpenCV 里,畸变校正就两步:
- 用
cv2.calibrateCamera()得到畸变参数 - 用
cv2.undistort()或cv2.initUndistortRectifyMap()做校正
我个人习惯用 initUndistortRectifyMap 先生成映射表,然后 remap 去重映射。为什么?因为车载系统需要实时处理,提前算好映射表能省很多计算量。
# 生成映射表
map1, map2 = cv2.initUndistortRectifyMap(
camera_matrix, dist_coeffs,
None, new_camera_matrix,
(width, height), cv2.CV_32FC1
)
# 实时校正
undistorted_img = cv2.remap(img, map1, map2, cv2.INTER_LINEAR)
避坑指南:我曾经犯过一个错误——直接用畸变图像做特征点匹配,结果匹配出来的点全是错的。后来才意识到,特征点提取前必须先做畸变校正。你想想看,图像边缘的角点位置都变了,匹配能对吗?
5. 总结一下
径向畸变和切向畸变,是车载摄像头最基础的两个畸变类型。径向畸变来自镜头本身的物理特性,切向畸变来自装配误差。两者都需要在校正时一并处理。
我最后再啰嗦一句:做车载视觉,畸变校正不是可选项,而是必选项。尤其是做鸟瞰图、车道线检测、障碍物测距这些任务,畸变不校正好,后面的算法再牛也白搭。嗯,今天就到这里,下节课我们讲具体的标定流程。