我正在阅读许多有关使用特征提取(sift ecc)进行对象检测的文章。

在两个图像上都计算了描述符后,为了获得良好的匹配,他们正在使用crossCheckMatching。 (位于sample/cpp/descritpor_extractor_matcher.cpp上)

我知道科德为什么会这样选择?

为什么我们都需要评估

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

无论如何,所有这些距离量度都是对称的,使用哪一个来回答问题都没有关系。

答案是:调用knnMatch(A,B)与调用knnMatch(B,A)不同。

如果您不信任我,我将尝试为您提供图形直观的解释。为了简单起见,我假设使用knn==1,以便对于每个查询的描述符,该算法将仅找到1个对应关系(更容易绘制:-)

我随机选择了几个2D样本,并创建了两个数据集(红色和绿色)。在第一个图中,绿色位于查询数据集中,这意味着对于每个绿色点,我们尝试找到最接近的红色点(每个箭头代表一个对应关系)。

在第二个图中,查询和训练数据集已交换。

最后,我还绘制了crossCheckMatching()函数的结果,该函数仅保留双向匹配。

如您所见,crossCheckMatching()的输出比每个单个knnMatch(X,Y)/knnMatch(Y,X)都要好得多,因为只保留了最强的对应关系。

07-27 13:39