在我的代码中,我根据最近的邻居距离比过滤好的图像,如下所示:
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]);
}
}
既然我是根据最近邻距离比过滤好的图像,我还需要做欧氏距离计算吗?
我想知道当我在 FlannBasedMatcher
中使用 knnMatch
方法时,方法内部是否使用欧氏距离来匹配关键点?
是的,你需要。最近邻距离比意味着您:1)计算从一幅图像中的描述符到第二幅图像中第一和第二最近邻的距离。 d1 = d(desc1_img1, descA_img2); d2 = d(desc1_img1, descB_img2)。2)计算距离比R = d1/d2。如果 R < 0.6,则匹配可能很好。这样做是因为您总是会在第二张图片中获得“最近”的描述符,无论它有多糟糕 - 您可以使用比率来检查它。
那么如果你没有距离,你会根据什么来计算比率?
距离的类型取决于你在normType参数中构造KNN-matcher时传递的值。
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等
我是一名优秀的程序员,十分优秀!