基本上我有:
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
}
}
答案 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 集中为每个描述符的查询集返回两个最接近的描述符。接下来,当两个找到的描述符彼此接近时,您将过滤掉案例。