我试图理解以下代码取自: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
到 vector :
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));
}
}
最佳答案
未经测试:
从文档中您可以看到 bowDescriptor 似乎是一个大小为 1 x dictionarySize
的矩阵http://docs.opencv.org/modules/features2d/doc/object_categorization.html#bowimgdescriptorextractor-descriptorsize
因此您必须遍历该矩阵并将每个元素( float )保存到您的 vector<float>
试试这段代码:
std::vector<float> currentBowDescriptor;
for(int col = 0; col < bowDescriptor1.cols; ++col)
{
currentBowDescriptor.push_back(bowDescriptor.at<float>(0,col));
}
就是这样。如果需要,将那些 currentBowDescriptor 推回另一个 vector 。
如果您想节省一些计算时间,您甚至可以提前初始化 currentBowDescriptor,因为您知道描述符值的数量 (dictionarySize) 并访问这些元素而不是推回。
希望这对您有所帮助。
关于c++ - 理解opencv中的Mat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22963262/