了解opencv中的Mat

Posted

技术标签:

【中文标题】了解opencv中的Mat【英文标题】:Understand Mat in opencv 【发布时间】:2014-04-09 12:56:31 【问题描述】:

我正在尝试理解以下代码摘自:Opencv Mat 更准确地说是这部分:

Mat labels(0, 1, CV_32FC1);
Mat trainingData(0, dictionarySize, CV_32FC1);

据我了解,labels 等价于std::vector<float>trainingData 等价于std::vector<std::vector<float>>,其中std::vector<float> 的维度为dictionarySize。对吗?

我问这个问题是因为我想将bowDescriptor1(即MAT)转换为std::vector<float>


bowDescriptor1转换为向量:

   std::vector<float> data;
   for(size_t r = 0; r < bowDescriptor.rows;r++)
    
       for(size_t c = 0; c < bowDescriptor.cols;c++)
       
          data.push_back(bowDescriptor.at<float>(r,c));
        
     

【问题讨论】:

labels 最初是一个 0 行 1 列的“矩阵”。之后,调用push_back 以添加float 类型的附加元素,这意味着将具有单个元素的另一行添加到labels。所以最后你会得到一个大小为n x 1 的矩阵,其中 n 是推送的浮点数。对于trainingData,push_back 获取的不是单个浮点数作为输入,而是新矩阵,这意味着将这些矩阵添加为新行。所以最后你将把 trainigData 变成一个大小为m x dictionarySize 的矩阵,其中 m 是添加矩阵的数量。 如果您想将labels 解释为std::vector&lt;float&gt;,您将遍历整个矩阵(我认为每行1 个元素)并将每个元素push_back 到一个向量。如果您想将trainingData 解释为浮点向量的向量,您将为每一行创建一个浮点向量并将这些向量推回您的vector&lt;vector&lt;float&gt;&gt; @Micka 所以在代码中他将 Mat dictionarySize 转换为稍后添加到 trainingData 的行 是的,我想是的(没有重新检查所有 tbh),也可以看看 docs.opencv.org/modules/core/doc/… 据此:docs.opencv.org/modules/features2d/doc/… bowDescriptor 是一个矩阵,其元素与词汇集的大小一样多。我猜它们都在一行中,所以你可以像数组一样读取它们并将它们放入你的向量中。但这更多的是猜测而不是知识;) 【参考方案1】:

未经测试:

从文档中你可以看到 bowDescriptor 似乎是一个大小为 1 x dictionarySize http://docs.opencv.org/modules/features2d/doc/object_categorization.html#bowimgdescriptorextractor-descriptorsize 的矩阵

因此您必须遍历该矩阵并将每个元素(浮点数)保存到您的vector&lt;float&gt;

试试这个代码:

std::vector<float> currentBowDescriptor;
for(int col = 0; col < bowDescriptor1.cols; ++col)

    currentBowDescriptor.push_back(bowDescriptor.at<float>(0,col));

就是这样。如果需要,可以将那些 currentBowDescriptor 推回另一个向量。

如果您想节省一些计算时间,您甚至可以提前初始化 currentBowDescriptor,因为您知道描述符值 (dictionarySize) 的数量并访问这些元素而不是推回。

希望这会有所帮助。

【讨论】:

以上是关于了解opencv中的Mat的主要内容,如果未能解决你的问题,请参考以下文章

Mat OpenCV 中的断言失败

无法更改图像 Mat opencv 中的所有像素

如何将使用 Qt Paint Application 绘制的图像传输到 Mat openCV

计算 Mat OpenCV 子集的总和

如何在 OpenCV 2 中从图像中获取通道数?

如何在 C++ 中将 OpenCV 2D 矩阵转换为 1D 数组?