【问题标题】:OpenCV - Live feed from camera is not smoothOpenCV - 来自相机的实时馈送不流畅
【发布时间】:2018-09-28 15:55:25
【问题描述】:

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

这是我的一些代码:

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

我的显示很流畅。

我应该在我的代码中进行哪些更改才能获得流畅的提要?

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-01
      • 2021-01-19
      • 1970-01-01
      • 2014-06-19
      • 2011-03-31
      • 2020-05-01
      • 1970-01-01
      • 2019-08-01
      相关资源
      最近更新 更多