下面的代码片段显示了训练对象识别中使用的描述符匹配器的基础知识。
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()
的{{1}}函数如何在这里工作。
答案 0 :(得分:0)
matcher.train();对于Bruteforce匹配器具有void实现,没有构建索引或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),建议使用强力匹配器,因为如果您使用基于FLANN的匹配,那么大部分时间将在构建和检索索引时丢失,因此您的应用程序性能将下降