2013-05-02 79 views
-1

我一直在做一个应用程序,可以比较2张图片(我的智能手机上的2张图片)。我在有限的关键点上使用FAST检测器和FREAK描述符(根据响应筛选出最好的300个)。当我尝试将它与BRUTEFORCE_HAMMING匹配时,它会返回0个匹配项。Bruteforce和匹配给出了反向/错误的结果

匹配与

 MatOfDMatch matches = new MatOfDMatch(); 

     matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); 
     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 < 2*min_dist) 
      { temp.fromArray(matches.toArray()[i]); 
       goedematches.push_back(temp); 
       }   
     // } 
     } 

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

发生在我的图像进行比较,以本身,我得到下面的输出。输出是0x0好匹配。 enter image description here

05-02 15:52:30.325: D/LOG!(17866): Number of Descriptors image 1= 64x286 
05-02 15:52:30.325: D/LOG!(17866): Number of Descriptors image 2= 64x286 
05-02 15:52:30.325: D/LOG!(17866): description time elapsed 339 ms 
05-02 15:52:30.555: D/LOG!(17866): Minimum distance = 0.0 
05-02 15:52:30.560: D/LOG!(17866): Maximum distance= 0.0 
05-02 15:52:30.560: D/LOG!(17866): Number of good matches= 0x0 

当我使用相同的画面和一个有什么关系呢,我得到约471场比赛。代码内部有些问题,但我似乎无法看到有什么问题(代码似乎保留,导致所有相同的内容不匹配,并且在完全不同时匹配。做错了吗?)

重要提示:不要介意右图上的红点,它只是我在画面上画出关键点时拍摄的旧图片。它不代表匹配本身!它可以是任何其他与第一张图像无关的图片。

enter image description here

05-02 16:03:06.120: D/LOG!(19025): Number of Descriptors image 1= 64x259 
05-02 16:03:06.120: D/LOG!(19025): Number of Descriptors image 2= 64x286 
05-02 16:03:06.420: D/LOG!(19025): Minimum distance= 93.0 
05-02 16:03:06.420: D/LOG!(19025): Maximum distance = 183.0 
05-02 16:03:06.420: D/LOG!(19025): Number of good matches= 1x286 

回答

1
if(matches.toArray()[i].distance < 2*min_dist) 

在你第一种情况下你比较相同的图像,所以min_dist的值,因此0 和你的if语句会拒绝所有的匹配,而没有距离小于0。


在第二个情况下min_dist是93 * 2 = 186,并且自你maximum_distance是183,这将导致接受所有比赛,而不是拒绝第EM。

考虑到第9章讨论opencv计算机视觉食谱,有一个很好的方法可以根据比例和对称性测试保持良好的匹配。

+0

谢谢你的好消息,我一定会看看它。似乎我确实需要找到另一种方法。是否还有一个使用Java包装的coockbook,因为它全部是为C写的,我不使用本机部分。 – user1393500 2013-05-03 10:09:35

+0

这是一个随机的想法:如果我将该行更改为<=,那么它将接受0,并且它不会丢弃它。接下来,我将通过将if(matches.toArray()[i] .distance <= 2 * min_dist)'从2更改为1.5来进行过滤。 或者这是一个坏主意? – user1393500 2013-05-03 10:39:00

+0

给每个读到这样的人:这是一个糟糕的主意:DI仍然获得更多匹配的随机图片,然后是非常相似的图片 – user1393500 2013-05-03 10:53:14