我需要做两个图像之间的相似性匹配。为此,我使用了c++中OpenCV中的ORB关键点检测器和ORB描述符提取器
我的问题在匹配。我决定测试两种类型的匹配:FLANNBasedMatcher使用LSH和BFMatcher。根据文档和这两种算法,LSH应该比蛮力更快(第一种算法不会逐个比较所有描述符,而第二种算法会)。
当我尝试两者时,我得到BFMatcher比LSH更快(但快得多),我不知道为什么以及如何修复它。
一开始,我认为它需要更多的关键点来观察差异,我决定通过让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);
平均时间:
- Brute Force = 0.006 s/image
- LSH = 0.04 s/image
是已知的bug吗?尝试使用分层聚类-它比暴力破解快得多。
cv::flann::Index tree(Desriptors,cv::flann::HierarchicalClusteringIndexParams(),FLANN_DIST_HAMMING);
cv::Mat indices, dists;
tree.knnSearch(Desriptors2, indices, dists, 1, cv::flann::SearchParams());