FLANN matcher-OPENCV 3-минутное максимальное расстояние

У меня есть код, который использует сопоставитель Фланна и детектор ORB для поиска признаков между двумя изображениями человека. Я использую opencv 3 на Ubuntu. У меня есть несколько сомнений. Код выглядит следующим образом:

  #include <iostream>
#include </home/sruthi/opencv/include/opencv2/opencv.hpp>

using namespace cv;

//void readme();

/** @function main */
int main(int argc, char** argv)
{
   if( argc != 3 )
  { //readme(); 
     return -1; }

  Mat img_object = imread( argv[1], IMREAD_GRAYSCALE );
  Mat img_scene = imread( argv[2], IMREAD_GRAYSCALE );


    if (!img_object.data || !img_scene.data)
    {
        std::cout << " --(!) Error reading images " << std::endl; return -1;
    }

    //-- Step 1: Detect the keypoints using ORB Detector
    Ptr<FeatureDetector> detector = ORB::create();

    std::vector<KeyPoint> keypoints_object, keypoints_scene;

    detector->detect(img_object, keypoints_object);
    detector->detect(img_scene, keypoints_scene);

    //-- Step 2: Calculate descriptors (feature vectors)
    Ptr<DescriptorExtractor> extractor = ORB::create();

    Mat descriptors_object, descriptors_scene;

    extractor->compute(img_object, keypoints_object, descriptors_object);
    extractor->compute(img_scene, keypoints_scene, descriptors_scene);

    descriptors_object.convertTo(descriptors_object,CV_32F);
    descriptors_scene.convertTo(descriptors_scene,CV_32F);


    //-- Step 3: Matching descriptor vectors using FLANN matcher
    Ptr<DescriptorMatcher> matcher = DescriptorMatcher::create("FlannBased");
    std::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;
    }

    printf("-- Max dist : %f \n", max_dist);
    printf("-- Min dist : %f \n", min_dist);

    //-- Draw only "good" matches (i.e. whose distance is less than 3*min_dist )
    std::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]);
        }
    }

    Mat img_matches;

    drawMatches(img_object, keypoints_object, img_scene, keypoints_scene, good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), std::vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);

    //-- Localize the object
    std::vector<Point2f> obj;
    std::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);
    }


    //-- Show detected matches
  imshow( "Good Matches", img_matches );

  for( int i = 0; i < (int)good_matches.size(); i++ )
  { printf( "-- Good Match [%d] Keypoint 1: %d  -- Keypoint 2: %d  \n", i, good_matches[i].queryIdx, good_matches[i].trainIdx ); }

    waitKey(0);
    return 0;


}
  1. двойное максимальное_расстояние = 0; двойное минимальное_расстояние = 100; Почему мы объявляем эти расстояния равными 0 и 100 соответственно? В качестве вывода я получаю Max dist: 488.559113 Min dist: 100.000000. Это кажется неправильным.

  2. if (matches[i].distance ‹ 3 * min_dist) { good_matches.push_back(matches[i]); } Почему я не могу изменить 3*min_dist на 2*min_dist? Я не получу совпадений, если я это сделаю.

  3. Обязательно ли наличие параллельных линий, как показано в официальной документации. У меня не получается параллельных линий. Я не могу опубликовать скриншот.


person K.Sruti    schedule 09.10.2015    source источник
comment
@miki не могли бы вы помочь?   -  person K.Sruti    schedule 12.10.2015


Ответы (1)


  1. Эти инициализации, кажется, настроены на конкретный случай, для которого написан этот код.
  2. Это опять же из-за настроенных параметров. Попробуйте поэкспериментировать с другим набором изображений, и вы должны увидеть некоторые изменения в результатах. Кроме того, другой хорошей практикой является использование вторых лучших расстояний для поиска хороших совпадений.
  3. Правильные совпадения должны иметь параллельные линии, потому что взаимное расположение совпадений на двух изображениях должно оставаться одинаковым. Любые пересекающиеся линии являются неправильными совпадениями.
person Him    schedule 05.12.2015