2. 传感器基础(一):摄像头工作原理、成像模型、标定方法、在自动驾驶中的应用场景

各位同学,欢迎来到传感器基础的第一讲。咱们直接切入正题——摄像头。

说实话,在自动驾驶的传感器套件里,摄像头是我个人认为最「像人眼」的传感器。激光雷达再准,也分不清红绿灯的颜色;毫米波雷达再远,也读不了路牌上的文字。但摄像头可以。它就是我们车上的「视觉皮层」。

这一章,我会把摄像头从原理到应用给你捋一遍。嗯,内容不少,但都是硬货。

2.1 摄像头工作原理:从光子到像素

摄像头怎么工作的?说白了,就是「光子撞击感光元件,产生电信号」。

具体流程是这样的:

  1. 光线进入镜头:镜头把外界的光线汇聚到传感器上。
  2. 滤光片处理:滤掉红外等不需要的波段,只保留可见光。
  3. 感光元件(CMOS/CCD):每个像素点接收光子,产生电荷。
  4. 模数转换(ADC):把模拟电压信号转成数字值。
  5. ISP处理:图像信号处理器做去噪、白平衡、色彩校正等。
  6. 输出图像:最终得到一张我们熟悉的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 高(亚像素级) 实验室、量产线
自标定 基于场景特征 中等 在线校准、售后

棋盘格标定的流程大致如下:

  1. 打印一张棋盘格,贴在平面上。
  2. 从不同角度拍摄10-20张照片。
  3. 用OpenCV的 cv2.findChessboardCorners() 提取角点。
  4. 调用 cv2.calibrateCamera() 计算内参和畸变系数。
  5. 验证重投影误差,一般要小于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