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. double max_dist = 0; double min_dist = 100; Почему мы объявляем эти расстояния как 0 и 100 соответственно? В качестве вывода я получаю Макс. Дист.: 488.559113 Мин. Дист.: 100.000000. Это кажется неправильным.

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

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

1 ответ

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