1. 课程导入
各位同学好,我是你们这门课的主讲。在车载嵌入式视觉领域摸爬滚打了十来年,踩过的坑比走过的路还多(笑)。今天咱们开始第一讲,先把整个知识体系的地基打牢。
说实话,鱼眼矫正和环视拼接这个方向,入门容易精通难。我见过不少工程师,调了几个月参数,最后拼接出来的图像还是「鬼影重重」。为什么?因为底层原理没吃透。所以这一章,咱们不急着写代码,先把「为什么」和「是什么」搞清楚。
1.1 鱼眼相机成像原理——为什么图像会「弯」?
普通相机遵循小孔成像模型,光线直线传播,图像是「平」的。但鱼眼相机不一样,它的镜头前组像一颗凸出的鱼眼,视角可以做到 180° 甚至 220°。代价是什么?图像边缘被严重拉伸,直线变成了曲线。
我个人习惯把鱼眼模型分成两类:
- 等距投影模型:入射角与像高成正比。这是最常见的模型,OpenCV 的 fisheye 模块就基于它。
- 等立体角投影模型:入射角的正弦与像高成正比。某些车载镜头会用,畸变更柔和。
你想想看,一个 3D 空间点,经过鱼眼镜头映射到 2D 图像上,中间经历了什么?
- 世界坐标系 → 相机坐标系(刚体变换)
- 相机坐标系 → 归一化球面(鱼眼特有的步骤)
- 球面点 → 畸变图像平面(投影模型 + 畸变参数)
- 畸变图像 → 像素坐标(内参矩阵)
我在项目中遇到过最头疼的问题:标定板拍出来的角点,在图像边缘几乎挤成一团。这时候如果还用普通相机的标定方法,结果会一塌糊涂。所以鱼眼标定必须用专用的棋盘格或圆点格,而且图像要覆盖整个视场。
1.2 环视系统应用场景——AVM 到底在解决什么问题?
环视系统,英文叫 Around View Monitor,简称 AVM。说白了,就是在车身前后左右装 4 颗(或更多)鱼眼相机,通过算法合成一张鸟瞰图,让驾驶员在车内就能看到车周围 360° 的情况。
应用场景其实比你想的要多:
| 场景 | 痛点 | AVM 的价值 |
|---|---|---|
| 窄路会车 | 右前轮盲区,容易剐蹭 | 实时显示车轮与路沿距离 |
| 侧方停车 | 后视镜视野有限 | 鸟瞰图 + 轨迹线辅助 |
| 地库倒车 | 光线暗、柱子多 | 多视角融合,无死角 |
| 越野/非铺装路 | 车底和轮胎位置不可见 | 透明底盘 + 环视叠加 |
嗯,这里要注意:AVM 不是简单的「把四张图拼在一起」。真正的难点在于——
- 亮度一致性:四个相机曝光不同,拼接处会有明显的「接缝」
- 几何一致性:地面不是绝对平面,拼接会出现重影
- 实时性:30fps 的处理速度,嵌入式平台资源有限
我曾经在一个量产项目上,因为拼接处的亮度跳变,被客户投诉「像打了补丁」。后来花了整整两周调光度补偿算法,才把接缝压到肉眼不可见。所以这门课里,我会把光度补偿和融合权重单独拿出来讲透。
1.3 课程整体技术栈与学习路径
这门课一共 30 章,我把它分成四个阶段。先给你一张总览图,心里有个谱。
技术栈方面,我选的是目前工业界最主流的方案:
- 编程语言:C++ 为主,Python 用于原型验证
- 图像库:OpenCV 4.x,特别是 fisheye 和 stitching 模块
- 嵌入式平台:以 TI TDA4 / NXP S32V / 高通 SA8295 为参考
- 加速库:ARM Neon 指令集、OpenCL、TensorRT
1.4 学习路径规划——怎么学效率最高?
我见过两种极端:一种是上来就调拼接参数,结果连畸变矫正都没做对;另一种是死磕数学公式,代码一行没写。说实话,这两种都走不远。
我个人建议的学习节奏是这样的:
- 前 8 章打基础:把鱼眼模型和标定吃透。标定数据一定要自己拍,别用网上的数据集。
- 第 9-15 章动手写代码:从单图矫正开始,逐步实现映射表生成和插值。每章都要跑通示例。
- 第 16-24 章啃硬骨头:拼接是核心,也是坑最多的地方。光度补偿和融合权重建议反复调参。
- 第 25-30 章上板调试:嵌入式部署和 PC 端完全不同,内存、带宽、延迟都要考虑。