title: OpenCV filtering ORB matches
body: <p>I am using the ORB feature detector to find matches between two images using this code:</p>
  
  <pre><code>    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&lt;DMatch&gt; matchesList = matches.toList();
      Double max_dist = 0.0;
      Double min_dist = 100.0;
  
      for(int i = 0;i &lt; matchesList.size(); i++){
          Double dist = (double) matchesList.get(i).distance;
          if (dist &lt; min_dist)
              min_dist = dist;
          if ( dist &gt; max_dist)
              max_dist = dist;
      }
  
  
  
      LinkedList&lt;DMatch&gt; good_matches = new LinkedList&lt;DMatch&gt;();
      for(int i = 0;i &lt; matchesList.size(); i++){
          if (matchesList.get(i).distance &lt;= (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);
  </code></pre>
  
  <p>My problem is that I can't find a way to filter the matches so that they only match when they have similar positions in the photos. I always get multiple matches for one keypoint even if they are very far away position-wise.</p>
  
  <p>Is there a way to filter them better?</p>