LSH比BruteForce匹配慢

时间:2014-05-13 15:49:32

标签: c++ performance opencv image-processing

我需要在两个图像之间进行相似性匹配。为此,我在C ++中使用来自OpenCV的ORB关键点检测器和ORB描述符提取器

我的问题在于匹配。我决定使用LSH和 BFMatcher 测试两种类型的匹配: FLANNBasedMatcher 。根据文档和两种算法,LSH假设比蛮力更快(第一个不是逐个比较所有描述符而第二个比较)。

当我尝试两者时,我比BFH更快地获得BFMatcher(但速度更快),我不知道为什么以及如何解决它。

一开始我虽然需要更多关键点才能看到差异,但我决定通过让ORB检测多达70000个关键点来增加这一点:

OrbFeatureDetector detector(70000);

但这让它变得更慢。

我不知道我对LSH的假设是否比蛮力更快是错误的,或者我是否对我的代码做错了。

我的代码:

//Detector
    int numKeyPoints = 70000; 
    OrbFeatureDetector detector(numKeyPoints); 
    detector.detect( image, keypoints); 

// Extractor
    OrbDescriptorExtractor extractor;
    extractor.compute(image, keypoints, descriptors); 

// BFMatcher
    BFMatcher matcher(NORM_HAMMING); 
    matcher.radiusMatch(descriptors_1, descriptors_2, matches, 30);


// LSHMatcher
    FlannBasedMatcher matcher(new flann::LshIndexParams(6,12,2));
    matcher.knnMatch(descriptors_1, descriptors_2, matches, 1); 

平均时间:

  • 蛮力=每张图像0.006秒
  • 每张图像的LSH = 0.04秒

1 个答案:

答案 0 :(得分:2)

它是否已知错误。 尝试使用Hierarchical Clustering - 它比bruteforce快得多。

cv::flann::Index tree(Desriptors,cv::flann::HierarchicalClusteringIndexParams(),FLANN_DIST_HAMMIN‌​G); 
cv::Mat indices, dists; 
tree.knnSearch(Desriptors2, indices, dists, 1, cv::flann::SearchParams());