openCV Android:knnMatcher仅返回1个描述符的匹配项

时间:2012-02-28 11:06:54

标签: android opencv sift surf knn

我必须为我的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场比赛,在这种情况下,这些比赛是正确的。

我找不到任何有关此类似问题的帖子,是否有任何人遇到此问题或者知道我在这里做错了什么?

提前完成。

1 个答案:

答案 0 :(得分:2)

下次您遇到OpenCV中的错误时,请检查它是否已在OpenCV bug tracker提交,如果找不到则提交新的错误。 你遇到的是C ++匹配器的JNI包装器中的一个错误,该修复程序刚刚被提交给OpenCV主干。 但是你可以在你的OpenCV-2.3.1副本中进行本地化,这只是一行代码:

  1. 在OpenCV-2.3.1 Android库项目(Converters.java)中打开org.opencv.utils.Converters :: Mat_to_vector_vector_DMatch(Mat m,List&gt; lldm)
  2. 将行List<DMatch> ldm = new ArrayList<DMatch>();向下移动两行,使其成为周期的第一行for (Mat mi : mats)
  3. 在Eclipse中重建OpenCV-2.3.1项目和您自己的项目
  4. 确保现在匹配器返回正确的结果