gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:37 24 4
gpt4 key购买 nike

所以我试图将矩阵数据从 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_backtemp 深拷贝放入 vector 中,如下所示:

rawFaceData.push_back(temp.clone());

关于c++ vector将所有元素存储为最后一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22952447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com