4、图像采集基础:摄像头调用、分辨率与帧率设置、图像格式转换、实时预览与保存
在Raspberry Pi工业检测项目中,图像采集是整个视觉系统的入口。摄像头能否被正确调用、图像参数是否匹配检测需求、格式转换是否高效、预览与保存是否稳定,直接决定了后续缺陷识别算法的输入质量与实时性。本章围绕这四个核心环节,从底层驱动到应用层API,系统讲解在Raspberry Pi上完成图像采集的完整技术路径。
4.1 摄像头调用:从硬件接口到软件API
核心原理:Raspberry Pi支持两类摄像头接入方式:一是通过CSI(Camera Serial Interface)接口连接的专用摄像头模块(如Raspberry Pi Camera Module 3、IMX219等),二是通过USB接口连接的UVC(USB Video Class)标准摄像头。CSI接口摄像头直接挂载在SoC的ISP(图像信号处理器)上,延迟低、占用CPU少,适合工业检测场景;USB摄像头则通过V4L2(Video4Linux2)驱动框架访问,兼容性好但CPU占用相对较高。
操作流程:在Raspberry Pi OS(Bookworm及以上版本)中,默认使用libcamera框架替代旧的raspistill/raspivid工具链。调用摄像头前需确认驱动加载状态:
# 检查摄像头是否被系统识别
libcamera-hello --list-cameras
# 或查看V4L2设备节点
ls -l /dev/video*
v4l2-ctl --list-devices
在Python环境中,推荐使用OpenCV的VideoCapture接口或Picamera2库。Picamera2是Raspberry Pi官方为libcamera提供的Python封装,支持更精细的ISP控制。以下代码展示了两种调用方式:
# 方式一:OpenCV调用USB摄像头
import cv2
cap = cv2.VideoCapture(0) # 0表示第一个摄像头设备
if not cap.isOpened():
print("无法打开摄像头")
exit(1)
# 方式二:Picamera2调用CSI摄像头
from picamera2 import Picamera2
picam2 = Picamera2()
config = picam2.create_still_configuration()
picam2.configure(config)
picam2.start()
/dev/video1。
4.2 分辨率与帧率设置:匹配检测需求与硬件能力
判断方法:分辨率决定了图像细节的丰富程度,帧率决定了单位时间内可处理的图像数量。在缺陷识别场景中,两者需要根据缺陷最小尺寸、传送带速度、算法处理耗时综合权衡。分辨率过高会导致数据量激增、处理延迟上升;帧率过低则可能漏检高速运动的缺陷。
| 分辨率 | 适用场景 | 帧率上限(CSI) | 帧率上限(USB 2.0) | 单帧BGR内存占用 |
|---|---|---|---|---|
| 640×480 | 粗定位、快速预检 | 90fps | 30fps | 约0.9MB |
| 1280×720 | 常规缺陷检测 | 60fps | 30fps | 约2.6MB |
| 1920×1080 | 精密缺陷识别 | 30fps | 15fps | 约6.2MB |
| 2592×1944 | 高精度静态检测 | 15fps | 不支持 | 约14.3MB |
操作流程:在OpenCV中设置分辨率和帧率时,需注意部分USB摄像头仅支持特定组合,设置无效值会被静默忽略。建议设置后立即读取实际值进行校验:
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
cap.set(cv2.CAP_PROP_FPS, 30)
# 校验实际生效参数
actual_w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
actual_h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
actual_fps = cap.get(cv2.CAP_PROP_FPS)
print(f"实际分辨率: {actual_w}x{actual_h}, 实际帧率: {actual_fps}")
top 或 htop 监控资源占用。
4.3 图像格式转换:YUV、RAW与BGR的相互转换
核心原理:摄像头传感器输出的原始数据通常是RAW格式(Bayer阵列)或YUV格式(亮度-色度分离)。OpenCV的VideoCapture默认输出BGR格式,但底层驱动实际传输的是YUV422或MJPEG。格式转换涉及色彩空间变换和数据重排,是CPU开销的重要来源。
判断方法:在工业检测中,需要根据算法需求选择输入格式。若使用OpenCV的深度学习模块(如YOLO),输入必须是BGR或RGB;若使用RAW格式进行图像增强,则需在ISP阶段处理。常见转换路径如下:
- YUV422 → BGR:标准转换,OpenCV内部自动完成,但可通过设置
CAP_PROP_CONVERT_RGB为0关闭自动转换,手动处理以节省内存拷贝。 - MJPEG → BGR:USB摄像头常用MJPEG压缩格式,需先解码为YUV再转BGR,CPU开销较大。
- RAW(Bayer)→ BGR:需调用ISP或OpenCV的
cvtColor配合去马赛克算法,通常仅在特殊检测需求下使用。
# 手动控制格式转换
cap.set(cv2.CAP_PROP_CONVERT_RGB, 0) # 关闭自动转换
ret, frame_yuv = cap.read() # 获取原始YUV帧
frame_bgr = cv2.cvtColor(frame_yuv, cv2.COLOR_YUV2BGR_YUY2) # 手动转换
cv2.COLOR_YUV2GRAY_YUY2 直接从YUV提取亮度分量。
4.4 实时预览与保存:显示、编码与存储策略
操作流程:实时预览用于调试阶段观察画面质量,生产阶段通常关闭预览以节省资源。OpenCV的 imshow 在Raspberry Pi上需要图形界面支持,若运行在无头模式(headless),可通过网络流或写入文件实现间接预览。
# 本地预览(需连接显示器)
cv2.namedWindow("Industrial Inspection", cv2.WINDOW_NORMAL)
cv2.resizeWindow("Industrial Inspection", 800, 600)
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow("Industrial Inspection", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 无头模式保存图像
cv2.imwrite("/home/pi/captures/frame_{}.jpg".format(counter), frame,
[cv2.IMWRITE_JPEG_QUALITY, 90])
案例拆解:某电子元件生产线需要检测PCB板上的焊点缺陷,传送带速度0.5m/s,相机视野宽度200mm,要求最小检测缺陷尺寸0.5mm。根据计算,所需最小分辨率为200/0.5=400像素,考虑边缘裕量选择640×480分辨率。传送带在视野内通过时间为0.4s,为保证至少采集3帧,帧率需≥8fps,实际选择15fps留出余量。摄像头选用CSI接口的IMX219模块,通过Picamera2配置如下:
picam2 = Picamera2()
config = picam2.create_video_configuration(
main={"size": (640, 480), "format": "RGB888"},
controls={"FrameRate": 15, "ExposureTime": 5000}
)
picam2.configure(config)
picam2.start()
# 采集并保存触发帧
for i in range(10):
frame = picam2.capture_array()
cv2.imwrite(f"/home/pi/defect_samples/sample_{i}.jpg", frame)
实际运行中,CPU占用率稳定在25%左右,帧率稳定在15fps,图像清晰无拖影。后续算法处理在另一线程执行,通过队列传递帧数据,实现了采集与检测的流水线并行。
cv2.imwrite 保存每一帧,但磁盘I/O会成为瓶颈。工业场景应使用内存缓存或定时批量写入,避免频繁磁盘操作导致帧丢失。
4.5 总结复盘:图像采集的工程化要点
图像采集看似简单,但在工业检测项目中却是最容易出现隐性问题的环节。通过本章学习,需要重点掌握以下要点:
- 接口选型:CSI摄像头延迟低、CPU占用小,适合实时检测;USB摄像头灵活但需关注带宽限制。
- 参数匹配:分辨率、帧率必须与检测精度、运动速度、算法耗时联动设计,不能孤立设置。
- 格式意识:理解底层格式转换路径,在性能敏感时绕过不必要的转换步骤。
- 资源监控:定期检查CPU、内存、磁盘I/O,确保采集环节不成为系统瓶颈。
- 异常处理:摄像头断开、参数设置失败、帧读取超时等异常必须纳入代码健壮性设计。
建议在项目初期建立图像采集的基准测试脚本,记录不同参数组合下的实际帧率、CPU占用和图像质量,为后续算法开发提供稳定的数据源基础。