Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Bruteforce匹配是否适用于畸形描述符?_Java_Android_Opencv - Fatal编程技术网

Java Bruteforce匹配是否适用于畸形描述符?

Java Bruteforce匹配是否适用于畸形描述符?,java,android,opencv,Java,Android,Opencv,我已经在Android智能手机上制作了一个应用程序,可以比较两张图像(一张在SD卡上,一张在相机上)。在那里,我在有限数量的关键点上使用了一个奇怪的描述符(我根据响应筛选出了500个最好的)。当我尝试将其与BRUTEFORCE_SL2匹配时,它返回0个匹配项 这是因为怪物和蛮力不能很好地合作吗?还是我在代码中做错了什么 匹配发生在 MatOfDMatch matches = new MatOfDMatch(); matcher = DescriptorMatcher.c

我已经在Android智能手机上制作了一个应用程序,可以比较两张图像(一张在SD卡上,一张在相机上)。在那里,我在有限数量的关键点上使用了一个奇怪的描述符(我根据响应筛选出了500个最好的)。当我尝试将其与BRUTEFORCE_SL2匹配时,它返回0个匹配项

这是因为怪物和蛮力不能很好地合作吗?还是我在代码中做错了什么

匹配发生在

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());
并用手指读出比赛结果

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

即使我拍了一张看起来和我的照片不一样的照片,我也能得到大约450个。

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

汉明距离实际上会计算不同描述符的位数

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

编辑:即使图像可能完全不同,您也将获得每个描述符的最佳匹配(即使此匹配实际上是错误的)。文档中的示例代码通过测试距离是否大于
3*min\u dist
,过滤掉最差的匹配。但这不会消除错误的匹配!考虑两种完全不同的图像;该算法将为它们找到
最佳的
可能的匹配,即使实际上这些都是错误的匹配。。。如果你真的想保持“正确”的匹配,你必须使用更先进的过滤技术(但这是另一个问题)

最后一件我想提及的事情(为了理解matcher)是
matcher.match()
是不对称的:

matcher.match(descriptors,descriptors1,matches);
将为
描述符
中的每个描述符找到
描述符1
中的最佳对应关系。可能情况正好相反(你可以试着说服自己)

这里有一个更详细的例子来说明我所说的“非对称”:假设您在图像
a
上有一个描述符
Ai
,并且您将图像
a
与图像
B
匹配。您将获得
Bi
,这将是
Ai
B
中的最佳对应

现在,如果您将image
B
与image
A
匹配,您将获得
Bi
A
中的最佳对应关系。但是可能存在一个不同于
Ai
Aj
,它比
Aj
更类似于
Bi


在这种情况下,当将
B
匹配到
A
时,将
A
匹配到
B
将得到明显不同的对应
Bi

你最后一句话是什么意思?谢谢你提供的信息,我将尝试使用Hamming并检查我的结果是的,我一直在尝试Hamming,但goedematches.size()会返回奇怪的结果。与与原始图像几乎相同的图像相比,与原始图像没有任何关系的图像匹配更好。我再次修改了答案。只需尝试绘制
匹配项
goedematches
,以查看某些匹配项是否正确。错误的匹配并不罕见(需要过滤掉这些匹配),但您也应该获得正确的匹配(如果两个图像几乎相同,则更是如此)。
matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
matcher.match(descriptors,descriptors1,matches);