首页 > 解决方案 > 一个错误?一个人口众多的向量退出循环时,while 语句内的内容意外更改

问题描述

问题如下:

一方面,我用视频的所有帧填充向量。我检查帧是否真的包含视频的帧,顺序正确:是。

另一方面,当我退出 while 语句并使用 for 循环读取其内容时,它的行为就好像每一帧都等于视频的最后一帧(重复图像的向量)。

我解决了这个问题,发现了这些事实:

我试过用vector.push_back做,但结果是一样的。

void GetFramesFromVideo(String filepath, vector<Mat>& frames)
{
    Mat frame_temp;
    VideoCapture cap = VideoCapture(filepath);
    int videosize = cap.get(7);
    frames = vector<Mat>(videosize);
    bool success = cap.read(frame_temp);
    frames[0]=frame_temp;
    namedWindow("he");
    int i = 1;
    while (success)
    {
        success = cap.read(frame_temp);
        if (success)
        {
            frames[i] = frame_temp;
            i++;
        }
        imshow("he", frames[i-1]);
        waitKey(10);
        cout << "Read a new frame: " << success;
    }
    for (int i = 0; i < frames.size(); i++)
    {
        imshow("he", frames[i]);
        waitKey(10);
    }
}

标签: c++opencvvector

解决方案


cv::Mat是一种具有引用语义而不是值语义的类型。换句话说,您可以将其视为指向矩阵的智能指针。

文档operator=(const Mat&)说:

矩阵赋值是一个 O(1) 操作。这意味着不会复制任何数据,但会共享数据,并且引用计数器(如果有)会递增。

所以你的问题很简单:你总是写到frame_temp,这是你拥有的唯一实际数据,然后你在你的vector<Mat>. Mat您每次都需要创建一个新的。


推荐阅读