2013-05-01 74 views
2

我一直在智能手机上的Android应用程序,其中2张图片可以比较(一个在SD卡上,一个从相机)。我在有限的关键点上使用FREAK描述符(根据响应筛选出500个最好的关键点)。当我尝试将它与BRUTEFORCE_SL2匹配时,它会返回0个匹配项。Bruteforce匹配与FREAK描述符一起工作吗?

这是因为FREAK和Bruteforce在一起工作不好吗?或者我在代码中做错了什么?

匹配情况与

MatOfDMatch matches = new MatOfDMatch(); 

      matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_SL2); 
      matcher.match(descriptors,descriptors1,matches); 
      MatOfDMatch goedematches = new MatOfDMatch(); 

      double max_dist = 0; 
      double min_dist = 100; 
      //if (descriptors.cols() == descriptors1.cols()) 
      //{ 
      for(int i = 0; i < descriptors.rows(); i++) 
      { double dist = matches.toArray()[i].distance; 
       if(dist < min_dist) min_dist = dist; 
       if(dist > max_dist) max_dist = dist; 
      } 
      // should only draw good matches 
      for(int i = 0; i < descriptors.rows(); i++) 
      { MatOfDMatch temp = new MatOfDMatch(); 
       if(matches.toArray()[i].distance < 3*min_dist) 
       { temp.fromArray(matches.toArray()[i]); 
        goedematches.push_back(temp); 
        }   
      // } 
      } 

      Log.d("LOG!", "Number of good matches= " + goedematches.size()); 

当我只是做了

matcher.match(descriptors,descriptors1,matches); 

Log.d("LOG!", "Number of good matches= " + matches.size()); 

宣读了比赛,我得到约450即使我拿的图片甚至不像我的形象。

回答

2

首先,FREAK创建二进制描述符。因此,你应该使用汉明距离代替欧几里得一个(这在这里是没有意义的)的:

matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); 

的汉明距离将实际数着不同于一个描述符与其它位的数量。

然后,重要的是要知道,只有匹配找到最好对应每个描述你descriptors有。因此,如果您获得的比赛数量少于预期,则需要查看之前的步骤(特征检测和描述符提取)。

编辑:即使图像可能完全不同,您将得到每个描述符的最佳匹配(即使这种匹配实际上是错误的)。文档中的示例代码通过测试距离是否大于3*min_dist来过滤较差的匹配。但是这不会消除错误的比赛!考虑有两个完全不同的图像;该算法会为它们找到可能的匹配,尽管实际上这些匹配都是错误的......如果您确实想保持“正确”匹配,您将不得不使用更高级的过滤技术(但这是另一个问题)。

最后一件事我想提一提(用于匹配的理解)是matcher.match()不是对称的:

matcher.match(descriptors,descriptors1,matches); 

会发现,在descriptors每个描述符,在descriptors1最好的对应关系。反过来可能是不正确的(你可以试着说服自己)。

这里是我的意思是“不对称”更详细的例子:假设你有像A描述符Ai和你匹配的图像A图像0​​。您将获得Bi,这将是BAi的最佳通信。

现在,如果您将图片B与图片A相匹配,您将获得ABi的最佳对应关系。但可能存在Aj,与Ai不同,它与BiAj更相似。

在这种情况下,匹配AB匹配BA将给对应Bi <-> Aj这显然是不一样的会给对应Ai <-> Bi

+0

你最后一句话是什么意思?谢谢你的信息,我会试试汉明并检查我的结果 – user1393500 2013-05-01 18:11:31

+0

我编辑了我的答案。我希望现在更清楚。 – JonesV 2013-05-01 19:31:55

+0

是的,我一直在尝试汉明,但goedematches.size()给出了奇怪的结果。与原始图像没有任何关系的图像比与原始图像几乎相同的图像更好地匹配。 – user1393500 2013-05-01 23:48:52