使用V4L2命令获取一帧摄像头源数据

发布时间 2023-11-12 14:15:59作者: BryceAi

使用V4L2命令获取一帧摄像头源数据

1. 介绍

V4L2是Linux下的视频设备驱动框架,它提供了一套统一的接口,使得应用程序可以通过统一的接口访问各种视频设备。

下面介绍如何使用V4L2命令获取一帧摄像头源数据。

2. 使用V4L2命令获取一帧摄像头源数据

2.1. 获取摄像头设备名称

使用v4l2-ctl --list-devices命令获取摄像头设备名称,如下所示:

$ sudo v4l2-ctl --list-devices
Integrated Camera: Integrated C (usb-0000:0b:00.0-2):
        /dev/video0     # 我们需要的摄像头设备名称
        /dev/video1
        /dev/video2
        /dev/video3
        /dev/media0
        /dev/media1

2.2. 获取摄像头格式

使用v4l2-ctl --list-formats-ext命令获取摄像头格式,如下所示:

$ sudo v4l2-ctl --list-formats-ext -d /dev/video0
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'MJPG' (Motion-JPEG, compressed)
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 320x180
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 320x240
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 352x288
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 424x240
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 640x360
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 848x480
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 960x540
                        Interval: Discrete 0.033s (30.000 fps)
        [1]: 'YUYV' (YUYV 4:2:2)    # 我们需要的摄像头格式,既单引号里的内容
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 320x180
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 320x240
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 352x288
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 424x240
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 640x360
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 848x480
                        Interval: Discrete 0.050s (20.000 fps)
                Size: Discrete 960x540
                        Interval: Discrete 0.067s (15.000 fps)
                Size: Discrete 1280x720     # 我们需要的摄像头分辨率
                        Interval: Discrete 0.100s (10.000 fps)

比如,上面的输出表示摄像头支持MJPGYUYV两种格式,单引号里面的是格式名称,括号里面的是格式描述,比如MJPG格式是Motion-JPEG, compressed,表示MJPG格式是压缩的Motion-JPEG格式。我们选择YUYV格式。

2.3. 获取摄像头图像

使用下面的命令,获取摄像头图像:

$ v4l2-ctl --stream-mmap --stream-count=1 -d /dev/video0 --set-fmt-video=width=1280,height=720,pixelformat=YUYV --stream-to=output.yuv

若无权限,可使用sudo命令,如下所示:

$ sudo v4l2-ctl --stream-mmap --stream-count=1 -d /dev/video0 --set-fmt-video=width=1280,height=720,pixelformat=YUYV --stream-to=output.yuv

下面是命令的详细说明:

  • --stream-mmap:使用mmap方式获取摄像头图像数据,也就是说,摄像头图像数据会被映射到用户空间,用户空间可以直接访问摄像头图像数据。
  • --stream-count=1:获取一帧摄像头图像数据。
  • -d /dev/video0:指定摄像头设备名称。这个名称可以通过v4l2-ctl --list-devices命令获取。
  • --set-fmt-video=width=1280,height=720,pixelformat=YUYV:指定摄像头图像格式,这里我们选择YUYV格式,分辨率为1280x720
    • 注意,这里的格式必须一一对应。
  • --stream-to=output.yuv:将摄像头图像数据保存到output.yuv文件中。

3. 查看摄像头图像

3.1 使用ffmpeg命令查看摄像头图像

使用ffmpeg命令查看摄像头图像,如下所示:

$ ffmpeg -pix_fmt yuyv422 -s 1280x720 -i output.yuv result.jpg

3.2 在Windows下查看摄像头图像

在Windows下查看摄像头图像,可以使用7yuv软件(http://datahammer.de/)。

打开软件后,点击File->Open,选择output.yuv文件打开。设置FormatYUV422 YUYVWidth1280Height720。此时,就可以看到摄像头图像了。

注意:这里均假设摄像头图像格式为YUYV,分辨率为1280x720。如果不是这样,需要根据实际情况修改命令参数。
比如我是用了一个Bayer RG10格式的摄像头,这时上面的对应的位置都要更换。7yuv这个软件也可以查看Bayer类型的图像,但是没有我需要的RG10的格式,因此如果你也是这种格式,注意除了Format要设置为Bayer RGGB 16-bitWidthHeight要设置为摄像头的分辨外,还要设置Bits10或更低。

特此记录!
如有错误,欢迎指正!