2013-06-01 4 views
5

ich im Grunde viele keypoints mit SURF von ähnlichen Bildern und Hinzufügen von ihnen zu dem BFMatcher(NORM_L2)knnMatch mit k = 2 ergibt 0 Nächster-Nachbar sogar mit Bildern trainiert

In Runtime am extrahieren kann es passieren, dass ich neue keypoints hinzufügen meine Jetzt Matcher mit matcher->add(myNewDescriptors);

wenn ich ein Bild mit nur 1 keypoint/Deskriptor hinzugefügt und ich verwende knnMatch es gibt keine Treffer:

matcher->knnMatch(queryDesc,matches,2); 

Nach einer Weile bekomme ich einen Vektor mit 0 Nächster-Nachbar:

for(auto i = 0; i <matches.size(); i++) { 
    cout << "matches size: "<<matches[i].size()<<endl; 
    //> PRINTS: "matches size: 0" 

Das passiert nur, wenn ich ein Bild mit nur 1 keypoint/descriptor eingefügt habe. Bevor das KnnMatch funktioniert.

Ich habe versucht zu überprüfen, ob matcher.getTrainDescriptors(); enthält meine Deskriptoren und effektiv enthält es alles. Um dies zu überprüfen, wenn ich folgendes mache:

cout << matcher->getTrainDescriptors().at(0).size(); // (Get the size of the descriptors Mat associated to the first training image) 

Ich bekomme: [128 x 32]. Dies bedeutet, dass Deskriptoren vorhanden sind, aber die knnMatches geben einen leeren Vektor zurück

Beachten Sie auch, dass, wenn ich .knnMatch mit einem einfachen .match ändern, der Matcher alle DMatches normal zurückgibt! Der Code nicht nur mit knnMatch

- OpenCV: 2.4.5

Antwort

0

Ich denke, das ist Fehler. Ich habe ein einfaches Skript geschrieben, um das zu testen. Bitte, wenn jemand bestätigen möchte, würde es helfen.

Dieses Skript extrahiert zuerst 100 Schlüsselpunkte auf einem Bild und extrahiert dann 1 Schlüsselpunkt. Beide Deskriptorsätze werden im Matcher mit .add gespeichert.

Dann, wenn Sie es ausführen, werden Sie sehen, dass mit .match der Code funktioniert. Mit knnMatch die Matcher tut‘etwas zurück:

Ptr<FeatureDetector> d = new OrbFeatureDetector(); 
Ptr<DescriptorExtractor> e = new OrbDescriptorExtractor(); 
Ptr<DescriptorMatcher> m = new BFMatcher(NORM_HAMMING); 


//> The first iteration will extract 100 keypoints and store them 
//> The second iteration will extract 1 keypoint 
for(int i=100;i>0;i=i-99) { 
    d = new OrbFeatureDetector(i); 
    Mat image = imread("train.png",0); 
    vector<KeyPoint> kp; 
    d->detect(image,kp); 
    cout << "detected: "<<kp.size()<<endl; 

    Mat desc; 
    e->compute(image,kp,desc); 
    cout << "descriptor size: "<<desc.size()<<endl; 

    vector<Mat> addDesc; 
    addDesc.push_back(desc); 
    m->add(addDesc); 

} 

//> Test match and knnMatch 
d = new OrbFeatureDetector(100); 
Mat image = imread("query.png",0); 
vector<KeyPoint> kp; 

d->detect(image,kp); 
Mat queryDesc; 
e->compute(image,kp,queryDesc); 



vector<DMatch> matches; 
m->match(queryDesc,matches); 


cout << "Parsing matches: "<<matches.size()<<endl; 
for(int i=0;i<matches.size();i++) 
    cout << "Matches[i].distance: "<<matches[i].distance<<endl; 


vector<vector<DMatch>> matches2; 
m->knnMatch(queryDesc,matches2,2); 


cout << "Parsing matches: "<<matches2.size()<<endl; 
for(int i=0;i<matches2.size();i++) 
    cout << "matches size: "<<matches2[i].size()<<endl; //> THIS SHOULDN'T OUTPUT size: 0! 

Mit diesem Code, der Aufruf .match wird korrektes Ergebnis. Aber knnMatch schlägt fehl!

+1

Haben Sie Beispiel train.png und query.img (ich weiß, es ist wahrscheinlich egal)? Ich konnte das 0-Ergebnis-Verhalten nicht reproduzieren. – cxyzs7

+0

hast du meinen Code kopiert? – dynamic

+0

@ cxyzs7: Ich habe einen Link in der Frage zu meinen Bildern hinzugefügt – dynamic

Verwandte Themen