所以我试图将矩阵数据从 xml 文件存储到 rawFaceData vector 。当我检查第一个 for 循环中的 cout 语句时,它返回我想要的 vector 中所有元素的内容。但是当它跳出第一个 for 循环并进入第二个 for 循环时,cout 始终给我所有与最后一个元素完全相同的元素(例如,如果 vector 大小为 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;
}
最佳答案
OpenCV Mat
类使用共享指针和引用计数机制来存储数据并避免不需要的深拷贝。
每次您将数据从 FileStorage
读取到 temp
时,数据都会在同一内存位置更新,所有对 temp
数据的引用都会更新code> 现在指向新数据。即旧数据被覆盖。
当您将 Mat 插入 vector 时,数据不会复制到 vector 的元素中。相反,只有一个引用被添加到 vector ,并且 temp
的引用计数器被递增。所以实际上, vector 的所有元素都包含相同的数据。
您可能希望将 push_back
的 temp
深拷贝放入 vector 中,如下所示:
rawFaceData.push_back(temp.clone());
关于c++ vector将所有元素存储为最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22952447/