了解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<float>
,您将遍历整个矩阵(我认为每行1 个元素)并将每个元素push_back 到一个向量。如果您想将trainingData
解释为浮点向量的向量,您将为每一行创建一个浮点向量并将这些向量推回您的vector<vector<float>>
@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<float>
试试这个代码:
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的主要内容,如果未能解决你的问题,请参考以下文章