在两个图像上计算描述符之后,为了获得良好的匹配,他们使用了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)要好得多,因为只保留了最强的对应关系.
总结以上是内存溢出为你收集整理的c – 为什么我们需要crossCheckMatching功能?全部内容,希望文章能够帮你解决c – 为什么我们需要crossCheckMatching功能?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)