OpenCV过滤ORB匹配

我使用ORBfunction检测器使用此代码查找两个图像之间的匹配:

FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB); DescriptorExtractor descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB);; DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); // First photo Imgproc.cvtColor(img1, img1, Imgproc.COLOR_RGB2GRAY); Mat descriptors1 = new Mat(); MatOfKeyPoint keypoints1 = new MatOfKeyPoint(); detector.detect(img1, keypoints1); descriptor.compute(img1, keypoints1, descriptors1); // Second photo Imgproc.cvtColor(img2, img2, Imgproc.COLOR_RGB2GRAY); Mat descriptors2 = new Mat(); MatOfKeyPoint keypoints2 = new MatOfKeyPoint(); detector.detect(img2, keypoints2); descriptor.compute(img2, keypoints2, descriptors2); // Matching MatOfDMatch matches = new MatOfDMatch(); MatOfDMatch filteredMatches = new MatOfDMatch(); matcher.match(descriptors1, descriptors2, matches); // Linking Scalar RED = new Scalar(255,0,0); Scalar GREEN = new Scalar(0,255,0); List matchesList = matches.toList(); Double max_dist = 0.0; Double min_dist = 100.0; for(int i = 0;i < matchesList.size(); i++){ Double dist = (double) matchesList.get(i).distance; if (dist  max_dist) max_dist = dist; } LinkedList good_matches = new LinkedList(); for(int i = 0;i < matchesList.size(); i++){ if (matchesList.get(i).distance <= (1.5 * min_dist)) good_matches.addLast(matchesList.get(i)); } // Printing MatOfDMatch goodMatches = new MatOfDMatch(); goodMatches.fromList(good_matches); System.out.println(matches.size() + " " + goodMatches.size()); Mat outputImg = new Mat(); MatOfByte drawnMatches = new MatOfByte(); Features2d.drawMatches(img1, keypoints1, img2, keypoints2, goodMatches, outputImg, GREEN, RED, drawnMatches, Features2d.NOT_DRAW_SINGLE_POINTS); Highgui.imwrite("matches.png", outputImg); 

我的问题是我无法找到一种方法来过滤匹配,以便它们只有在照片中具有相似位置时才匹配。 我总是得到一个关键点的多个匹配,即使它们位置非常远。

有没有办法更好地过滤它们?

要获得更好的匹配结果,您应该按给定顺序包含这些过滤方法。

  1. 在两个方向上执行匹配,即对于第一图像中的每个点,在第二图像中找到最佳匹配,反之亦然。

  2. 在匹配之间执行比率测试(欧几里德距离的比率测试)以消除模糊匹配。

  3. 执行RANSAC测试:它是一种模型拟合算法,可找到适合模型的最佳数据并删除exception值。
  4. 执行单应性:它是一种图像投影算法。

您可以在计算机视觉应用程序编程手册的第9章中获得上述方法的所有详细信息。 它还有用于实现这些过滤技术的示例代码。 这很容易理解。 (注意:本书中的代码是用C ++编写的,但是一旦理解,它也可以在JAVA中轻松实现)

看过Rober Langaniere的书。 我才知道有办法。 这是为了删除更远距离的匹配。 在java中,它如下

 Collections.sort(bestMatches,new Comparator() { @Override public int compare(DMatch o1, DMatch o2) { if(o1.distanceo2.distance) return 1; return 0; } }); if(bestMatches.size()>3){ bestMatches = bestMatches.subList(0,3); } 

通过采用两个描述符之间的最短汉明距离来完成匹配。 因此,您将始终在检测到的function之间进行匹配。

您应该修改ORB检测器的阈值。 这样,您将降低从背景中检测特征的可能性(即噪声),因此您检测到的大部分特征将来自感兴趣的主题。