我必须为我的硕士论文实现一个用于 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 个匹配,在这种情况下它们当然是正确的。
我找不到任何处理过类似问题的帖子,是否有人遇到过这个问题或知道我在这里做错了什么?
提前谢谢。