所以我试图将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;
}
OpenCV Mat
类使用共享指针和引用计数机制来存储数据并避免不需要的深度复制。
每次将数据从FileStorage
读取到temp
时,数据都会在同一内存位置更新,并且对temp
数据的所有引用现在都指向新数据。即旧数据被重写。
将Mat推入向量时,数据不会复制到向量的元素中。相反,只有一个引用被添加到矢量,并且temp
的引用计数器被递增。实际上,向量的所有元素都包含相同的数据。
您可能想将push_back
的temp
深度复制到向量中,如下所示:
rawFaceData.push_back(temp.clone());
Mat temp;
马特是个指针吗?如果是这种情况,并且您正在向向量中推送的是指针类型,那么在退出第一个for循环后,向量中的所有值都将指向同一地址,从而导致您看到的行为。