我已经将一些摄像头连接到我的覆盆子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;
}
我没有编译问题,但是我收到了错误消息,表明该值未成功设置。
有没有人知道我做错了什么?
提前致谢!
答案 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推荐的动力集线器。