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

标签 c++ opencv vector

所以我试图将矩阵数据从 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/

相关文章:

java - 将 submat 从 RGB 转换为 GRAY OpenCV

c++ - 3个 vector 的高效排序算法

c++ - 如何将 char 分配给 const char*

c++ - 扫描和检测图像中的物体颜色

opencv - 网格搜索(libsvm)中的交叉验证非常慢

visual-c++ - OpenCV imwrite 2.2 在 Windows 7 上导致异常,消息为 "OpenCV Error: Unspecified error (could not find a writer for the specified extension)"

c++ - 如何使用互斥体保护 vector ?

c++ - 将 C++ 字符串存储到 char* vector 中

c++ - 从 CImage AtlImage 获取缓冲区数组

c++ - Boost.Python 1.54(调试版本)对 Windows 上 Python27.lib 的令人费解的依赖性