为什么我们需要crossCheckMatching功能?

dyn*_*mic 3 c++ opencv surf sift

我正在阅读很多使用特征提取(sift ecc)进行物体检测的帖子.

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

Coudl我理解为什么选择这个?

为什么我们需要评估两者

descriptorMatcher->knnMatch( descriptors1, descriptors2, matches12, knn );
descriptorMatcher->knnMatch( descriptors2, descriptors1, matches21, knn );
Run Code Online (Sandbox Code Playgroud)

我不明白.

例如,计算Euclian距离在两个方向上都不会返回相同的结果

Fré*_*oni 23

您通常不能假设您的匹配器将使用Eucludian距离.例如,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()仅保留双向匹配的函数的结果.

图1

正如你所看到的,它crossCheckMatching()的输出比每个knnMatch(X,Y)/ knnMatch(Y,X)要好得多,因为只保留了最强的对应关系.