2013-06-25 2 views
0

Я использую БЫСТРО и FREAK получить дескрипторы пары изображений, а затем я применяю knnMatch с BruteForceMatcher согласованью и рядом я использую цикл, чтобы отделить хорошие матчи:обнаружения объектов с расстоянием Хемминг

float nndrRatio = 0.7f; 
    std::vector<KeyPoint> keypointsA, keypointsB; 
    Mat descriptorsA, descriptorsB; 
    std::vector< vector<DMatch> > matches; 

    int threshold=9; 
     // detect keypoints: 
    FAST(objectMat,keypointsA,threshold,true); 
    FAST(sceneMat,keypointsB,threshold,true); 

    FREAK extractor; 
     // extract descriptors: 
    extractor.compute(objectMat, keypointsA, descriptorsA); 
    extractor.compute(sceneMat, keypointsB, descriptorsB); 

    BruteForceMatcher<Hamming> matcher; 
     // match 
    matcher.knnMatch(descriptorsA, descriptorsB, matches, 2); 


     // good matches search: 
    vector<DMatch> good_matches; 

    for (size_t i = 0; i < matches.size(); ++i) 
    { 
     if (matches[i].size() < 2)  
       continue; 

     const DMatch &m1 = matches[i][0]; 
     const DMatch &m2 = matches[i][1]; 

     if(m1.distance <= nndrRatio * m2.distance)   
     good_matches.push_back(m1); 
    } 

     //If there are at least 7 good matches, then object has been found 
    if ((good_matches.size() >=7)) 
    { 
    cout << "OBJECT FOUND!" << endl; 
    } 

Я думаю, что проблема может быть хорошим методом поиска матчей, потому что использование его с FlannBasedMatcher отлично работает, но с BruteForceMatcher очень странно. Я подозреваю, что я могу совершить бессмыслицу с помощью этого метода, потому что расстояние Хэмминга использует двоичные дескрипторы, но я не могу придумать способ его адаптации!

Любые ссылки, фрагменты, идеи, ... пожалуйста?

+0

Итак, проблема в том, что совпадения, данные BFMatcher, неверны? Как вы его инициализируете? 'Резюме :: BFMatcher (резюме :: NORM_HAMMING)'? – JonesV

+0

Я попытался с помощью: 'cv :: BFMatcher matcher (cv :: NORM_HAMMING);' но результаты почти одинаковы. Я все еще думаю, что моя проблема может быть в последней части ... – Str1101

+0

У меня все еще не проблема. Почему вы говорите, что результаты плохие? – JonesV

ответ

1

Ваш код не плох, но я не думаю, что это то, что вы хотите сделать. Почему вы выбрали этот метод?

Если вы хотите обнаружить объект в изображении с помощью OpenCV, вы можете попробовать Cascade Classification. This link объяснит, как подготовить классификатор.

EDIT: Если вы думаете, что это слишком сложно, и если объект, который вы хотите, чтобы обнаружить плоский, вы можете попробовать this tutorial (это в основном вычисляет inliers, пытаясь найти гомографию преобразования между объектом и изображением) , Но классификация каскадов является более общей для обнаружения объектов.

+0

Большое спасибо за ваше время @JonesV, я действительно считаю, что классификация каскадов может быть методом, который я искал, и я собираюсь дать ему попробовать. И спасибо за другую ссылку тоже, я буду держать это как план Б :) – Str1101

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