2016-07-11 8 views
2

Я пытаюсь извлечь и сопоставить функции с OpenCV, используя ORB для обнаружения и FLANN для сопоставления, и я получаю действительно странный результат. После загрузки мои 2 изображений и конвертирования их в оттенках серого, вот мой код:C++ - обнаружение функции OpenCV с ORB

// 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. Используйте кнопки crossCheck вариант
  2. Используйте SIFT ratio test
  3. Используйте OutputArray mask в cv::findHompgraphy для идентификации совершенно неправильно гомография вычисления
  4. ... и так далее ...
0

ORB - это двоичные векторы функций, которые не работают с Flann. Вместо этого используйте Brute Force (BFMatcher).