1. 摄像头选型与接口:USB摄像头 vs MIPI摄像头 vs 网络摄像头

做嵌入式视觉开发,第一步就是选摄像头。说实话,我见过太多项目在摄像头选型上栽跟头——不是分辨率选高了跑不动,就是接口没选对导致驱动写死人。今天咱们就把这事聊透。

1.1 三种摄像头,各自什么来头?

USB摄像头,说白了就是即插即用。你买个罗技C920,插到电脑上就能用。为什么?因为它内部集成了ISP(图像信号处理器),把原始图像数据直接转成了UVC(USB Video Class)标准格式。我早期做安防项目时,图省事全用USB摄像头,结果发现一个问题——USB带宽是共享的,插多了就掉帧。

MIPI摄像头,这是嵌入式板子的亲儿子。树莓派、瑞芯微、全志这些开发板,板载的摄像头接口基本都是MIPI CSI。MIPI走的是差分信号,抗干扰强,带宽也大。但有个坑——它没有标准协议,每家芯片厂的驱动都不一样。我曾在RK3399上调试一个OV5640,折腾了整整三天才点亮。

网络摄像头(IP Camera),走的是以太网,用RTSP或ONVIF协议传输。适合远距离部署,比如工厂产线监控。但延迟是个问题,局域网内一般100-200ms,做实时控制就别想了。

类型 接口 驱动难度 延迟 典型场景
USB摄像头 USB 2.0/3.0 低(UVC标准) 30-50ms 桌面应用、快速原型
MIPI摄像头 MIPI CSI 高(需适配驱动) 10-20ms 嵌入式设备、低延迟场景
网络摄像头 RJ45 中(RTSP/ONVIF) 100-200ms 远程监控、分布式系统

我的建议:做原型验证用USB摄像头,最快。做量产产品用MIPI,成本低、延迟小。做远程监控用网络摄像头,别纠结。

1.2 分辨率与帧率,别盲目追高

很多新手上来就要4K 60fps。嗯,我理解这种冲动。但你要想清楚:你的处理器扛得住吗?你的带宽够吗?你的应用需要吗?

举个例子。我做车牌识别时,一开始用1080p 30fps,结果发现处理器解码都来不及,识别帧率只有5fps。后来降到720p 15fps,识别率反而上去了。为什么?因为处理器有余力做更复杂的算法了。

这里给个经验值:

  • 人脸检测/识别:720p 15fps 足够,再高就是浪费
  • 车牌识别:1080p 25fps,要保证运动模糊小
  • 工业质检:看产线速度,有时需要全局快门+高帧率
  • AI视觉:分辨率不是关键,模型输入尺寸才是

注意:分辨率越高,每帧数据量越大。1080p一帧约6MB(YUV420),4K一帧约24MB。你算算你的DDR带宽和总线带宽够不够?我曾经在项目里因为没算这个,导致系统卡死,后来被迫降分辨率。

1.3 接口协议:UVC vs V4L2

这两个协议,是嵌入式视觉开发者绕不开的坎。

UVC(USB Video Class),是USB摄像头的事实标准。你插上摄像头,Linux内核自动识别,生成/dev/video0节点。应用层直接用V4L2 API就能操作。我习惯用v4l2-ctl工具先看看设备能力:

# 查看摄像头支持的分辨率和帧率
v4l2-ctl -d /dev/video0 --list-formats-ext

# 设置格式
v4l2-ctl -d /dev/video0 --set-fmt-video=width=1280,height=720,pixelformat=YUYV

# 抓一帧测试
v4l2-ctl -d /dev/video0 --stream-mmap --stream-to=test.yuv --stream-count=1

V4L2(Video for Linux 2),是Linux下视频设备驱动的标准框架。不管是USB摄像头还是MIPI摄像头,最终都通过V4L2接口暴露给应用层。说白了,V4L2是内核和应用程序之间的桥梁。

MIPI摄像头在V4L2里走的是subdev架构。你需要先配传感器(sensor),再配ISP,最后才能拿到图像。我调试MIPI摄像头时,最常用的命令是:

# 查看所有video节点
ls /dev/video*

# 查看subdev信息
media-ctl -p

# 设置MIPI摄像头分辨率
media-ctl -d /dev/media0 --set-v4l2 '"ov5640 0-003c":0[fmt:UYVY8_2X8/640x480]'

小技巧:调试MIPI摄像头时,先用media-ctl把整个pipeline画出来,看看数据流对不对。我每次都会先做这一步,能省掉一半的调试时间。

1.4 选型避坑指南

这些年踩过的坑,我总结了几条:

  • 别信标称参数:有些USB摄像头标称1080p 30fps,实际在Linux下只能跑15fps。为什么?因为驱动没优化。我建议买之前先查查有没有Linux驱动支持。
  • 注意传感器类型:卷帘快门(Rolling Shutter)拍运动物体会变形,全局快门(Global Shutter)才适合工业场景。我吃过这个亏,拍高速运动的螺丝,结果图像扭曲得没法看。
  • MIPI的线长限制:MIPI信号一般不能超过30cm,长了就衰减。如果你需要远距离,要么用USB延长器,要么换网络摄像头。
  • UVC的坑:有些USB摄像头虽然支持UVC,但只支持MJPEG格式,不支持YUV。MJPEG解码需要CPU,会占用大量资源。我建议优先选支持YUV格式的。

好了,这一章就聊到这。下一章咱们讲视频采集的实战——怎么用V4L2 API写一个高效的采集程序。到时候我会把代码一行行拆开讲,保证你听完就能上手。