c++ - OpenCV - 来自相机的实时反馈不流畅

标签 c++ opencv

我正在尝试从我的网络摄像头捕捉实时画面,但是当我显示我正在捕捉的帧时,画面并不流畅。显示帧之间有短暂的中断。

这是我的一些代码:

class Entity : public VideoLoader, public ImageReader, public Display
{
public:
    Entity();
    void init();
private:
    std::unique_ptr<VideoLoader> ptrVideoLoaderObj;
    std::unique_ptr<ImageReader> ptrImageReaderObj;
    std::unique_ptr<Display> ptrDisplayObj;
};

Entity::Entity()
{
    ptrVideoLoaderObj = std::make_unique<VideoLoader>();
    ptrImageReaderObj = std::make_unique<ImageReader>();
    ptrDisplayObj = std::make_unique<Display>();
}

void Entity::init()
{
    cv::Mat frame;

    while (true) {
        ptrVideoLoaderObj->loadImageFromCam(frame);

        if (ptrVideoLoaderObj->checkIfFrameIsEmpty(frame)) {
            std::cerr<<"ERROR: captured empty frame\n";
            break;
        }

        ptrDisplayObj->displayImage(frame);

        if (cv::waitKey(30) >= 0)
            break;
    }
}

下面是方法的实现,捕获帧和显示帧:

class VideoLoader
{
public:
    cv::Mat loadImageFromCam(cv::Mat &frame);
    bool checkIfFrameIsEmpty(cv::Mat &frame);
private:
    cv::VideoCapture cam;
};

cv::Mat VideoLoader::loadImageFromCam(cv::Mat &frame)
{
    cam.open(0);
    cam >> frame;

    return frame;   
}


class Display
{
public:
    void displayImage(cv::Mat &img) const;
};

但是当我做这样的事情时:

Entity::Entity()
{
    cv::Mat frame;
    cv::VideoCapture cam(0);

    while (true) {
        cam >> frame;
        cv::imshow("feed", frame);

        if (cv::waitKey(30) >= 0)
            break;
    }
}

我的显示很流畅。

我应该在我的代码中更改什么以获得流畅的提要?

最佳答案

不要调用 cam.open(0);在 VideoLoader::loadImageFromCam(cv::Mat &frame) 中,否则它将被重复调用。

class VideoLoader
{
public:
    cv::Mat loadImageFromCam(cv::Mat &frame);
    bool checkIfFrameIsEmpty(cv::Mat &frame);
    void OpenCam() { cam.open(0); }
private:
    cv::VideoCapture cam;
};


    cv::Mat VideoLoader::loadImageFromCam(cv::Mat &frame)
    {
        // cam.open(0); Don't use    
        cam >> frame;        
        return frame;   
    }


void Entity::init()
    {
        cv::Mat frame;
        ptrVideoLoaderObj->OpenCam(); // see this - call open only once
        while (true) {
            ptrVideoLoaderObj->loadImageFromCam(frame);

            if (ptrVideoLoaderObj->checkIfFrameIsEmpty(frame)) {
                std::cerr<<"ERROR: captured empty frame\n";
                break;
            }

            ptrDisplayObj->displayImage(frame);

            if (cv::waitKey(30) >= 0)
                break;
        }
    }

关于c++ - OpenCV - 来自相机的实时反馈不流畅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52558898/

相关文章:

c++ - 错误 : request for member 'insert' which is of non-class type int* ? ?怎么了?

c++ - opencv - imread 返回错误大小

c++ - 控制互联网连接

c++ - 如何在文件中保存/读取数据数组 (C++)

android - 使用opencv在Android中裁剪图像

opencv - 谷歌 Colab cv.ocl.haveOpenCL() False

python - openCV imshow 随机失败

c++ - 使用 OpenGL,如何在默认投影中正确使用 gluOrtho2D?

c++ - 为什么命名空间组合很少使用?

c++ - 乒乓 Racket 未按预期运行