【问题标题】:Setting Frame Rate on Logitech C210 webcam in C++ on Raspberry pi using v4l2使用 v4l2 在 Raspberry pi 上使用 C++ 设置 Logitech C210 网络摄像头的帧速率
【发布时间】:2014-09-29 20:50:25
【问题描述】:

我有一些网络摄像头连接到我的树莓派,并正在使用 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;
}

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

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

提前致谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      还要确保检查您在为这些网络摄像头供电时是否遇到问题。 pi 无法从其 USB 端口提供太多电力,任何像 wifi 加密狗(上帝,我讨厌这个词)可能会争夺电力,结果我之前看到过糟糕的图片......也许是一个与 RPi 兼容的有源集线器,即与 Pi 没有 5v 连接的设备。购买 rpi 推荐的有源集线器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-12
        • 2018-09-05
        • 2012-03-16
        • 2016-12-04
        • 2020-03-29
        相关资源
        最近更新 更多