传感器基础(一):摄像头:工作原理、分辨率与帧率选择、标定基础、常见故障排查

大家好,我是这次课程的主讲工程师。咱们直接进入正题——摄像头。

在自动驾驶里,摄像头就像车的眼睛。没有它,车就是个瞎子。我见过不少刚入行的朋友,一上来就研究激光雷达,觉得摄像头太简单。其实不然。摄像头的数据质量,直接决定了感知算法的上限。你算法再牛,喂进去的是模糊图像,照样白搭。

核心观点:摄像头是自动驾驶传感器中成本最低、信息最丰富的传感器,但也是最容易出问题的传感器之一。

一、摄像头的工作原理

说白了,摄像头就是把光信号转成电信号,再转成数字信号。这个过程,我习惯把它拆成三步:

  1. 镜头聚光——光线通过镜头,聚焦到图像传感器上。
  2. 传感器光电转换——每个像素点把光强转成电压值。
  3. ADC 模数转换——电压值转成数字信号,输出 RAW 数据。

嗯,这里要注意。市面上主流的图像传感器有两种:CCD 和 CMOS。自动驾驶领域几乎全是 CMOS。为什么?因为 CMOS 功耗低、读取速度快。我早期做过一个项目,用了 CCD 传感器,结果帧率死活上不去,后来换成 CMOS 才解决问题。

小提示:CMOS 传感器每个像素自带放大器,所以读取速度比 CCD 快很多。但代价是噪声略大。不过现在的 ISP(图像信号处理器)已经能很好地处理这个问题了。

二、分辨率与帧率选择

很多同学问我:「分辨率是不是越高越好?」

我的回答是:不一定。

分辨率高,细节多,但数据量也大。你想想看,一张 4K 图像的数据量是 1080P 的 4 倍。处理不过来,延迟就上来了。自动驾驶最怕什么?延迟。

我个人习惯这样选:

应用场景 推荐分辨率 推荐帧率 说明
前视(远距离检测) 1920x1080 或更高 30fps 需要看清远处的行人、车辆
环视(近距离拼接) 1280x720 15-20fps 分辨率够用即可,帧率要求不高
侧视/后视 1280x720 25-30fps 兼顾清晰度和实时性
驾驶员监控 640x480 或 1280x720 15fps 不需要太高帧率,降低功耗

我在项目中遇到过一个问题:前视摄像头用了 4K 分辨率,结果算法处理一帧要 80 毫秒,整个系统延迟到了 150 毫秒以上。后来降到 1080P,帧率提到 30fps,延迟降到了 50 毫秒以内。效果反而更好。

注意:帧率不是越高越好。帧率太高,曝光时间短,暗光环境下图像质量会严重下降。我曾经为了追求 60fps,结果晚上图像全是噪点,根本没法用。

三、标定基础

标定,说白了就是让摄像头知道「自己在哪里,看到的东西在真实世界里是什么位置」。

标定分两种:

  • 内参标定——确定焦距、主点、畸变系数等内部参数。
  • 外参标定——确定摄像头相对于车体或其它传感器的位置和姿态。

内参标定最常用的方法是张正友标定法。你拿个棋盘格,拍几张不同角度的照片,然后用 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 = []  # 3D 点
imgpoints = []  # 2D 点

# 遍历图像
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)

外参标定就麻烦一些。我习惯用标定板或者已知特征点,通过 PnP 算法求解。嗯,这里有个坑——外参标定一定要在车辆静止状态下做,否则数据全废。

避坑指南:我曾经在标定环视摄像头时,没注意地面不平,结果标出来的外参全是错的。后来发现,标定场地一定要平整,最好用水平仪确认一下。

四、常见故障排查

做自动驾驶数据采集,摄像头出问题是家常便饭。我总结了几种最常见的故障:

  • 图像全黑或全白——大概率是曝光参数设置不对,或者硬件连接松动。先检查曝光时间,再检查线缆。
  • 图像闪烁——通常是帧率与光源频率不匹配。比如在 50Hz 的灯光下用 30fps 拍摄,就会出现闪烁。解决办法:把帧率设为 25fps 或 50fps。
  • 图像模糊——可能是镜头脏了,或者焦距没调好。先擦镜头,再检查自动对焦是否正常工作。
  • 图像有横纹/条纹——这是电磁干扰。检查摄像头线缆是否靠近大功率设备,或者换屏蔽线。
  • 帧率不稳定——可能是 USB 带宽不够,或者 CPU 负载过高。我建议用硬件触发同步,而不是软件触发。

重要提醒:数据采集时,一定要实时监控摄像头状态。我见过有人采集了一整天数据,回来发现摄像头根本没工作,全白干了。写个简单的监控脚本,每 5 秒检查一次帧率和图像亮度,很有必要。

知识体系总览

下面这张图,是我自己画的。它把摄像头模块的核心知识点串在了一起。你照着这个思路学,不会乱。

摄像头模块知识体系 摄像头 工作原理 镜头聚光 光电转换 ADC 模数转换 分辨率与帧率选择 前视:1080P@30fps 环视:720P@15fps 侧视:720P@25fps 标定基础 内参标定 外参标定 张正友标定法 常见故障排查 图像全黑/全白 图像闪烁/模糊 帧率不稳定 掌握这四块,摄像头模块就稳了

好了,这一章的内容就到这里。摄像头这块东西多,但别急,慢慢来。下一章咱们聊激光雷达,那个更有意思。

可可精品资料库