将ORB功能与阈值匹配

时间:2014-04-04 08:26:13

标签: android opencv matching threshold orb

我的项目是基于android的草药识别。我使用ORB获取关键点,功能和匹配功能。

我想使用这个算法:

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

    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? 我必须对最大距离做些什么?

    我想使用的algoritma,我之前使用过Invariant Moment,以及City Block Distance来匹配最小距离的图像。

1 个答案:

答案 0 :(得分:7)

我也不知道。距离是特征点相似度的度量,越少越好。 original ORB paper(下面的图5)显示了好的和坏的匹配距离的分布。人们可以肯定地说,#34;好&#34;距离阈值约为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/