-1

我一直在制作一个可以比较 2 张图像的应用程序(我的智能手机上有 2 张图片)。在那里,我在有限数量的关键点上使用了 FAST 检测器和 FREAK 描述符(我根据响应过滤掉了 300 个最好的)。当我尝试将它与 BRUTEFORCE_HAMMING 匹配时,它会返回 0 个匹配项。

匹配发生在

        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 好的匹配。 在此处输入图像描述

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 个匹配项。代码里面有问题,但我似乎看不出有什么问题(代码似乎保留,导致相同的所有内容都不匹配,完全不同时匹配。代码在哪里做错了?)

重要提示:不要介意右图上的红点,这只是我在屏幕上绘制关键点时拍的一张老照片。它不代表匹配本身!它可以是与第一张图片无关的任何其他图片。

在此处输入图像描述

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
4

1 回答 1

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

在第一种情况下,您比较相同的图像,因此 min_dist 的值因此为 0,并且您的 if 语句将拒绝所有匹配项,因为没有距离小于 0。


在您的第二种情况下 min_dist 是 93*2=186 并且由于您的 maximum_distance 是 183 这将导致接受所有匹配项而不是拒绝它们。

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

于 2013-05-02T23:14:24.833 回答