2015-01-04 1 views
0

입력 이미지와 데이터베이스의 이미지가 일치하는 앱을 만들고 있습니다.특징 두 이미지 간의 일치하는 일치율

어쨌든이 코드를 사용하고 있습니다 :

나는 내가 원하는 같은 일치하는 두 이미지 사이의 일치율을 알고있다,하지만 좋은 경기를 생산하고 계산 할 수 있어요
String path = Environment.getExternalStorageDirectory().getAbsolutePath(); 

    Bitmap objectbmp = BitmapFactory.decodeFile(path+"/Sample/Template.jpg"); 
    Bitmap scenebmp = BitmapFactory.decodeFile(path+"/Sample/Input.jpg"); 

    Mat object = new Mat(); //from the database 
    Mat scene = new Mat(); //user's input image 

    // convert bitmap to MAT 
    Utils.bitmapToMat(objectbmp, object); 
    Utils.bitmapToMat(scenebmp, scene); 

    //Feature Detection 
    FeatureDetector orbDetector = FeatureDetector.create(FeatureDetector.ORB); 
    DescriptorExtractor orbextractor = DescriptorExtractor.create(DescriptorExtractor.ORB); 

    MatOfKeyPoint keypoints_object = new MatOfKeyPoint(); 
    MatOfKeyPoint keypoints_scene = new MatOfKeyPoint(); 

    Mat descriptors_object = new Mat(); 
    Mat descriptors_scene = new Mat(); 

    //Getting the keypoints 
    orbDetector.detect(object, keypoints_object); 
    orbDetector.detect(scene, keypoints_scene); 

    //Compute descriptors 
    orbextractor.compute(object, keypoints_object, descriptors_object); 
    orbextractor.compute(scene, keypoints_scene, descriptors_scene); 

    //Match with Brute Force 
    MatOfDMatch matches = new MatOfDMatch(); 
    DescriptorMatcher matcher; 
    matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE); 
    matcher.match(descriptors_object, descriptors_scene, matches); 

    double max_dist = 0; 
    double min_dist = 100; 

    List<DMatch> matchesList = matches.toList(); 

    //-- Quick calculation of max and min distances between keypoints 
     for(int i = 0; i < descriptors_object.rows(); i++) 
     { double dist = matchesList.get(i).distance; 
     if(dist < min_dist) min_dist = dist; 
     if(dist > max_dist) max_dist = dist; 
     } 

    LinkedList<DMatch> good_matches = new LinkedList<DMatch>(); 

    for(int i = 0; i < descriptors_object.rows(); i++) 
     { if(matchesList.get(i).distance <= 3*min_dist) 
     { good_matches.addLast(matchesList.get(i)); 
     } 
     } 

:

입력 - Template1 = 35 % 입력 - 템플릿 2 = 12 % .....................

어떻게하는가?

답변

1

goodMatches/totMatches와 같은 일치 비율, 즉 일치의 정확도를 계산할 수 있습니다.

실제로 다양한 방법이 있습니다. 일반적인은 다음과 같습니다

  • 크로스 체크 : T1과 일치하는 최선의 템플릿이 T2 인 경우 SIFT와 같이, 최고의 두 번째 고려 : T1은 T2와 일치하는 경우, T2는 T1으로 확인하는 경우
  • 비율 체크 확인 템플리트 T2_2와 일치하고 일치 항목 간의 비율이 충분할 경우에만 첫 번째 일치 항목을 승인하십시오.
  • 기하학적 검증 : 당신이 템플릿 사이의 호모 그래피를 계산하고

나는 안드로이드 응용 프로그램 (나는 기능으로 ORB를 사용) 자바의 처음 두를 구현했습니다 동의하지 않는 matchings을 폐기해야한다.

private List<MatOfDMatch> crossCheck(List<DMatch> matches12, List<DMatch> matches21, List<MatOfDMatch> knn_matches) { 

    List<MatOfDMatch> good_matches = new ArrayList<MatOfDMatch>(); 

    for(int i=0; i<matches12.size(); i++) 
    { 
     DMatch forward = matches12.get(i); 
     DMatch backward = matches21.get(forward.trainIdx); 
     if(backward.trainIdx == forward.queryIdx) 
      good_matches.add(knn_matches.get(i)); //k=2 
    } 

    return good_matches; 
} 



private List<MatOfDMatch> ratioCheck(List<MatOfDMatch> knn_matches, float ratio) { 

    List<MatOfDMatch> good_matches = new ArrayList<MatOfDMatch>(); 

    for(int i=0; i<knn_matches.size(); i++) 
    { 
     List<DMatch> subList = knn_matches.get(i).toList(); 

     if(subList.size()>=2) 
     { 
      Float first_distance = subList.get(0).distance; 
      Float second_distance = subList.get(1).distance; 

      if((first_distance/second_distance) <= ratio) 
       good_matches.add(knn_matches.get(i)); 


     } 

    } 

    return good_matches; 
} 
관련 문제