使用opencv进行c ++视频捕获

时间:2018-05-29 12:52:17

标签: c++ windows opencv video-capture

我尝试使用具有全高清分辨率的Logitech C920网络摄像头捕获视频。它提供30 fps的分辨率。

它适用于30 fps的Windows摄像头应用程序,但无论我尝试什么,我都无法使用opencv videoCapture获得此fps速率。

注意:我使用的是Windows 10和vs15。 我试过不同的USB端口,opencv版本和编解码器。结果相同,~5 fps。

我测量了忽略前10帧的fps。这是我的计算:只读=" 5.04fps" ,阅读+ imshow =" 4.97fps"并阅读+ 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();
}

1 个答案:

答案 0 :(得分:2)

首先:

imshow方法非常慢(在非常相对的范围内)。当你显示图像并且将图像写入文件时,尝试测量实际fps。

完成此操作后,您可以检查实际fps并确定两个选项中的哪一个(显示或写入)会降低您实现的fps速率。

请在不显示或写入图像的情况下发布所获得的fps速率的结果。

编辑:

好吧,你几乎总是得到5 fps,这有点慢。保存的视频(或图像)是否与您想要的分辨率相匹配?它们真的是1920x1080 ?

在这种情况下,测量的时间是否与发布和调试版本不同?

EDIT2:

如果相同的代码与其他USB摄像头一起工作(并且它们产生的fps比C920更多)我的直接怀疑是C920本身(或者至少是它的驱动程序)。如果你为它卸载驱动程序(最终重启)并再次安装最新的驱动程序会有帮助吗?

另一件事:如果您没有请求30但是可能像20 fps,那么测量的fps会改变吗?

EDIT3:

这似乎是一个驱动程序问题(从评论中合并)。重新安装驱动程序是一种解决此问题的方法