我想将一组二进制描述符(查询数据)与一组更大的二进制描述符(训练数据)进行匹配。
匹配应该很快完成。我决定试试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 相比非常慢。
看起来其他一些人也遇到了同样的问题(参见1、2)。在其中一个答案中,建议尝试分层聚类。那应该比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_HAMMING);
cv::Mat indices, dists;
tree.knnSearch(query, indices, dists, 2, cv::flann::SearchParams());
我的问题是:
- 是否可以为 FlannBasedMatcher 设置距离类型以使用二进制描述符和层次聚类?
flann::HierarchicalClusteringIndexParams()
或者我可以用汉明距离定义一个自定义吗?我想使用 FlannBasedMatcher 接口。 - 是否有另一种更快的方法来匹配二进制描述符?比使用带有 LSH 或层次聚类的 FLANN 更好/更快?