做knnMatch后的.distance是什么?

时间:2012-06-24 09:43:47

标签: c++ opencv sift surf keypoint

基本上我有:

BruteForceMatcher<L2<float>>().knnMatch(descriptor1,descriptor2,matches,2);

为了获得好的匹配,我解析所有“匹配”向量并检查距离,如下所示:

if( (matches[i][0].distance / matches[i][1].distance) < ratio ){
  //> Good match!
}

matches[i][0].distance是什么意思? matches[i][0]和?

之间的距离

我的假设

对于我能猜到的情况,我首先计算第一场比赛与NN之间的欧洲距离,并用阈值过滤它,这听起来更合乎逻辑,如:

//> I calculate the distance between 2 nearest neighborhood and filter it based on thresold
foreach( matches : i) {
 if ( euclianDistance( matches[i][0] , matches[i][1] ) < threshold ) {
   //> good match
 }
}

1 个答案:

答案 0 :(得分:3)

descriptor - 是一个N维空间点。

匹配 - 是一对描述符 - 一个来自第一个集合,一个来自第二个集合(也称为 train 查询集合)。

距离 - 是L2结构指向的2个描述符的match指标。 (您将指标类型指定为BruteForceMatcher)的模板参数。

match[i][0].distance = L2(descriptor1.row(match[i][0].trainIdx),
                          descriptor2.row(match[i][0].queryIdx))

因此,knnMatch train 集中为每个描述符的查询集返回两个最接近的描述符。接下来,当两个找到的描述符彼此接近时,您将过滤掉案例。