使用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)
比如,上面的输出表示摄像头支持MJPG
和YUYV
两种格式,单引号里面的是格式名称,括号里面的是格式描述,比如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
此命令将output.yuv
文件转换为result.jpg
文件。注意对应的参数要和上面的命令一一对应。
可以使用
ffmpeg -pix_fmts
命令查看ffmpeg
支持的格式
3.2 在Windows下查看摄像头图像
在Windows下查看摄像头图像,可以使用7yuv
软件(http://datahammer.de/)。
打开软件后,点击File
->Open
,选择output.yuv
文件打开。设置Format
为YUV422 YUYV
,Width
为1280
,Height
为720
。此时,就可以看到摄像头图像了。
注意:这里均假设摄像头图像格式为
YUYV
,分辨率为1280x720
。如果不是这样,需要根据实际情况修改命令参数。
比如我是用了一个Bayer RG10格式的摄像头,这时上面的对应的位置都要更换。7yuv
这个软件也可以查看Bayer类型的图像,但是没有我需要的RG10
的格式,因此如果你也是这种格式,注意除了Format
要设置为Bayer RGGB 16-bit
,Width
和Height
要设置为摄像头的分辨外,还要设置Bits
为10
或更低。
特此记录!
如有错误,欢迎指正!