- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在 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。
最佳答案
首先,FREAK 创建二进制描述符。因此,您应该使用汉明距离而不是欧几里得距离(这在这里没有意义):
matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
汉明距离实际上会计算一个描述符与另一个描述符不同的位数。
然后,重要的是要知道匹配器只会为您在 descriptors
中找到的最佳对应 每个 描述符.所以如果你得到的匹配比预期少,你需要查看之前的步骤(特征检测和描述符提取)。
编辑:即使图像可能完全不同,您也会得到每个描述符的最佳匹配(即使这个匹配实际上是错误的)。文档中的示例代码通过测试距离是否大于 3*min_dist
来过滤掉较差的匹配项。 .但这不会消除错误的匹配!考虑有两个完全不同的图像;该算法将找到 best
他们可能的匹配,即使实际上这些都是错误的匹配......如果你真的想保持“正确”的匹配,你将不得不使用更高级的过滤技术(但这是另一个问题)。
我想提的最后一件事(为了匹配器的理解)是 matcher.match()
不对称:
matcher.match(descriptors,descriptors1,matches);
将为 descriptors
中的每个描述符找到 , 最佳对应descriptors1
。情况可能并非如此(您可以尝试说服自己)。
这里是我所说的“不对称”的更详细的例子:假设你有一个描述符 Ai
图片上A
和你匹配图像 A
图片B
.你会得到 Bi
, 这将是 B
中的最佳对应关系对于 Ai
.
现在,如果你匹配图像 B
图片A
, 您将在 A
中获得最佳对应关系对于 Bi
.但是可能存在一个Aj
,不同于Ai
,更类似于 Bi
比Aj
.
在这种情况下,匹配 A
至 B
会给信件Ai <-> Bi
匹配时 B
至 A
会给信件Bi <-> Aj
这显然不一样。
关于java - Bruteforce 匹配是否适用于 FREAK 描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16319773/
我正在尝试在 opencv 中使用 Freak 来检测特征并提取描述符,然后构建我的 BOW 词汇表,并为每个图像使用词汇表来匹配 BOW。你知道,整件事。我知道 BOW 可以与 SIFT 或 SUR
我对 OpenCV 2.4.3 中的 FREAK 函数有疑问。在 FREAK 的定义中,它说: FREAK( bool orientationNormalized = true, boo
所以我正在使用 FAST 检测器和 FREAK 描述符制作一个应用程序。当谈到匹配时,我想使用 BRUTEFORCE_HAMMING 匹配,但我没有得到预期的结果(给出更多与原始图像无关的匹配,然后是
我很难理解 FREAK 描述符中的参数 orientationNormalized 和 scaleNormalized。知道它们的意思或作用吗? OpenCV FREAK 文档:http://docs
我一直在处理 OpenCV FREAK 描述符,在用两个相似的方向和缩放图像获得非常棒的匹配结果后,我开始尝试使用缩放和旋转图像。 FREAK 应该对缩放/旋转不变,但我的结果很糟糕。我尝试调整异常描
我正在尝试在 freak_demo.cpp example 之后的最新版本的 OpenCV 中使用全新的描述符 FREAK .我没有使用 SURF,而是使用 FAST。我的基本代码是这样的: std:
我正在尝试使用 OpenCV 和 C++ 实现特征/对象跟踪应用程序。目前我正在使用 goodFeaturesToTrack 函数从我的第一帧创建我的特征向量。从那里,我将它传递给 calcOptic
我一直在 Android 智能手机上制作一个应用程序,可以比较 2 张图像(一张在 SD 卡上,一张来自相机)。在那里,我在有限数量的关键点上使用了 FREAK 描述符(我根据响应过滤掉了 500 个
有一种名为 FREAK 的新攻击 WCF 是否受到 FREAK 攻击的影响? 据我了解 this question无法在 WCF 中以编程方式指定允许的密码。 最佳答案 要使 FREAK 正常工作,您
s3_clnt.c 中的代码存在问题。我正在尝试确定此代码最终构建到哪个库。是 libeay32/64 还是? 谢谢 最佳答案 I'm trying to determine what library
我试过用这个文件编译 #include #include #include #include #include using namespace cv; static void help( c
我正在 OpenCV 2.4 中开发一些代码,我想测试 FREAK 检测器,但出现编译错误。我包含了 feature2d.h,我该怎么做才能解决这个问题? 最佳答案 FREAK 包含在 OpenCV
我想尝试 OpenCV 2.4.2 中的新类 FREAK。 我尝试使用特征检测器的通用接口(interface)来构造FREAK,但是,当然,它不起作用。我应该如何修改我的代码以获得结果? #incl
我正在阅读 Mark Seemann 所著的《.NET 中的依赖注入(inject)》,但我无论如何也无法理解这一点: Although the new keyword is a code smell
我正在使用 MATLAB 2014a 提取BRISK 和FREAK 描述符。我找不到任何选项可以将位串大小减小到 128 或 256,它们都生成为 512 位。我认为 FREAK 算法不允许这样做,但
我尝试使用 Opencv 在 Python 中实现 FREAK 描述符。这是我正在使用的代码: def surf_freak_detect(image,hessianThreshold): s
我正在使用 OpenCV 2.4.3 c++ 接口(interface)来查找两个图像之间的匹配点。第一次尝试是使用 SURF。唯一的问题是耗时,所以我尝试了新的 FREAK 提取器。使用 SURF
Control Freak: Commit rejected 的确切原因是什么。不允许 Foxtrot merge 我们经常收到这个错误,这是由于用户在提交时同时使用pull、rebase 和amen
我是一名优秀的程序员,十分优秀!