方法1:V4L2读取-转换-缩放-合成-显示(实时显示、用户操作或图像算法预处理)
这是一个更高级、更完整的图像处理和显示方案,其特点是:
-
结构体封装、模块化设计:代码通常使用结构体来管理摄像头、图像缓冲区、显示设备等,方便扩展、维护。
-
包含图像预处理:
- 图像格式转换(如 YUYV → RGB)
- 图像缩放(适配不同显示分辨率)
- 图像合成(比如叠加文字、水印、多摄像头拼接)
- 实时显示(比如通过 framebuffer、SDL、OpenCV 显示图像)
-
适用于复杂应用:
- 视频实时预览
- 多画面合成
- 图像算法(比如人脸识别、边缘检测)处理前的准备工作
方法2:V4L2最小采集流程(后台采集照片、低资源占用)
这是V4L2最基本、最小化的采集流程,主要目的就是快速获取图像帧。其特点是:
特点:
-
代码简单,逻辑清晰:专注于采集流程,不涉及图像显示。
-
可用于拍照、存图:直接把采集到的数据保存为图像文件(如.raw、.jpg)
-
适合批处理、后端任务:
- 定时拍照
- 后台图像采集服务
- 嵌入式设备做轻量图像采集
缺点:
- 没有图像转换和显示功能
- 通常需要后处理才能得到 JPEG/PNG 格式(因为原始格式如 YUYV 不能直接查看)
- 如果要扩展成实时预览系统,代码需要大改
为什么还要实现方法1?
虽然方法2足以完成拍照任务,但在很多实际项目中:
- 需要预览图像(用户交互/调试)
- 需要处理图像后再保存(如裁剪/滤波)
- 需要嵌入到 UI 或服务中
实现功能1:检测到人脸时自动拍照
推荐方法:方法① + OpenCV人脸检测
理由:需要对图像内容做实时处理(人脸检测),这就必须“读取图像 → 转换格式 → 用 OpenCV 检测人脸”,这属于图像处理流程,方法②无法满足。
为什么方法②不适合?
方法②虽然可以拍照,但采集的是原始帧数据(如YUYV) ,不能直接送入人脸检测算法。
你还需要:
- 手动将 YUYV 转换为 RGB 或灰度图
- 加载人脸检测模型(如 Haar / DNN)
- 判断是否有人脸
- 有人脸再保存图像
这等于是手动重写方法①的一部分,不如直接使用方法①配合 OpenCV。