从OpenCV 3切换到OpenCV 4会导致网络摄像头以最高5帧的速度记录,而不是通常的30帧。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从OpenCV 3切换到OpenCV 4会导致网络摄像头以最高5帧的速度记录,而不是通常的30帧。相关的知识,希望对你有一定的参考价值。

自从我在C++项目中从OpenCV 3.x改成4.x(从源码编译)后,我遇到了一些麻烦。我在一个小例子中复制了这种行为,这个例子只是打开一个网络摄像头并记录5秒钟。

在3.x中,我可以在全高清下将摄像头的帧率设置为30,但在4.x中,同样的代码只是忽略了 camera.set(cv::CAP_PROP_FPS,30) 并将其设置为5,而不是。如果我使用720p,fps被设置为10。

也许这段代码与这里无关,因为这是一个经典的例子,但为了以防万一,我会把它留在这里。

#include "opencv2/opencv.hpp"
#include "iostream"
#include "thread"
#include <unistd.h>

using namespace cv;

VideoCapture camera(0);
bool stop = false;
int fc = 0;

void saveFrames()
{
    while(!stop)
    {
        Mat frame;
        camera >> frame;
        cv::imwrite("/tmp/frames/frame" + std::to_string(fc) + ".jpg", frame);
        fc++;
    }
}

int main()
{
    if(!camera.isOpened())
        return -1;

    camera.set(cv::CAP_PROP_FRAME_WIDTH,1920);
    camera.set(cv::CAP_PROP_FRAME_HEIGHT,1080);
    camera.set(cv::CAP_PROP_FPS,30);

    double fps = camera.get(cv::CAP_PROP_FPS);
    std::cout << "FPS setting: " << fps << std::endl; // 5 with OCV4, 30 with OCV3

    std::thread tr(saveFrames);
    int waitSeconds = 5;
    usleep(waitSeconds * 1e6);
    stop = true;
    tr.join();

    std::cout << "Written " << fc << " frames of " << fps * waitSeconds << std::endl;
    return 0;
}

编辑:更多的测试与其他计算机产生相同的结果,除了在Macbook Pro(但运行相同的发行版),OpenCV 4.3似乎工作。其他2台电脑是带USB摄像头的台式机。

编辑2: 从源代码构建3.4版本也有同样的问题。目前,只有3.2版本的源码在两台带USB摄像头的电脑上运行正常。

答案

这是一个 已知错误 影响OpenCV > 3.3

以上是关于从OpenCV 3切换到OpenCV 4会导致网络摄像头以最高5帧的速度记录,而不是通常的30帧。的主要内容,如果未能解决你的问题,请参考以下文章

将灰度图像中的像素转换为黑色(OpenCV)会导致意外结果?

如何切换到 OpenCV 3.0 的静态库以便 exe 是独立的?

opencv 车牌字符分割 ANN网络识别字符

OpenCv - 从网络摄像头捕获帧时发生内存泄漏

毕业设计 - 题目:基于机器视觉opencv的手势检测 手势识别 算法 - 深度学习 卷积神经网络 opencv python

opencv.imshow 会导致 jupyter notebook 崩溃