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()
仅保留双向匹配的函数的结果.
正如你所看到的,它crossCheckMatching()
的输出比每个knnMatch(X,Y)/ knnMatch(Y,X)要好得多,因为只保留了最强的对应关系.
归档时间: |
|
查看次数: |
4355 次 |
最近记录: |