2014-12-17 5 views
11

Ich habe OpenCV 3.0, und ich habe kompiliert & installiert es mit dem opencv_contrib-Modul, so dass kein Problem ist. Leider funktionieren die Beispiele aus früheren Versionen nicht mit dem aktuellen, und obwohl diese Frage already been askedmore than once hat, möchte ich ein aktuelleres Beispiel, mit dem ich tatsächlich arbeiten kann. Selbst die official examples funktionieren nicht in dieser Version (Funktionserkennung funktioniert, aber keine anderen Feature-Beispiele) und sie verwenden SURF trotzdem.Wie verwende ich SIFT in OpenCV 3.0 mit C++?

Also, wie verwende ich OpenCV SIFT auf C++? Ich möchte die Schlüsselpunkte in zwei Bildern packen und sie vergleichen, ähnlich wie this example, aber auch nur die Punkte und Deskriptoren zu bekommen, wäre genug Hilfe. Hilfe!

Antwort

37
  1. erhalten die opencv_contrib repo
  2. es Ihre Zeit mit der Readme nehmen, fügen Sie sie Haupt opencv Cmake Einstellungen
  3. Rerun cmake/Marke/install im Haupt opencv Repo

dann:

#include "opencv2/xfeatures2d.hpp" 

    // 
    // now, you can no more create an instance on the 'stack', like in the tutorial 
    // (yea, noticed for a fix/pr). 
    // you will have to use cv::Ptr all the way down: 
    // 
    cv::Ptr<Feature2D> f2d = xfeatures2d::SIFT::create(); 
    //cv::Ptr<Feature2D> f2d = xfeatures2d::SURF::create(); 
    //cv::Ptr<Feature2D> f2d = ORB::create(); 
    // you get the picture, i hope.. 

    //-- Step 1: Detect the keypoints: 
    std::vector<KeyPoint> keypoints_1, keypoints_2;  
    f2d->detect(img_1, keypoints_1); 
    f2d->detect(img_2, keypoints_2); 

    //-- Step 2: Calculate descriptors (feature vectors)  
    Mat descriptors_1, descriptors_2;  
    f2d->compute(img_1, keypoints_1, descriptors_1); 
    f2d->compute(img_2, keypoints_2, descriptors_2); 

    //-- Step 3: Matching descriptor vectors using BFMatcher : 
    BFMatcher matcher; 
    std::vector<DMatch> matches; 
    matcher.match(descriptors_1, descriptors_2, matches); 

auch, vergessen Sie nicht, opencv_xfea zu verknüpfen tures2d!

+0

In der Dokumentation erkennen und berechnen erscheint nur als Python-Funktionen. Ist die Dokumentation unvollständig? Ist die SIFT-Klasse überall besser dokumentiert? Und ist der SIFT :: operator() unbrauchbar oder mache ich gerade etwas fürchterlich falsch? Edit: Die create (...) Funktion ist nirgends, wo ich in der Online Dokumentation nachgeschaut habe ... ich schätze ich schaue entweder an den falschen Stellen oder ich werde einfach auf die verzichten müssen Dox. –

+0

^^ vielleicht hilft der Schnitt? – berak

+0

operator() ist immer noch da, aber die Verwendung von einem Zeiger würde es so etwas wie f2d-> operator (...) machen. besser verwenden: f2d-> detectAndCompute (...) dann. (Und ja, die Docs * brauchen * dringend eine Reparatur ...) – berak