android - 将 ORB 特征与阈值匹配

标签 android opencv matching threshold orb

我的项目是基于android的草药识别。我使用 ORB 来获取关键点、特征和匹配特征。

我想使用这个算法:

  • 我使用 4 个引用图像,并将它们的特征 image1 与 image1、1-2、1-3、1-4、2-3、3,4 匹配。
  • 然后我将到数据库的最小和最大距离存储为阈值。 (最小阈值 = 总最小值/6)
  • 当我识别出新图像时,我会将新的最小和最大距离与数据库中的距离进行比较。但我不知道该怎么做。

  • {
    for (j=MinID; j<=MaxID; j++){
                            MatOfDMatch matches = DetectUtility.match(features, matFromJson(DB.GetORBFitur(j)));
                            List<DMatch> matchesList = matches.toList();
                            Double max_dist = 0.0;
                            Double min_dist = 100.0;
                            for (int i = 0; i < matchesList.size(); i++){
                                Double dist = (double) matchesList.get(i).distance;
                                if (dist < min_dist && dist != 0){
                                    min_dist = dist;
                                }
                                if (dist > max_dist){
                                    max_dist = dist;
                                }
                            }
    

    来自 this site ,我得到这个代码:
    //-- Draw only "good" matches (i.e. whose distance is less than 3*min_dist )
    std::vector< DMatch > good_matches;
    
    for( int i = 0; i < descriptors_object.rows; i++ )
    { if( matches[i].distance < 3*min_dist )
     { good_matches.push_back( matches[i]); }
    }   
    

    如何获得那个神奇的数字 3?
    我必须怎么做才能达到最大距离?

    我想使用的算法,我之前使用过使用不变矩和城市街区距离来匹配具有最小距离的图像。

    最佳答案

    我也不知道。距离是特征点相似度的度量,越少越好。 original ORB paper (下图 5)显示了好匹配和坏匹配的距离分布。可以肯定地说,“良好”的距离阈值约为 64。
    Distance distribution for ORB

    所以更正确的是:

    double dist_th = 64;
    for( int i = 0; i < descriptors_object.rows; i++ )
    { if( matches[i].distance < dist_th )
     { good_matches.push_back( matches[i]); }
    } 
    

    然后你仍然必须使用 RANSAC 来过滤不一致的匹配。因此,最简单的解决方案是将您的查询图像与所有 4 个数据库图像进行匹配。

    但我建议你使用一些分类器,而不仅仅是匹配。看看这个人的方法(它有效,我认识他) - http://cmp.felk.cvut.cz/~sulcmila/

    关于android - 将 ORB 特征与阈值匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22857398/

    相关文章:

    android - 如何在android studio中比较或计算两个日期的差异

    c++ - equalizeHist 中的 opencv 内存泄漏?

    python - 在CV2或PIL中将特定范围的颜色更改为另一种颜色

    python - 视频播放比预期快很多

    javascript - 从字符串中获取多个数字 1-10

    Java 正则表达式不计算给定文件中的所有匹配项

    android - RuntimeException + ConnectException = Android 应用程序崩溃 (KSOAP2)

    java - Spinner 中带有字符串数组的 NullPointerException

    android - 如何确保所有服务连接都已绑定(bind)?

    在两组人之间安排面试的算法