2

我必须为我的硕士论文实现一个用于 android 的徽标检测算法。我目前正在使用带有 NDK 的 openCV android 库,并且已经设法使用 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 匹配时,在始终相同的关键点之间有 1 条匹配线,绘制了 500 次

当我尝试简单的匹配器时,它只是返回最佳匹配,我得到更多的行。我已经通过将图像与自身进行比较来测试这一点。Knn 返回这一行,其中一个简单的匹配会抽取所有 500 个匹配,在这种情况下它们当然是正确的。

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

提前谢谢。

4

1 回答 1

3

下次遇到 OpenCV 中的错误时,请检查它是否已在OpenCV 错误跟踪器中提交,如果没有找到,请提交新的。您面临的是 JNI 包装器到 C++ 匹配器中的一个错误,该修复程序刚刚提交给 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> lldm)
  2. 将该行向下移动List<DMatch> ldm = new ArrayList<DMatch>();两行,使其成为循环的第一行for (Mat mi : mats)
  3. 在 Eclipse 中重建 OpenCV-2.3.1 项目和您自己的项目
  4. 确保现在匹配器返回正确的结果
于 2012-02-29T12:32:23.660 回答