我读很多岗位的使用特征提取(过筛ECC)目标检测。
其计算描述符的两幅图像,让他们使用crossCheckMatching精彩的比赛之后。 (上发现的样品/ CPP / descritpor_extractor_matcher.cpp )
我Coudl明白为什么这样选择?
为什么我们需要evalute两
descriptorMatcher->knnMatch( descriptors1, descriptors2, matches12, knn );
descriptorMatcher->knnMatch( descriptors2, descriptors1, matches21, knn );
我不明白。
计算例如Euclian距离不返回在两个方向相同的结果 ?
你一般不能假设Eucludian距离将通过您的匹配使用。 例如,BFMatcher支持不同的规范:L1,L2,海明...
你可以在这里查看文档了解更多信息: http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html
总之,所有这些距离的措施是对称的,这不要紧,你用它来回答你的问题是哪一个。
答案是:调用knnMatch(A,B)
是不一样的调用knnMatch(B,A)
如果你不相信我,我会尽力给你一个图形化和直观的解释。 我承担简单起见,该knn==1
,所以,对于每个查询的描述,该算法只能找到一一对应(绘制:-)容易得多
我随机挑选几个2D样本和创建了两个数据集(红色和绿色)。 在第一个情节,果岭在查询数据集,这意味着,每个绿色点,我们试图找到最接近的红点(每个箭头代表的对应)。
在第二个情节,查询和训练数据集已被交换。
最后,我还绘制的结果crossCheckMatching()
函数只节省了双向匹配。
正如你所看到的, crossCheckMatching()
的输出小于各单knnMatch(X,Y)要好得多/ knnMatch(Y,X),因为只有最强的通信一直保持。
我还没有处理你使用的确切模块,但是从文档:
http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html
看来,第二个呼叫交换与查询的训练,因此可以给你一个不同的结果集。 这也由matches12变为matches21的命名暗示 - 这不是双向关联,但一个方向联想。
您在机器学习培训的大型数据集看,你在这里训练结果的数据的一个子集,提供了比对数据的不同子集训练有更好的表现。 我不知道这两个比赛是怎么你写的步骤之后使用,但我想它允许最好的训练无论采用哪种方式,或用于捕获从数据更好的协方差信息。
欧几里德距离是在两个方向上是相同的,但双向量的排序变化和关联的,因此结构的两个电话之间的变化(除非descriptors1 == descriptors2,这将形成一个对称矩阵,然后可能是无用的重复)。
在后面的代码库发布matches12和matches21的用途很可能还澄清兼具方向协会的确切原因。
但愿这给了一个首发位置的理解重复呼叫。
* 编辑 *
我看着你提供的链接并在回答你的问题的源代码,远处是两分,但在特定点(A点)到另一特定点(B点)的最近点之间的相同不一定一个倒置,能够语句。 因此B可以是最近点A,但也可以不将最近点B.
正如弗雷德里克的帖子图形化显示,这并不是说2点之间的欧几里得距离的变化,而是与最近的欧氏距离的点可以改变比较的角度来看,当发生改变。 因此交叉检查可以验证共享最近点的关系(A是最接近于B和B是最接近A)点。
你的直觉,这是不是最好的方法(有大量的点)是正确的,虽然,作为一个更复杂的方法可以找到o所有这些关系(N * LN(N))的时间,而不是O(N ^ 2)时间 - 尤其是启发式搜索驱动。 但是,对于一个(相对)少量的点的预期性能收益将是微不足道的,实现起来(多为良好的改善)更加复杂。