下面的代码段显示了训练对象识别中使用的描述符匹配器的基础。
detector = cv.FeatureDetector('ORB');
extractor = cv.DescriptorExtractor('ORB');
matcher = cv.DescriptorMatcher('BruteForce-Hamming')
for(i=1 to N)
{
detector(i) = detector.detect(image(i));
descriptor(i) = extractor.compute(image(i),detector(i));
matcher.add(descriptor(i));
}
matcher.train();
该代码在语法上不正确,但是我想知道
train()
的matcher
函数在这里如何工作。 最佳答案
matcher.train();因为Bruteforce匹配器的实现是无效的,没有索引或未构建KD树,所以匹配根据识别为描述符的两个关键点之间的汉明距离进行。如果您使用基于FLANN的匹配器,则方法matcher.train();构建索引,这些索引用于匹配关键点。如果要为应用程序使用基于FLANN的匹配器,则以下是将基于FLANN的匹配与二进制描述符(ORB,FREAK,BRISK)一起使用的语法。
// paramerters for LSH index
//LshIndexParams(int table_number, int key_size, int multi_probe_level);
FlannBasedMatcher matcher(new flann::LshIndexParams(20,10,2));
如果您的训练集中的描述符数量少于(即小于100000),则建议使用bruteforce匹配器,因为如果您使用基于FLANN的匹配,则大多数时间将浪费在构建和检索索引上,因此应用程序性能将下降坠落
关于opencv - OpenCV中的描述符匹配器训练器中使用的算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21371213/