我需要在两个图像之间进行相似性匹配。为此,我在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 :(得分:2)
它是否已知错误。 尝试使用Hierarchical Clustering - 它比bruteforce快得多。
cv::flann::Index tree(Desriptors,cv::flann::HierarchicalClusteringIndexParams(),FLANN_DIST_HAMMING);
cv::Mat indices, dists;
tree.knnSearch(Desriptors2, indices, dists, 1, cv::flann::SearchParams());