2016-05-17 4 views
0

Я пытаюсь написать программу, которая использует алгоритм ORB для обнаружения и вычисления ключевых точек изображения и видео и сопоставляет векторы дескриптора с использованием BruteForce. Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я запускаю программу на Visual C++, когда объект, который я пытаюсь обнаружить, не отображается, мой алгоритм рисует все предполагаемые совпадающие строки между обнаруженными ключевыми точками (он соответствует всем ключевые точки). Когда объект, который я пытаюсь обнаружить, появляется на изображении, я не сталкиваюсь с этой проблемой, на самом деле я почти не получаю никаких несоответствий.ORB/BruteForce-drawing совпадений, когда их нет

Это краткая последовательность основного теста:

• преобразование входного изображения в оттенки серого

• преобразовывать входные видео в оттенки серого

• выявления ключевых точек и извлечение дескрипторов из входных полутонового изображения

• обнаруживать ключевые точки и извлекать дескрипторы из входных изображений в оттенках серого

• m (см. ниже)

BFMatcher matcher(NORM_HAMMING); 
    vector<DMatch> matches; 
    matcher.match(descriptors_1, descriptors_2, matches); 

    double max_dist = 0; double min_dist = 100; 

    ////calcularea distantelor max si min distances intre keypoints 
    for (int i = 0; i < descriptors_1.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); 


    std::vector<DMatch> good_matches; 

    for (int i = 0; i < descriptors_1.rows; i++) 
    { 
     if (matches[i].distance <= max(2 * min_dist, 0.02)) 
     { 
      good_matches.push_back(matches[i]); 
     } 
    } 

    ////-- Desenarea matches-urilor "bune" 
    Mat img_matches; 
    drawMatches(img1, keypoints_1, cadruProcesat, keypoints_2, 
     good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), 
     vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS); 

    ////-- Afisare matches 
    imshow("good matches", img_matches); 
    int gm = 0; 
    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); 
     gm += 1; 
    } 

    printf("%d",gm); 
    /////////////////////////////////////////////////////////////////// 
    //imshow(windowName2, cadruProcesat); 

    switch (waitKey(10)) { 

    case 27: 
     //tasta 'esc' a fost apasata(ASCII 27) 
     return 0; 
    } 
} 

return 0; 

Пожалуйста, помогите мне найти проблему.

+0

Либо, 'вы не проверяют, когда ваш Keypoints_2 пуст », или проблема находится где-то в другом месте. Получите нам 'matcher.match (дескрипторы_1, дескрипторы_2, совпадения);' для лучшей помощи. – Vtik

ответ

0

Так я изменил значение Min_Dist до 15 (не 100), и кажется, что она работает очень хорошо для моделей ... но это было сделано путем проб и ошибок ...

 Смежные вопросы

  • Нет связанных вопросов^_^