我正在尝试理解以下代码Take from: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));
}
}
未经测试:
从文档中可以看到bowDescriptor似乎是一个大小为1 x dictionarySize
的矩阵http://docs.opencv.org/modules/features2d/doc/object_categorization.html#bowimgdescriptorextractor-描述符大小
所以你必须遍历这个矩阵,并将每个元素(浮点)保存到你的vector<float>
中
试试这个代码:
std::vector<float> currentBowDescriptor;
for(int col = 0; col < bowDescriptor1.cols; ++col)
{
currentBowDescriptor.push_back(bowDescriptor.at<float>(0,col));
}
就是这样。如果你愿意的话,把当前的BowDescriptor推到另一个向量上。
如果你想节省一些计算时间,你甚至可以提前初始化currentBowDescriptor,因为你知道描述符值的数量(dictionarySize),并访问这些元素,而不是向后推。
希望这能有所帮助。