v4l2 fcntl.ioctl VIDIOC_S_PARM para configurar fps y resolución de captura de cámara

Estoy intentando configurar fps y la resolución de la cámara web y capturar desde ella a través de v4l2 Python.

v4l2 La documentación de Python está limitada a;

>>> 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' 

Mirando el videodev2.h;

 #define VIDIOC_S_PARM _IOWR('V', 22, struct v4l2_streamparm) 

VIDIOC_S_PARM está relacionado con v4l2_streamparm que es;

 struct v4l2_streamparm { enum v4l2_buf_type type; union { struct v4l2_captureparm capture; struct v4l2_outputparm output; __u8 raw_data[200]; /* user-defined */ } parm; }; 

Y si quiero configurar el parámetro;

 import v4l2 import fcntl vd = open('/dev/video1', 'rw') cp = v4l2.v4l2_streamparm() fcntl.ioctl(vd, v4l2.v4l2_streamparm, cp) 

Esto es lo más lejos que pude.

¿Cómo puedo ajustar la velocidad de fps y la resolución de la cámara con Python v4l2 y capturar imágenes desde ella?

Desde el lado V4L2, necesitas:

  • utilice el ioctl VIDIOC_G_PARM y verifique el miembro v4l2_streamparm.parm.capture.capability para averiguar si el controlador permite V4L2_CAP_TIMEPERFRAME .
  • si es así, use el VIDIOC_ENUM_FRAMEINTERVALS ioctl para obtener la lista de posibles intervalos de cuadros (inverso de las tablas de cuadros), en forma de estructuras v4l2_fract
  • use estos valores con el ioctl VIDIOC_S_PARM y complete el miembro v4l2_streamparm.parm.capture.timeperframe .

Eso debería permitir establecer la velocidad de fotogtwigs del lado de captura. Es tu tarea asegurarte de que estás leyendo lo suficientemente rápido como para que no se caigan los marcos.