我必须为我的masterthesis实现android的徽标检测算法。 我目前正在使用带有NDK的openCV安卓库,并且已经设法使用SURF检测这些关键点的关键点和设置描述符。
对我来说,下一步是使用 knnMatch 为每个关键点找到2个最接近的匹配,然后我扔掉匹配,其中最好的knn匹配与第二个匹配不是很明显(这两个的距离比太低了) 这是我的代码的一部分:
private static List<DMatch> knn(Mat queryDescriptors, Mat trainDescriptors) {
List<List<DMatch>> matches = new ArrayList<List<DMatch>>();
List<DMatch> retMatches = new ArrayList<DMatch>();
DescriptorMatcher matcher = DescriptorMatcher
.create(DescriptorMatcher.BRUTEFORCE);
matcher.knnMatch(queryDescriptors, trainDescriptors, matches, 2);
我的问题是,当我有500个描述符用于查询徽标而400用于火车徽标时,knn返回500个匹配,但每一个用于同一个关键点。通常,它为每个描述符返回2个最佳匹配,因此500个不同的描述符,现在它们为同一个描述符返回500倍最佳匹配。
因此,当我绘制这些knn匹配时,有一条匹配线,绘制500次,总是在相同的关键点之间
当我尝试简单匹配的简单匹配器时,我会得到更多的线条。 我已经通过比较图像与自身进行了测试。 Knn返回这一行,其中一场简单的比赛吸引了所有500场比赛,在这种情况下,这些比赛是正确的。
我找不到任何有关此类似问题的帖子,是否有任何人遇到此问题或者知道我在这里做错了什么?
提前完成。
答案 0 :(得分:2)
下次您遇到OpenCV中的错误时,请检查它是否已在OpenCV bug tracker提交,如果找不到则提交新的错误。 你遇到的是C ++匹配器的JNI包装器中的一个错误,该修复程序刚刚被提交给OpenCV主干。 但是你可以在你的OpenCV-2.3.1副本中进行本地化,这只是一行代码:
List<DMatch> ldm = new ArrayList<DMatch>();
向下移动两行,使其成为周期的第一行for (Mat mi : mats)