V4L2采集数据的两种方法

210 阅读2分钟

方法1:V4L2读取-转换-缩放-合成-显示(实时显示、用户操作或图像算法预处理)

这是一个更高级、更完整的图像处理和显示方案,其特点是:

  • 结构体封装、模块化设计:代码通常使用结构体来管理摄像头、图像缓冲区、显示设备等,方便扩展、维护。

  • 包含图像预处理

    • 图像格式转换(如 YUYV → RGB)
    • 图像缩放(适配不同显示分辨率)
    • 图像合成(比如叠加文字、水印、多摄像头拼接)
    • 实时显示(比如通过 framebuffer、SDL、OpenCV 显示图像)
  • 适用于复杂应用

    • 视频实时预览
    • 多画面合成
    • 图像算法(比如人脸识别、边缘检测)处理前的准备工作

方法2:V4L2最小采集流程(后台采集照片、低资源占用)

这是V4L2最基本、最小化的采集流程,主要目的就是快速获取图像帧。其特点是:

特点:

  • 代码简单,逻辑清晰:专注于采集流程,不涉及图像显示。

  • 可用于拍照、存图:直接把采集到的数据保存为图像文件(如.raw、.jpg)

  • 适合批处理、后端任务

    • 定时拍照
    • 后台图像采集服务
    • 嵌入式设备做轻量图像采集

缺点:

  • 没有图像转换和显示功能
  • 通常需要后处理才能得到 JPEG/PNG 格式(因为原始格式如 YUYV 不能直接查看)
  • 如果要扩展成实时预览系统,代码需要大改

为什么还要实现方法1?

虽然方法2足以完成拍照任务,但在很多实际项目中:

  • 需要预览图像(用户交互/调试)
  • 需要处理图像后再保存(如裁剪/滤波)
  • 需要嵌入到 UI 或服务中

1748538483799.png

实现功能1:检测到人脸时自动拍照

推荐方法:方法① + OpenCV人脸检测

理由:需要对图像内容做实时处理(人脸检测),这就必须“读取图像 → 转换格式 → 用 OpenCV 检测人脸”,这属于图像处理流程,方法②无法满足。

为什么方法②不适合?

方法②虽然可以拍照,但采集的是原始帧数据(如YUYV) ,不能直接送入人脸检测算法。

你还需要:

  • 手动将 YUYV 转换为 RGB 或灰度图
  • 加载人脸检测模型(如 Haar / DNN)
  • 判断是否有人脸
  • 有人脸再保存图像

这等于是手动重写方法①的一部分,不如直接使用方法①配合 OpenCV。

1748539039455.png