2. 传感器基础(一):摄像头工作原理、成像模型、标定方法、在自动驾驶中的应用场景
各位同学,欢迎来到传感器基础的第一讲。咱们直接切入正题——摄像头。
说实话,在自动驾驶的传感器套件里,摄像头是我个人认为最「像人眼」的传感器。激光雷达再准,也分不清红绿灯的颜色;毫米波雷达再远,也读不了路牌上的文字。但摄像头可以。它就是我们车上的「视觉皮层」。
这一章,我会把摄像头从原理到应用给你捋一遍。嗯,内容不少,但都是硬货。
2.1 摄像头工作原理:从光子到像素
摄像头怎么工作的?说白了,就是「光子撞击感光元件,产生电信号」。
具体流程是这样的:
- 光线进入镜头:镜头把外界的光线汇聚到传感器上。
- 滤光片处理:滤掉红外等不需要的波段,只保留可见光。
- 感光元件(CMOS/CCD):每个像素点接收光子,产生电荷。
- 模数转换(ADC):把模拟电压信号转成数字值。
- ISP处理:图像信号处理器做去噪、白平衡、色彩校正等。
- 输出图像:最终得到一张我们熟悉的RGB图像。
关键参数:分辨率、帧率、动态范围、信噪比。这四个参数直接决定了摄像头在自动驾驶场景下的表现。
我在项目中遇到过一个问题:某款摄像头在白天表现极好,但一到黄昏就「瞎了」。后来排查发现,是动态范围不够。说白了,就是亮的地方过曝,暗的地方死黑。嗯,选型时一定要看动态范围,别只看分辨率。
2.2 成像模型:小孔成像与针孔模型
摄像头的成像模型,核心就是小孔成像。你想想看,初中物理就学过——光线穿过小孔,在后面的屏幕上形成倒立的像。
在自动驾驶领域,我们用的是针孔相机模型。它把三维世界中的点,映射到二维图像平面上。数学表达是这样的:
// 针孔相机模型的核心公式
// 世界坐标系点 P(X, Y, Z) 映射到图像坐标系点 p(u, v)
// 内参矩阵 K
K = [fx, 0, cx;
0, fy, cy;
0, 0, 1]
// 投影过程
[u, v, 1]^T = (1/Z) * K * [R|t] * [X, Y, Z, 1]^T
这里有几个概念你得记住:
- 内参:fx, fy(焦距),cx, cy(主点偏移)。每个摄像头出厂时都不一样。
- 外参:R(旋转矩阵),t(平移向量)。描述摄像头在车上的安装位置和朝向。
- 畸变:径向畸变(桶形/枕形)和切向畸变(镜头装配误差)。
我的经验:千万别以为买来的摄像头内参是准的。温度变化、振动、镜头老化都会让内参漂移。我建议每3-6个月重新标定一次。
2.3 标定方法:让摄像头知道自己在哪
标定,说白了就是求解摄像头的内参和外参。没有标定,摄像头看到的图像就是「扭曲的世界」。
常用的标定方法有两种:
| 方法 | 工具 | 精度 | 适用场景 |
|---|---|---|---|
| 棋盘格标定 | OpenCV、MATLAB | 高(亚像素级) | 实验室、量产线 |
| 自标定 | 基于场景特征 | 中等 | 在线校准、售后 |
棋盘格标定的流程大致如下:
- 打印一张棋盘格,贴在平面上。
- 从不同角度拍摄10-20张照片。
- 用OpenCV的
cv2.findChessboardCorners()提取角点。 - 调用
cv2.calibrateCamera()计算内参和畸变系数。 - 验证重投影误差,一般要小于0.5像素。
# Python + OpenCV 标定示例(简化版)
import cv2
import numpy as np
# 准备棋盘格角点的世界坐标
objp = np.zeros((6*9, 3), np.float32)
objp[:,:2] = np.mgrid[0:9, 0:6].T.reshape(-1, 2)
objpoints = [] # 世界坐标
imgpoints = [] # 图像坐标
# 遍历所有标定图片
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, (9, 6), None)
if ret:
objpoints.append(objp)
imgpoints.append(corners)
# 执行标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(
objpoints, imgpoints, gray.shape[::-1], None, None)
print("内参矩阵:\n", mtx)
print("畸变系数:\n", dist)
避坑指南:我曾经在量产线上遇到过标定失败的问题。排查了两天才发现——棋盘格打印时纸张有轻微褶皱,导致角点坐标偏差。记住:标定板必须绝对平整!
2.4 在自动驾驶中的应用场景
摄像头在自动驾驶里,可以说是「无处不在」。我按功能给你拆解一下:
2.4.1 车道线检测
这是最基础的应用。摄像头捕捉前方图像,算法提取车道线,判断车辆是否偏离。说白了,就是LKA(车道保持辅助)的核心。
2.4.2 交通标志识别
限速牌、停止牌、禁止通行……摄像头通过图像分类模型识别这些标志。我记得有一次测试,模型把「限速40」识别成了「限速80」,差点出事。后来发现是训练数据里缺少夜间场景。
2.4.3 行人/车辆检测
这是AEB(自动紧急制动)的基础。摄像头检测前方行人或车辆,计算碰撞时间(TTC),决定是否刹车。
2.4.4 红绿灯识别
激光雷达做不到的事,摄像头来做。识别红绿灯的颜色和状态,是城市自动驾驶的必备能力。
2.4.5 全景环视
4-6个鱼眼摄像头拼接成360°鸟瞰图。泊车时特别好用。嗯,这里要注意鱼眼摄像头的畸变校正,不然拼接出来的图像会「错位」。
一句话总结:摄像头是自动驾驶的「眼睛」,但它有弱点——怕逆光、怕黑夜、怕雨雾。所以它必须和激光雷达、毫米波雷达配合使用,这就是「多传感器融合」的由来。
2.5 本章小结
这一章我们聊了:
- 摄像头的工作原理:光子→电荷→数字信号
- 成像模型:针孔模型 + 内参外参 + 畸变
- 标定方法:棋盘格标定是主流,精度要控制在0.5像素以内
- 应用场景:车道线、交通标志、行人车辆、红绿灯、环视
下一章,我们会深入聊聊激光雷达。那个家伙虽然贵,但精度是真的猛。到时候见。
课后作业:找一张棋盘格图片,用OpenCV跑一遍标定流程。看看你的重投影误差是多少。如果超过1个像素,说明你的标定板或者拍摄姿势有问题。
公众号:蓝海资料掘金营,微信deep3321