3

我想将一组二进制描述符(查询数据)与一组更大的二进制描述符(训练数据)进行匹配。

匹配应该很快完成。我决定试试OpenCv的 FlannBasedMatcher。匹配器支持多种算法。对于二进制描述符,实现了 Multi-Probe LSH。

FlannBasedMatcher matcher (new flann::LshIndexParams(12,10,2));
std::vector<DMatch> matches;
matcher.knnMatch(query, train, matches, 2);

(我尝试了不同的 LshIndexParams 设置)

问题是 Flann 与 LSH 匹配与 BruteForce 匹配相比非常慢,或者与使用浮点描述符与 KDTreeIndexParams 匹配的 Flann 相比非常慢。

看起来其他一些人也遇到了同样的问题(参见12)。在其中一个答案中,建议尝试分层聚类。那应该比LSH快。

我想使用与 LSH 相同的 FlannBasedMatcher 接口。

FlannBasedMatcher matcher (new flann::HierarchicalClusteringIndexParams());
std::vector<DMatch> matches;
matcher.knnMatch(query, train, matches, 2);

但是,这不适用于二进制描述符(请参阅错误消息):

OpenCV Error: Unsupported format or combination of formats 

但是“原始”层次聚类接口支持多种距离类型,并且可以选择汉明距离。

cv::flann::Index tree(train, cv::flann::HierarchicalClusteringIndexParams(), FLANN_DIST_HAMMIN‌​G); 
cv::Mat indices, dists; 
tree.knnSearch(query, indices, dists, 2, cv::flann::SearchParams());

我的问题是:

  • 是否可以为 FlannBasedMatcher 设置距离类型以使用二进制描述符和层次聚类?flann::HierarchicalClusteringIndexParams()或者我可以用汉明距离定义一个自定义吗?我想使用 FlannBasedMatcher 接口。
  • 是否有另一种更快的方法来匹配二进制描述符?比使用带有 LSH 或层次聚类的 FLANN 更好/更快?
4

0 回答 0