我正在使用基于Flann的匹配器来搜索图像。这是我在C ++中定义匹配器的方式
cv::FlannBasedMatcher matcher(cv::makePtr<cv::flann::LshIndexParams>(50, 10, 2));
然后我使用添加功能添加大约60张图像。我已经使用ORB为每个图像提取了大约200个特征。我正在使用32位二进制描述符(ORB的默认值)。
matcher.add(databaseDescriptors);
一旦我添加了每个图像,我就会训练匹配器。
matcher.train();
这时我开始搜索描述符匹配项。
matcher.knnMatch(queryDescriptors, matches, 2);
我在queryDescriptors矩阵中有400个传入的描述符。然后,我使用Lowe的比率来计算距离:
if (matches[i].size() >= 2 && matches[i][0].distance < 0.7f * matches[i][1].distance) {
validMatches.push_back(matches[i][1]);
}
这会产生意外的结果。我发现无论输入描述符是什么,我总是从imgIdx
对象中获得相同的cv::DMatch
值。为什么会这样呢?不管输入什么,为什么flann总是返回相同的imgIdx
。
使用LSH的flann是否无法搜索(60 * 200)= 12,000个描述符?我训练匹配器的方式有问题吗?