1

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

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,在方法内部他们是否使用欧几里得距离来匹配关键点?

4

1 回答 1

1

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

因此,如果您没有距离,您将从什么计算比率?

距离类型取决于您在 normType 参数中构造 KNN 匹配器时传递的值。

 BFMatcher::BFMatcher(int normType=NORM_L2, bool crossCheck=false )  
  • NORM_L2 表示欧几里德 d(p1,p2) = sqrt((x1 - x2)^2+(y1 - y2)^2 + ...);
  • NORM_Ll 表示曼哈顿 d(p1,p2) = abs(x1 - x2)+abs(y1 - y2) + ..;
  • NORM_HAMMING 表示Hamming等。
于 2013-11-06T15:15:15.140 回答