c ++ vector将所有元素存储为最后一个元素

时间:2014-04-09 03:52:08

标签: c++ opencv vector

所以我试图将xml文件中的矩阵数据存储到rawFaceData向量中。当我在第一个for循环中检查cout语句时,它返回我想要的向量中的所有元素。但当它跳出第一个for循环并进入第二个for循环时,cout总是给我所有元素与最后一个元素完全相同(例如,如果向量大小为4,那么cout给我最后一个元素的值是4倍!),之前的值已经消失了。谁能告诉我为什么???谢谢!

vector<Mat> rawFaceData;
Mat temp;
FileStorage fsRead = FileStorage();
//output xml datas to a Mat vector for calculation
for(int readCount = 1; readCount < count; readCount++){
    ssfilename.str("");
    ssfilename<<name<<readCount<<postfix;
    filename = ssfilename.str();
    cout<<filename<<endl;
    fsRead.open(filename, FileStorage::READ);
    fsRead["ImageData"]>>temp;
    rawFaceData.push_back(temp);
    cout<<rawFaceData[readCount-1]<<endl;
}
//now raw image datas are now all in the Mat vector, there are count-1 elements in this vector.
//following is avg calculation of the training images.
for(int i = 0; i < rawFaceData.size(); i++){
    cout<<rawFaceData[i]<<"\n"<<endl;
}

2 个答案:

答案 0 :(得分:4)

OpenCV Mat类使用共享指针和引用计数机制来存储数据并避免不需要的深层复制。

每当您将FileStorage中的数据读入temp时,数据都会在同一内存位置更新,而temp数据的所有引用现在都指向新数据。即旧数据被覆盖。

将Mat推入向量时,数据不会复制到向量的元素中。相反,只有一个引用被添加到向量,并且temp的引用计数器递增。实际上,向量的所有元素都包含相同的数据。

您可能需要push_back temp这样的向量的深层副本:

rawFaceData.push_back(temp.clone());

答案 1 :(得分:2)

 Mat temp;

是Mat指针吗?如果是这种情况,并且你在向量中推送的是一个指针类型,那么在退出第一个for循环之后,vector中的所有值都将指向同一个地址,从而显示你所看到的行为。