C++(和 openCV):在向量<Mat>中积累许多垫子

C++ (and openCV): Accumulating a number of Mat in vector<Mat>

本文关键字:gt Mat 许多垫 lt openCV C++ 向量      更新时间:2023-10-16

我正在从网络摄像头上获取帧,并将其显示在窗口上。为了进行时间分析,我在抓取帧时将其保持在向量上。为了测试它,当我的向量大小达到100时,我尝试将迄今为止存储的所有帧可视化。

奇怪的是,向量内部确实有100帧,但它们都是相同的,并且对应于捕捉到的最后一帧。

代码:

Mat frame;       
    _cap.start(0);  //VideoCapture object   
    vector<Mat> seq;
    while(1)
    {
        _cap.getFrame(frame);           
        seq.push_back(frame);
        imshow("a", seq[0]);
        if (seq.size() == 100)
        {
            for (int n = 0; n < seq.size(); n++)
            {
                cout << "I'm in" << endl;
                imshow("b", seq[n]);
                waitKey(0);
            }
        }
            waitKey(30);   
    }

从VideoCapture获得的Mat都指向同一个驱动程序内存。

Mat a=b;浅层复制(相同像素指针)

所以你需要:

 seq.push_back(frame.clone());

此处(即深度复制)

帧仍将指向相同的数据字段。因此,每当您获取新图像时,所有先前捕获的图像也将更新。

解决方案是在将帧放入向量后,通过调用frame.release() 来释放帧