在SURF中使用欧几里德距离

时间:2013-11-06 12:31:51

标签: c++ opencv knn

在我的代码中,我根据最近的邻域距离比率过滤好图像,如下所示:

for(int i = 0; i < min(des_image.rows-1,(int) matches.size()); i++) 
{
        if((matches[i][0].distance < 0.6*(matches[i][1].distance)) && 
                                  ((int)matches[i].size()<=2 && (int)matches[i].size()>0))
        {
            good_matches.push_back(matches[i][0]);
        }
 }

由于我是根据最近邻距离比率过滤好的图像,我还需要进行欧几里德距离计算吗?

我想知道当我在knnMatch中使用FlannBasedMatcher方法时,在方法内部是否使用欧几里德距离来匹配关键点?

1 个答案:

答案 0 :(得分:1)

是的,你需要。最近的邻居距离比意味着您: 1)计算从一个图像中的描述符到第二图像中的第一和第二最近邻居的距离。 d1 = d(desc1_img1,descA_img2); d2 = d(desc1_img1,descB_img2)。 2)计算距离比R = d1 / d2。如果R&lt; 0.6,那么匹配可能是好的。这样做是因为你总是会在第二张图片中得到“最近”的描述符,无论它有多糟糕 - 你用它来检查它。

所以,如果你没有距离,你会计算出什么比例?

距离类型取决于在normType参数中构造KNN-matcher时传递的值。

 BFMatcher::BFMatcher(int normType=NORM_L2, bool crossCheck=false )  
  • NORM_L2表示Eucledian d(p1,p2)= sqrt((x1 - x2)^ 2 +(y1 - y2)^ 2 + ...);
  • NORM_Ll表示曼哈顿d(p1,p2)= abs(x1 - x2)+ abs(y1 - y2)+ ..;
  • NORM_HAMMING表示Hamming