v4l2 fcntl.ioctl VIDIOC_S_PARM 用于设置相机捕获的 fps 和分辨率

y33*_*33t 5 python webcam v4l2

我正在尝试设置网络摄像头的 fps 和分辨率,并通过 v4l2 Python 进行捕获。

v4l2 Python 文档仅限于;

>>> import v4l2
>>> import fcntl
>>> vd = open('/dev/video0', 'rw')
>>> cp = v4l2.v4l2_capability()
>>> fcntl.ioctl(vd, v4l2.VIDIOC_QUERYCAP, cp)
0
>>> cp.driver
'ov534'
>>> cp.card
'USB Camera-B4.09.24.1'
Run Code Online (Sandbox Code Playgroud)

查看 videodev2.h ;

#define VIDIOC_S_PARM       _IOWR('V', 22, struct v4l2_streamparm)
Run Code Online (Sandbox Code Playgroud)

VIDIOC_S_PARM 与 v4l2_streamparm 相关;

struct v4l2_streamparm {
    enum v4l2_buf_type type;
union {
    struct v4l2_captureparm capture;
    struct v4l2_outputparm  output;
    __u8    raw_data[200];  /* user-defined */
} parm;
};
Run Code Online (Sandbox Code Playgroud)

如果我想设置参数;

import v4l2
import fcntl
vd = open('/dev/video1', 'rw')
cp = v4l2.v4l2_streamparm()
fcntl.ioctl(vd, v4l2.v4l2_streamparm, cp)
Run Code Online (Sandbox Code Playgroud)

这是我所能得到的。

如何使用 Python v4l2 调整相机的 fps 速率和分辨率并从中捕获图像?

Fra*_*kH. 5

从V4L2方面,您需要:

  • 使用VIDIOC_G_PARMioctl 并检查v4l2_streamparm.parm.capture.capability成员以查明驱动程序是否允许V4L2_CAP_TIMEPERFRAME
  • 如果是这样,请使用ioctl 以结构体VIDIOC_ENUM_FRAMEINTERVALS的形式获取可能的帧间隔列表(帧速率的倒数)v4l2_fract
  • 将这些值与VIDIOC_S_PARMioctl 一起使用并填写v4l2_streamparm.parm.capture.timeperframe成员。

这应该允许设置捕获端帧速率。您的任务是确保您的阅读速度足够快而不会掉帧。