簡體   English   中英

OpenCV-來自攝像機的實時饋送不流暢

[英]OpenCV - Live feed from camera is not smooth

我正在嘗試從網絡攝像頭捕獲實時Feed,但是當我顯示要捕獲的幀時,該Feed並不流暢。 顯示幀之間有短暫的休息。

這是我的一些代碼:

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;
    }
}

我得到了流暢的顯示。

為了獲得順暢的Feed,我應該在代碼中進行哪些更改?

不要調用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;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM