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

OpenCV特征匹配以检查两个场景之间的相似性,opencv,computer-vision,similarity,feature-detection,Opencv,Computer Vision,Similarity,Feature Detection,我正在做一个项目,我必须让AR无人机根据保存在目录中的检查点列表沿着一条路径飞行。每个检查点都是无人机应沿其路径检测的场景。在亮度、实际场景中存在的小障碍物或视角的微小变化方面,检查点与实际场景之间可能存在差异。为了在无人机移动时检测检查点,我决定使用特征匹配来获得良好匹配的数量以及入口与良好匹配数量之间的比率,并使用这些参数来检查是否达到检查点 算法: 将图像转换为灰度 使用检测器检测关键点(我试过筛、冲浪、球体 (阿卡泽) 使用提取器计算特征向量 使用匹配算法执行匹配(我已尝试 布鲁特福斯和

我正在做一个项目,我必须让AR无人机根据保存在目录中的检查点列表沿着一条路径飞行。每个检查点都是无人机应沿其路径检测的场景。在亮度、实际场景中存在的小障碍物或视角的微小变化方面,检查点与实际场景之间可能存在差异。为了在无人机移动时检测检查点,我决定使用特征匹配来获得良好匹配的数量以及入口与良好匹配数量之间的比率,并使用这些参数来检查是否达到检查点

算法:

  • 将图像转换为灰度
  • 使用检测器检测关键点(我试过筛、冲浪、球体 (阿卡泽)
  • 使用提取器计算特征向量
  • 使用匹配算法执行匹配(我已尝试 布鲁特福斯和布鲁特福斯·哈明)
  • 只保留好的匹配项并计算内联数
  • 检查入口和良好匹配之间的比率是否高于a 阈值,并且良好的_匹配数高于另一个阈值。 如果此条件成立,则检查点已匹配
  • 结果:检查算法大致不错,但有时它只在通过检查点后才检测到一个检查点,该检查点是从着陆的无人机上获取的。然而,对于相同的检查点,如果无人机与检查点所在位置相比稍微向左移动,则检查算法不会检测到无人机

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

    实现特征匹配的代码如下所示:

    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;
    }
    
    matcher->knmatch(描述1、描述2、数据匹配、KNN\u最佳匹配);
    向量匹配,内联;
    if(匹配2点(kp1、kp2、D匹配、匹配、DRATIO、最小匹配计数)){
    *匹配=真;
    //计算内联线
    计算输入值(匹配、输入值、最大错误、错误);
    //更新统计数据
    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;
    }
    
    if(绘制统计比率>阈值匹配){
    //移动到下一个检查点
    匹配=真;
    }否则{
    
    std::这是一个很好的任务。你能给我们一些代码和图像数据以便我们能提供帮助吗?我已经在问题中添加了代码。为什么不在两个场景之间做一个简单的单应性呢?这是在计算-输入-转换方法中完成的,但是,我如何正确地调整参数来解决我的问题呢?有趣的是,你能给我们分享一些数据集来玩吗H