2

我一直在为 Android 的智能手机制作一个应用程序,其中可以比较 2 张图像(一张在 SD 卡上,一张来自相机)。在那里,我在有限数量的关键点上使用了 FREAK 描述符(我根据响应过滤掉了 500 个最好的)。当我尝试将它与 BRUTEFORCE_SL2 匹配时,它会返回 0 个匹配项。

这是因为 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。

4

1 回答 1

2

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

matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);

汉明距离实际上将计算一个描述符与另一个描述符不同的位数。

然后,重要的是要知道匹配器只为您在 中的每个描述符找到最佳对应关系 。因此,如果您得到的匹配少于预期,则需要查看之前的步骤(特征检测和描述符提取)。descriptors

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

我要提到的最后一件事(为了理解匹配器)是matcher.match()不对称的:

matcher.match(descriptors,descriptors1,matches);

将为中的每个描述符找到 中descriptors的最佳对应关系descriptors1。情况可能是相反的情况不正确(您可以尝试说服自己)。

这是我所说的“非对称”的更详细的示例:假设您Ai在 image 上有一个描述符,A并且您将 imageA与 image匹配B。你会得到Bi,这将是最好的对应BAi

现在,如果您将 imageB与 image匹配,您将在forA中获得最佳对应关系。但是可能存在一个, 不同于, 更类似于的。ABiAjAiBiAj

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

于 2013-05-01T16:32:41.817 回答