使用v4l2在Raspberry pi上用C++在Logitech C210网络摄像头上设置帧速率

Setting Frame Rate on Logitech C210 webcam in C++ on Raspberry pi using v4l2

本文关键字:摄像头 网络 设置 帧速率 C210 C++ Raspberry v4l2 pi 上用 使用      更新时间:2023-10-16

我有一些网络摄像头连接到我的树莓派,正在使用OpenCV拍摄图像。然而,即使考虑到摄像机没有移动,图像看起来也有点摇晃。当我只运行一台相机时,这种情况似乎不会发生,所以我认为这是USB带宽问题。为了减少带宽,我开始尝试降低帧速率。罗技C210应该能够支持5、10、15、20、25和30帧/秒的帧速率。

因此,我一直在查看v4l2上的文档,因为OpenCV似乎无论如何都在使用这个库(尽管不是很好)。我一直在毫无问题地使用v4l2_ioctl()来设置相机控制。由于某种原因,我无法以类似的方式设置帧速率。以下是我在这里的文档中所做的工作:。

int descriptor = v4l2_open("/dev/video0", O_RDWR);
v4l2_captureparm s;
s.capability = V4L2_CAP_TIMEPERFRAME;
s.timeperframe.numerator = 1;
s.timeperframe.denominator = 5;
if( v4l2_ioctl(descriptor, VIDIOC_S_PARM, &s) !=0 ) 
{
     cout<< "Failed to set frame rate "<<endl;
}

我在编译时没有问题,但我确实收到了定制的错误消息,指示该值尚未成功设置。

有人知道我做错了什么吗?

提前感谢!

您使用了错误的结构。Y0u应该使用

struct v4l2_streamparm

而不是

struct v4l2_captureparm

首先检查您的相机是否支持所需资源和像素格式的帧速率:

v4l2-ctl --list-formats-ext

然后,您需要设置分辨率和像素格式。例如:

struct v4l2_format fmt;
meset(&fmt, 0, sizeof(fmt));
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width       = 1280;
fmt.fmt.pix.height      = 720;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_MJPEG;
fmt.fmt.pix.field       = V4L2_FIELD_NONE;
if (v4l2_ioctl(m_fd, VIDIOC_S_FMT, &fmt) != 0)
{
   // Error
}

理想情况下,主格和分母应从设备中枚举的一个中选择。此外,您应该获得v4l2_streamparm结构:

struct v4l2_streamparm streamparm;
memset(&streamparm, 0, sizeof(streamparm));
streamparm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (v4l2_ioctl(m_fd, VIDIOC_G_PARM, &streamparm) != 0)
{
   // Error
}
streamparm.parm.capture.capturemode |= V4L2_CAP_TIMEPERFRAME;
streamparm.timeperframe.numerator = X;
streamparm.timeperframe.denominator = y;
if(v4l2_ioctl(descriptor,VIDEO_S_PARM, &s) !=0) 
{
     cout<< "Failed to set frame rate "<<endl;
}

此外,请确保检查这些网络摄像头的电源是否存在问题。pi无法从其USB端口提供太多电力,任何像wifi加密狗(天哪,我讨厌这个词)这样的东西都可能在争夺电力,我以前也看到过不好的画面。。。也许是一个与RPi兼容的电源集线器,即没有5伏连接到Pi的集线器。购买rpi推荐的电源集线器。