我正在阅读很多使用特征提取(sift ecc)进行对象检测的文章。
在计算两个图像上的描述符后,为了获得良好的匹配,他们使用了 crossCheckMatching。 (发现于样本/cpp/descritpor_extractor_matcher.cpp https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/cpp/descriptor_extractor_matcher.cpp?rev=3943)
我能理解为什么这样选择吗?
为什么我们需要评估两者
descriptorMatcher->knnMatch( descriptors1, descriptors2, matches12, knn );
descriptorMatcher->knnMatch( descriptors2, descriptors1, matches21, knn );
我不明白。
例如,计算欧几里距离不会返回相同的结果双向?
您通常不能假设您的匹配器将使用欧几里得距离。例如,BFMatcher 支持不同的规范:L1、L2、Hamming...
您可以在此处查看文档以了解更多详细信息:http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html
无论如何,所有这些距离测量都是对称的,使用哪一个来回答问题并不重要。
答案是:打电话knnMatch(A,B)
与调用不一样knnMatch(B,A)
.
如果您不相信我,我会尽力为您提供图形化且直观的解释。为了简单起见,我假设knn==1
,这样对于每个查询的描述符,算法只会找到 1 个对应关系(更容易绘制:-)
我随机挑选了一些二维样本并创建了两个数据集(红色和绿色)。在第一个图中,绿色位于查询数据集中,这意味着对于每个绿色点,我们尝试找到最接近的红色点(每个箭头代表一个对应关系)。
在第二张图中,查询数据集和训练数据集已交换。
最后,我还绘制了结果crossCheckMatching()
仅保留双向匹配的函数。
正如你所看到的,crossCheckMatching()
的输出比每个单独的 knnMatch(X,Y) / knnMatch(Y,X) 好得多,因为只保留了最强的对应关系。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)