OpenCV功能匹配以检查两个场景之间的相似性

时间:2016-05-01 15:49:29

标签: opencv computer-vision similarity feature-detection

我正在开发一个项目,我必须根据保存在目录中的检查点列表,使AR无人机遵循路径。每个检查点都是无人机沿其路径检测到的场景。在亮度,实际场景中存在的小障碍或视点的小变化方面,检查点和实际场景之间可能存在差异。为了在无人机移动时检测检查点,我决定使用特征匹配来获得良好匹配的数量以及内部比率和良好匹配的数量,并使用这些参数来检查是否已到达检查点

算法:

  1. 将图像转换为灰度
  2. 使用检测器检测关键点(我尝试过SIFT,SURF,ORB 和AKAZE)
  3. 使用提取器计算特征向量
  4. 使用匹配算法执行匹配(我试过了 Bruteforce和Bruteforce-Hamming)
  5. 只保留好匹配并计算内部数量。
  6. 检查内部和良好匹配之间的比率是否高于a 阈值和good_matches的数量高于另一个阈值。 如果此条件成立,则检查点已匹配。
  7. 结果:检查算法大致上是好的,但有时它会检测到一个检查点,这个检查点是从登陆的无人机中获取的,只有在穿过它之后。虽然使用相同的检查点,如果无人驾驶飞机相对于检查站的位置略微向左移动,则检查算法不会检测到它。

    这是解决这个问题的好方法还是有更好的方法来实现我的目标?如果这是一个好方法,如何在无人机靠近检查站时改进检查?

    实现功能匹配的代码如下所示:

    matcher->knnMatch(desc1, desc2, dmatches, KNN_best_matches);
    vector<Point2f> matches, inliers;
    if(matches2points_nndr(kp1,kp2,dmatches,matches,DRATIO,MIN_MATCH_COUNT)){
        *match = true;
    
        //compute inliers
        compute_inliers_ransac(matches, inliers, MAX_H_ERROR, false);
    
        //update stats
        stats.matches = (int)matches.size()/2;
        stats.inliers = (int)inliers.size()/2;
        stats.outliers = stats.matches - stats.inliers;
        stats.ratio = (float) stats.inliers * 100.0 / (float) stats.matches;
    }
    

    在另一个班级中,将stats.ratio与阈值进行比较。

    if(draw_stats.ratio > threshold_matching){
        //move to the next checkpoint
        match = true;
    }else{
        std::cout << "ratio is under the threshold: " << draw_stats.ratio << std::endl;
        match = false;
    }
    

0 个答案:

没有答案