c – 为什么我们需要crossCheckMatching功能?
我正在阅读很多使用特征提取(sift ecc)进行物体检测的帖子.
在两个图像上计算描述符之后,为了获得良好的匹配,他们使用了crossCheckMatching. (发现于sample/cpp/descritpor_extractor_matcher.cpp) Coudl我理解为什么选择这个? 为什么我们需要评估两者 descriptorMatcher->knnMatch( descriptors1,descriptors2,matches12,knn ); descriptorMatcher->knnMatch( descriptors2,descriptors1,matches21,knn ); 我不明白. 例如,计算Euclian距离在两个方向上都不会返回相同的结果? 解决方法
您通常不能假设您的匹配器将使用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()函数的结果,它只保留了双向匹配. 正如您所看到的,crossCheckMatching()的输出比每个knnMatch(X,Y)/ knnMatch(Y,X)要好得多,因为只保留了最强的对应关系. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |