使用opencv的c ++视频捕获
c++ video capture using opencv
我尝试使用全高清分辨率的罗技 C920 网络摄像头捕捉视频。此分辨率提供 30 fps。
它以 30 fps 的速度与 windows 相机应用程序配合使用,但无论我尝试什么,我都无法使用 opencv videoCapture 获得此 fps 速率。
注意:我使用 windows 10 和 vs15。
我尝试了不同的 USB 端口、opencv 版本和编解码器。结果相同,~5 fps。
我测量的 fps 忽略了前 10 帧。这是我的计算:仅 read = "5.04fps" 、 read+imshow = "4.97fps" 和 read+imshow+write = "4.91fps"
void main()
{
mainStream.open(0);
mainStream.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
mainStream.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
mainStream.set(CV_CAP_PROP_FPS, 30);
mainStream.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
mainWriter.open("outputnew2.avi", CV_FOURCC('M', 'J', 'P', 'G'), 30, cv::Size(frameW, frameH), true);
namedWindow("frame", 1);
while (true){
Mat frame;
mainStream >> frame;
imshow("frame", frame);
if (waitKey(5) == 27)
break;
mainWriter << frame;
}
mainStream.release();
mainWriter.release();
}
首先:
imshow
方法非常慢(在相对范围内)。在 not 显示图像和 not 将图像写入文件时尝试测量真实的 fps。
完成后,您可以检查实际 fps 并确定两个选项(显示或写入)中的哪一个正在减慢您达到的 fps 速率。
请post在不显示或写入图像的情况下获得 fps 速率的结果。
编辑:
好的,您几乎总是达到 5 fps,这有点慢。保存的视频(或图像)是否符合您想要的分辨率?他们真的是1920x1080吗
?
在那种情况下,测量的时间是否与发布和调试版本不同?
编辑2:
如果相同的代码适用于其他 USB 摄像头(并且它们产生的 fps 比 C920 更高),我的直接怀疑是 C920 本身(或至少是它的驱动程序)。如果您为它卸载驱动程序(最终重新启动)并重新安装最新的驱动程序是否有帮助?
另一件事:如果您不要求 30 但可能要求 20 fps,测量的 fps 会改变吗?
编辑 3:
这似乎是一个驱动程序问题(从评论中合并)。重新安装驱动程序是解决此问题的一种方法
我尝试使用全高清分辨率的罗技 C920 网络摄像头捕捉视频。此分辨率提供 30 fps。
它以 30 fps 的速度与 windows 相机应用程序配合使用,但无论我尝试什么,我都无法使用 opencv videoCapture 获得此 fps 速率。
注意:我使用 windows 10 和 vs15。 我尝试了不同的 USB 端口、opencv 版本和编解码器。结果相同,~5 fps。
我测量的 fps 忽略了前 10 帧。这是我的计算:仅 read = "5.04fps" 、 read+imshow = "4.97fps" 和 read+imshow+write = "4.91fps"
void main()
{
mainStream.open(0);
mainStream.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
mainStream.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
mainStream.set(CV_CAP_PROP_FPS, 30);
mainStream.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
mainWriter.open("outputnew2.avi", CV_FOURCC('M', 'J', 'P', 'G'), 30, cv::Size(frameW, frameH), true);
namedWindow("frame", 1);
while (true){
Mat frame;
mainStream >> frame;
imshow("frame", frame);
if (waitKey(5) == 27)
break;
mainWriter << frame;
}
mainStream.release();
mainWriter.release();
}
首先:
imshow
方法非常慢(在相对范围内)。在 not 显示图像和 not 将图像写入文件时尝试测量真实的 fps。
完成后,您可以检查实际 fps 并确定两个选项(显示或写入)中的哪一个正在减慢您达到的 fps 速率。
请post在不显示或写入图像的情况下获得 fps 速率的结果。
编辑:
好的,您几乎总是达到 5 fps,这有点慢。保存的视频(或图像)是否符合您想要的分辨率?他们真的是1920x1080吗 ?
在那种情况下,测量的时间是否与发布和调试版本不同?
编辑2:
如果相同的代码适用于其他 USB 摄像头(并且它们产生的 fps 比 C920 更高),我的直接怀疑是 C920 本身(或至少是它的驱动程序)。如果您为它卸载驱动程序(最终重新启动)并重新安装最新的驱动程序是否有帮助?
另一件事:如果您不要求 30 但可能要求 20 fps,测量的 fps 会改变吗?
编辑 3:
这似乎是一个驱动程序问题(从评论中合并)。重新安装驱动程序是解决此问题的一种方法