使用v4l2在Raspberry pi上用C++在Logitech C210网络摄像头上设置帧速率
Setting Frame Rate on Logitech C210 webcam in C++ on Raspberry pi using v4l2
我有一些网络摄像头连接到我的树莓派,正在使用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推荐的电源集线器。
相关文章:
- OpenCV 4.1.2 - 从网络摄像头获取帧并将其拆分
- 使用OpenCV和覆盆子上的多个网络摄像头拍摄延时摄影,出现多个V4L错误
- 使用源读取器从网络摄像头源获取 H264 样本
- 为什么我不能让 3 个网络摄像头与 pthreads 并行运行?
- 从 OpenCV 3 切换到 OpenCV 4 会导致网络摄像头以最大 5 fps 的速度录制,而不是通常的 30 f
- 媒体基金会可以允许多个客户端同时访问单个网络摄像头设备吗?
- 从C++调用网络摄像头并在 Python 中显示图像
- 从 WinPE 下的网络摄像头捕获?
- OpenCV没有显示来自Macbook网络摄像头的视频
- 使用OpenCV和C++在按键上截取网络摄像头源的屏幕截图
- 我正在尝试在树莓派中连接两个网络摄像头
- 使用 FFmpeg 编码和带有网络摄像头的 UDP
- TensorFlow OpenCV网络摄像头悬挂
- 使用来自视频文件或网络摄像头的 Kinect 面部跟踪
- OpenCV 将剪影与网络摄像头流隔离
- OpenCV-从C/C++中的默认网络摄像头获取图片-GTK问题
- 在 OpenCV 中,设置曝光会导致我的网络摄像头软件无法自动调整曝光
- 无法使用OpenCV从辅助网络摄像头读取VideoCapture中的帧
- 使用Opencv直接从网络摄像头获取灰度图像
- 使用Qt显示来自OpenCV的网络摄像头流