2017-01-27 3 views
1

Ich habe ein Bild von einigen Tassen hereOpenCV - Zwei völlig unterschiedliche Bilder werden weitere Spiele mit BFMatcher mit

und ein Bild einer Katze here

ich diese beiden Bilder in OpenCV mit Surf vergleichen wollen und passen Sie sie unter Verwendung BFMatcher an. Hier

ist der Code:

//read the image 
cv::Mat image1= cv::imread("C:\\Users\\The\\Desktop\\cub.jpg"); 
cv::Mat image2= cv::imread("C:\\Users\\The\\Desktop\\cat.jpg"); 
//detect the key points using surf 
cv::SurfFeatureDetector surf(300,4,2,true,false); 
    //image 1 key points 
vector<cv::KeyPoint> image1Keypoints; 
//detect the key points in image 1 using surf 
surf.detect(image1,image1Keypoints); 
//draw the keypoints of image1 
cv::drawKeypoints(image1,image1Keypoints,image1,          
    cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_OVER_OUTIMG); 
cv::namedWindow("Original image 1 with keypoints"); 
cv::imshow("Original image 1 with keypoints",image1); 
// image 2 key points 
std::vector<cv::KeyPoint> image2keypoints; 
//detect the key points in image 1 using surf 
surf.detect(image2,image2keypoints); 
//draw the key points 
cv::drawKeypoints(image2,keypoints1,image2,         
     cv::Scalar(255,255,255),cv::DrawMatchesFlags::DRAW_OVER_OUTIMG);      
//the extracted image display 
cv::namedWindow("image 2 with keypoints"); 
cv::imshow("image 2 with keypoints",image2); 

Aus dem obigen Code dies die Tassen Bild kennzeichnet this

und die Katze Bildmerkmale: this

cv::SiftDescriptorExtractor sift; 
cv::Mat image1Descriptor; 
cv::Mat image2Desccriptor; 
sift.compute(image1, 
      image1Keypoints, 
      image1Descriptor); 
sift.compute(image2, 
      keypoints1, 
      image2Desccriptor); 
cv::BFMatcher matcher(cv::NORM_L2,true); 
std::vector<cv::DMatch> matches; 
matcher.match(image2Desccriptor,image1Descriptor,matches); 
cout<<"match="; 
//the number of matched features between the two images 
cout<<matches.size()<<endl; 
cv::Mat imageMatches; 
cv::drawMatches(image2,keypoints1,image1,image1Keypoints,     
    matches,imageMatches,cv::DrawMatchesFlags::DRAW_OVER_OUTIMG);    
cv::namedWindow("matches"); 
cv::imshow("matches",imageMatches); 
cv::waitKey(0); 

Was wirklich verwirrt mich ist das übereinstimmende Bild: matches

Es gibt rund 833 aufeinander abgestimmte Funktionen, aber die Bilder sind völlig unterschiedlich.

Was ist los mit meinem Code & Wie kann ich die Anzahl der Übereinstimmungen verringern. Ich war in der Lage, die Anzahl der Übereinstimmungen zu verringern, indem ich die Surf-Parameter ändere, aber es ist, weil es kleine Anzahl von Merkmalen entdeckt. Zum Beispiel durch den siftFeature Detektor dieser Veränderung:

cv::SurfFeatureDetector surf(1000,4,2,true,false);

konnte ich Streichhölzer = 77 erhalten, aber es ist immer noch eine große Anzahl von Spielen und die Spiele verringert werden, weil ich kleine Anzahl von Merkmalen verglichen wurde immer zu den oben genannten Nummern.

+0

Während ich blättern sehe ich eine Geschichte .... :-D – P0W

+2

Sie vergleichen kleine Bild-Patches (32x32 oder so), d. H. Die Deskriptoren ... Passende Deskriptoren bedeutet nicht, Bilder zu vergleichen. Sie müssen einige andere Schritte nach dem Abgleich durchführen. – Miki

+0

@POW meine Frage ist für zwei verschiedene Bilder, wie es möglich ist, so viel Übereinstimmung zu haben und wie die Anzahl der Übereinstimmungen zu verringern? – Yirga

Antwort

1

Sie sollten dies überprüfen answer.

In der Regel gibt BruteForce den Abstand zwischen zwei Übereinstimmungen zurück. Je geringer der Abstand zwischen zwei Merkmalen ist, desto ähnlicher sind sie. Durch das Anwenden eines Schwellenwerts auf diese Entfernungen können Sie falsch positive Übereinstimmungen entfernen.

Featureübereinstimmungen garantieren jedoch nicht, dass die Objekte in zwei Bildern identisch sind. Um diese Art von Verifikation durchzuführen, müssen Sie Ihre Implementierung ein wenig weiterverfolgen und (zum Beispiel) die positiven Übereinstimmungen geometrisch mit einer Homographie verifizieren.

Verwandte Themen