我如何使用包含 vector<Mat> 的结构向量

Posted

技术标签:

【中文标题】我如何使用包含 vector<Mat> 的结构向量【英文标题】:How can i use a Vector of Struct containing vector<Mat> 【发布时间】:2014-03-04 18:30:10 【问题描述】:

我试图声明一个结构,

struct Sample 
    int classLabel[2];
    vector<Mat> image; 
;

现在我想用它,我把它初始化为

Sample sample1;

并在sample1 中保存了 5 张图片,并创建了另一个 Sample sample2 并保存了另外 5 张图片。 现在我想将这两个样本保存在Sample 的向量中。我声明:

vector<Sample> samples;

现在当我尝试 push_back sample1 和 sample2 时

samples.push_back(sample1);
samples.push_back(sample2);

它什么也没给我。样本显示为samples[2],但不包含classLabel=???image=???? 前面的问号

任何人都可以指导我在哪里做错了。我怎样才能使它可用。我的意思是在samples 中正确保存sample1sample2 结构。 会很感激。 问候

【问题讨论】:

【参考方案1】:
vector<Sample> samples;
samples.push_back(sample1);
samples.push_back(sample2);

在这之后,samples 的大小是 2。所以你只能访问 samples[0]samples[1],而不是 samples[2]


正如@sammy 所评论的,Watch 中的变量可能在 VS 中显示不正确的值。

要使其正常工作,您可能需要执行以下步骤:

    检查应用程序及其依赖项(如果需要)是否在 debug 模式下构建。 确保禁用优化。编译时使用 /Od 选项。 结构成员对齐。当有一堆项目一起编译时,项目内部该字段的值不同可能会导致显示值无效。在所有项目上重置为 默认 值。该值位于 Configuration Properties-> C/C++ ->Code Generation -> Struct Member Alignment 下。

查看here 了解更多信息。


编辑:对于您在评论中的代码:

sample1.classlabel[0] = 0; 
sample1.classlabel[1]=1;
vector<Mat> temp; 
temp.push_back(img1); 
temp.push_back(img2); 
temp.push_back(img3); 
sample1.image=temp; 

sample2.classlabel[0] = 0; 
sample2.classlabel[1]=1; 
vector<Mat> temp1; 
temp.push_back(img5);         // problem
temp.push_back(img6);         // problem
temp.push_back(img7);         // problem
sample2.image=temp1; 

samples.push_back(sample1); 
samples.push_back(sample2);

3 个问题行应改为

temp1.push_back(img5);
temp1.push_back(img6);
temp1.push_back(img7); 

【讨论】:

你没看懂,也可能是我解释有误,尺寸显示为样本[2]。但是,如果您访问 samples[0] 或 samples[1] 它会显示 classlabel=???和图像=????。 @khan 处于调试模式还是发布模式?您可能需要在此处分享您的完整代码。 在调试中,sample1.classlabel[0] = 0; sample1.classlabel[1]=1;矢量温度; temp.push_back(img1); temp.push_back(img2); temp.push_back(img3);样品1.图像=温度; sample2.classlabel[0] = 0; sample2.classlabel[1]=1;矢量 temp1; temp.push_back(img5);temp.push_back(img6);temp.push_back(img7); sample2.image=temp1; samples.push_back(sample1); samples.push_back(sample2); @khan sample 是什么?请分享您的完整代码,以便我们重现问题。 @khan 它可能工作正常 - 有时调试器无法显示复杂的对象。但它们的值是正确的。那 ????仅表示它无法在调试器中显示,但没有别的

以上是关于我如何使用包含 vector<Mat> 的结构向量的主要内容,如果未能解决你的问题,请参考以下文章

c ++如何将视频序列放入OpenCV中的vector<Mat>?

opencv c++ mat to vector<keypoint>

将 Mat 转换为 <vector<vector>> C++

OpenCV:vector<vector<Point>> 到 vector<Mat> 的转换,引用调用的问题

将 vector<Tensor> 输出转换为 vector<Mat> 输出

如何将 Mat 转换为 dlib 的矩阵