2016-07-11 16 views
2

검색을 위해 ORB를 사용하고 기능을 찾기 위해 FLANN을 사용하여 OpenCV와 기능을 추출하고 일치 시키려고합니다. 정말 이상한 결과가납니다. 제 2 개 이미지를로드하고 그레이 스케일로 변환 한 후, 여기에 내 코드입니다 :C++ - ORB를 사용한 OpenCV 기능 감지

// Initiate ORB detector 
    Ptr<FeatureDetector> detector = ORB::create(); 

// find the keypoints and descriptors with ORB 
    detector->detect(gray_image1, keypoints_object); 
    detector->detect(gray_image2, keypoints_scene); 

    Ptr<DescriptorExtractor> extractor = ORB::create(); 
    extractor->compute(gray_image1, keypoints_object, descriptors_object); 
    extractor->compute(gray_image2, keypoints_scene, descriptors_scene); 

// Flann needs the descriptors to be of type CV_32F 
    descriptors_scene.convertTo(descriptors_scene, CV_32F); 
    descriptors_object.convertTo(descriptors_object, CV_32F); 

    FlannBasedMatcher matcher; 
    vector<DMatch> matches; 
    matcher.match(descriptors_object, descriptors_scene, matches); 

    double max_dist = 0; double min_dist = 100; 

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

    //-- Use only "good" matches (i.e. whose distance is less than 3*min_dist) 
    vector<DMatch> good_matches; 

    for(int i = 0; i < descriptors_object.rows; i++) 
    { 
     if(matches[i].distance < 3*min_dist) 
     { 
      good_matches.push_back(matches[i]); 
     } 
    } 


    vector<Point2f> obj; 
    vector<Point2f> scene; 


    for(int i = 0; i < good_matches.size(); i++) 
    { 
     //-- Get the keypoints from the good matches 
     obj.push_back(keypoints_object[ good_matches[i].queryIdx ].pt); 
     scene.push_back(keypoints_scene[ good_matches[i].trainIdx ].pt); 
    } 

    // Find the Homography Matrix 
    Mat H = findHomography(obj, scene, CV_RANSAC); 
    // Use the Homography Matrix to warp the images 
    cv::Mat result; 
    warpPerspective(image1,result,H,Size(image1.cols+image2.cols,image1.rows)); 
    cv::Mat half(result,cv::Rect(0,0,image2.cols,image2.rows)); 
    image2.copyTo(half); 
    imshow("Result", result); 

그리고 이것은 내가지고있어 이상한 결과의 스크린 샷 : screen shot

어떤 문제가 될 수 있는가?

감사합니다!

+0

일치하지 않는 결과로 보입니다. 계산 된 변환은 "비현실적인"결과를 초래합니다. [예제] (http://docs.opencv.org/2.4/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.html)에서 완료된 내용을 살펴보십시오. – PhilLab

+0

나는 똑같은 일을하고 있습니다. 아니? 유일한 차이점은 SurfDescriptorExtractor는 자유롭게 사용할 수 없으므로 사용할 수 없다는 것입니다. – YaronGh

+0

하지만 다른 이미지를 사용하고 있습니다. 이미지가 그 이미지와 일치하지 않을 수 있습니다. ''imshow ("좋은 일치", img_matches); "'(예제 참조) – PhilLab

답변

1

잘못된 일치 결과 : 데이터에 맞는 호모 그래피가 "사실적"이 아니므로 이미지가 왜곡됩니다.

imshow("Good Matches", img_matches);으로 일치 항목을 example에서 디버깅 할 수 있습니다.

은 경기를 개선하기위한 여러 방법이 있습니다

  1. 완전히 잘못된 호모 그래피 계산
  2. 을 식별 할 crossCheck 옵션 cv::findHompgraphy에서 SIFT ratio test
  3. 사용 OutputArray mask
  4. 사용을 사용 ... 등등 ...
0

ORB는 Flann과 호환되지 않는 이진 특성 벡터입니다. 대신 Brute Force (BFMatcher)를 사용하십시오.