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

时间:2014-09-29 20:50:25

标签: c++ linux raspberry-pi webcam v4l2

我已经将一些摄像头连接到我的覆盆子pi并使用OpenCV捕获图像。然而,即使认为相机不动,图像看起来也不稳定。当我只运行一台摄像机时,这似乎不会发生,所以我认为这是USB带宽问题。为了减少带宽,我首先尝试降低帧速率。罗技C210应该能够支持5,10,15,20,25和30 fps的帧速率。

所以我一直在查看v4l2上的文档,因为看起来OpenCV仍然使用这个库(尽管不是很好)。我一直在使用v4l2_ioctl()没有问题来设置相机控件。由于某种原因,我无法以类似的方式设置帧速率。以下是我在文档here中执行的操作:。

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;
}

我没有编译问题,但是我收到了错误消息,表明该值未成功设置。

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

提前致谢!

2 个答案:

答案 0 :(得分:2)

您使用的是错误的结构。 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;
}

答案 1 :(得分:1)

另外请务必检查您是否在为这些网络摄像头供电时遇到问题。无法通过其USB端口提供大量电源,任何类似wifi加密狗(上帝,我讨厌那个词)都可能会竞争电源,我之前看到过糟糕的图片......也许是兼容RPi的有源集线器,即没有与Pi的5v连接的那个。购买rpi推荐的动力集线器。