C++ c++;vector将所有元素存储为最后一个元素
所以我试图将矩阵数据从xml文件存储到rawFaceData向量。当我在第一个for循环中检查cout语句时,它会返回我想要的向量中所有元素的值。但是,当它跳出第一个for循环并转到第二个for循环时,cout始终为我提供与最后一个元素完全相同的所有元素(例如,如果向量大小为4,则cout为我提供最后一个元素的值4次!),之前的元素的值就消失了。谁能告诉我为什么???谢谢大家!C++ c++;vector将所有元素存储为最后一个元素,c++,opencv,vector,C++,Opencv,Vector,所以我试图将矩阵数据从xml文件存储到rawFaceData向量。当我在第一个for循环中检查cout语句时,它会返回我想要的向量中所有元素的值。但是,当它跳出第一个for循环并转到第二个for循环时,cout始终为我提供与最后一个元素完全相同的所有元素(例如,如果向量大小为4,则cout为我提供最后一个元素的值4次!),之前的元素的值就消失了。谁能告诉我为什么???谢谢大家! vector<Mat> rawFaceData; Mat temp; FileStorage fsRead
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;
}
矢量数据;
垫温;
FileStorage fsRead=FileStorage();
//将xml数据输出到Mat向量以进行计算
对于(int readCount=1;readCount Mat是指针吗?如果是这种情况,并且您要推送到向量中的是指针类型,那么在您退出第一个for循环后,向量中的所有值都将指向同一地址,从而导致您看到的行为。OpenCVMat
类使用共享指针和引用计数机制来存储数据并避免u无需深度拷贝
每次您将数据从文件存储
读取到临时
中时,数据都会在同一内存位置更新,对临时
数据的所有引用现在都指向新数据。即,旧数据被覆盖
将Mat推入向量时,数据不会复制到向量的元素中。相反,只向向量添加一个引用,并且temp
的引用计数器会递增。因此,实际上,向量的所有元素都包含相同的数据
您可能需要将的temp
的一个深拷贝压回向量,如下所示:
rawFaceData.push_back(temp.clone());
文件读取是混乱的,你可以忽略它们。我认为在你的第一个for循环中,计数器没有正确地更新,这是导致同一个元素每次都在vector中被推回。显示了“代码> Mat < /Case>类的定义和实现。听起来好像它没有正确的语义语义。我是C++的新手,所以我我想知道,如果我没有将temp声明为指针,为什么temp是一个指针?因为我使用了Mat temp;而不是Mat*temp;@user3513507,它不是Mat
指针。但是Mat
是一个奇怪的类。一个解决方案可能是在循环内部创建Mat
。@juanchopanza..Mat
类使用sh在内部存储数据ared指针并使用引用计数。它的复制构造函数和赋值运算符不执行深度复制。它有一个clone
成员函数来执行深度复制。@sgar91是的,我知道。我认为这是一个糟糕的设计。无论如何,我可能只是在循环中声明Mat
。
rawFaceData.push_back(temp.clone());