2012-12-12 11 views
7

Próbuję zupełnie nowego deskryptora FREAK z najnowszej wersji OpenCV po freak_demo.cppexample. Zamiast używać SURF używam FAST. Mój podstawowy kod jest coś takiego:OpenCV FREAK zwraca zbyt wiele wartości odstających

std::vector<KeyPoint> keypointsA, keypointsB; 
Mat descriptorsA, descriptorsB; 
std::vector<DMatch> matches; 

FREAK extractor; 
BruteForceMatcher<Hamming> matcher; 

FAST(imgA,keypointsA,100); 
FAST(imgB,keypointsB,20); 

extractor.compute(imgA, keypointsA, descriptorsA); 
extractor.compute(imgB, keypointsB, descriptorsB); 

matcher.match(descriptorsA, descriptorsB, matches); 
  • Algorytm wyszukuje wiele meczów, ale istnieje wiele wartości skrajnych. Czy robię to dobrze? Czy istnieje sposób na dostrojenie algorytmu?

Odpowiedz

16

Podczas wykonywania pasujących do zawsze istnieją pewne kroki doskonalenia w celu pozbycia się wartości odstających.

Co zwykle zrobić jest wyrzuceniem mecze, które mają dystans nad progiem, na przykład:

for (int i = 0; i < matches.size(); i++) 
{ 
    if(matches[i].distance > 200) 
    { 
     matches.erase(matches.begin()+i-1); 
    } 
} 

Następnie używam RANSAC aby zobaczyć, który pasuje pasuje do modelu homography. OpenCV posiada funkcję dla tego:

for(int i = 0; i < matches.size(); i++) 
    {    
     trainMatches.push_back(cv::Point2f(keypointsB[ matches[i].trainIdx ].pt.x/500.0f, keypointsB[ matches[i].trainIdx ].pt.y/500.0f)); 
     queryMatches.push_back(cv::Point2f(keypointsA[ matches[i].queryIdx ].pt.x/500.0f, keypointsA[ matches[i].queryIdx ].pt.y/500.0f)); 
    } 

Mat h = cv::findHomography(trainMatches,queryMatches,CV_RANSAC,0.005, status); 

A ja po prostu wyciągnąć inliers:

for(size_t i = 0; i < queryMatches.size(); i++) 
{ 
    if(status.at<char>(i) != 0) 
    { 
     inliers.push_back(matches[i]); 
    } 
} 

Mat imgMatch; 
drawMatches(imgA, keypointsA, imgB, keypointsB, inliers, imgMatch); 

Wystarczy spróbować różnych progów i odległości, aż do uzyskania pożądanych resutls.

+0

byłem ciekaw o swoje _ „Odrzucanie mecze, które mają dystans ponad progiem” _ przykład, ale kiedy próbowałem uwzględnij to w moim kodzie, otrzymuję błąd _ "iteratora wektorowego + przesunięcie poza zakresem" _? – MLMLTL

3

Możesz także wyszkolić deskryptor, podając własne wybrane pary. I dostroić parametry w konstruktorze.

explicit FREAK(bool orientationNormalized = true 
     , bool scaleNormalized = true 
     , float patternScale = 22.0f 
     , int nbOctave = 4 
     , const vector<int>& selectedPairs = vector<int>() 
    ); 

BTW, bardziej wydajna wersja FREAK jest na drodze :-)

+0

Efektywny o jaki parametr lub parametry? Potrzebuję solidnego FREAKA, nie szybko. Potrzebuję również solidnego detektora funkcji, takiego jak MU-SURF. –

Powiązane problemy