2016-04-18 11 views
1

bearbeiten: Ich habe das falsche OpenCV2-Code Beispiel gesucht, es gibt keine FeatureDetector::create in OpenCV3 - das hat mich verwirrt.OpenCV 3: Liste der verfügbaren FeatureDetector :: create() und DescriptorExtractor :: create() Optionen?


Hey neu zu OpenCV und mit gutem Beispiel das Lernen von anderen Völkern C++ Code auseinanderziehen.

würde Ich mag alle verfügbaren Optionen versuchen:

detector = FeatureDetector::create(str_detector); 
descriptor = DescriptorExtractor::create(str_descriptor); 

derzeit str_detector ist FAST und str_descriptor ist BRISK

ich Mühe, mich zu finden, was verfügbaren Detektoren und Beschreiber mir zur Verfügung stehen.

Gibt es eine Möglichkeit, eine Liste aller derzeit verfügbaren Optionen auszugeben?

(ich habe gebaut gerade die neueste opencv + opencv-contrib von Github auf einem frischen Linux installieren)

ich eine Liste von 3rd-Party-Dateien hier https://github.com/Itseez/opencv_contrib/tree/master/modules/xfeatures2d/src gefunden haben - ich denke, diese dritte Descriptors und Detektoren sind, weil diejenigen, In einigen Dateien werden Wörter erwähnt. Es wäre jedoch nett, eine vollständige Liste der aktuell kompilierten/verfügbaren Optionen zum Spielen zu haben.

Danke!


versuchen, die Antwort selbst zu finden, Bearbeitungen, wie ich gehen:

  1. Gefunden typedef Feature2D FeatureDetector und typedef Feature2D DescriptorExtractor in modules/features2d/include/opencv2/features2d.hpp
  2. jetzt Feature2D Graben ...
  3. ich so verwirrt bin, meine C++ mir versagt, gibt es keine create in https://github.com/Itseez/opencv/blob/master/modules/features2d/src/feature2d.cpp
  4. ok so nur durch den Code suchen (https://github.com/Itseez/opencv/blob/master/modules/features2d/include/opencv2/features2d.hpp)
    • BRISK
    • ORB
    • MSER
    • FastFeatureDetector/FAST
    • AgastFeatureDetector/AGAST
    • G FTTDetector
    • SimpleBlobDetector
    • KAZE/AKAZE
  5. und vom Contrib Code (https://github.com/Itseez/opencv_contrib/blob/master/modules/xfeatures2d/include/opencv2/xfeatures2d.hpp)
    • UNGEWÖHNLICHER
    • StarDetector
    • BriefDescriptorExtractor
    • LUCID
    • LATCH
    • DAISY
    • MSDDetector
  6. und von unfreie contrib Code (https://github.com/Itseez/opencv_contrib/blob/master/modules/xfeatures2d/include/opencv2/xfeatures2d/nonfree.hpp)
    • SIFT
    • SURF
  7. Noch unsicher, welche der oben kann/soll verwendet werden für FeatureDetector oder DescriptorExtractor

Antwort

6

Sie haben auch die OpenCV-Dokumentation eine Liste von OpenCV Funktionen haben:

Was ich wissen, ob die Funktion nur in keypoints Erkennung oder Descriptor verfügbar ist Extraktion oder beides soll das entsprechende in der Dokumentation verlinkte Papier lesen. Es ermöglicht auch eine kurze Beschreibung der Funktionen (zum Beispiel, wenn es ein binärer Beschreiber, Hauptvorteil ist, etc.)

Andere Lösung ist es, jede Funktion zu testen:

  • wenn der Anruf an detect() ok ist (keine Ausnahme ausgelöst) ==> Feature-Erkennung
  • wenn der Anruf an compute() ok ist ==> Merkmalsextraktion
  • wenn der Anruf an detectAndCompute() ok ist ==> beide
  • oder direkt in die Quelle suchen Code.

Vielleicht eine optimalere Lösung existiert ...

Wie auch immer, von meinem Wissen (fühlen Sie sich frei, mich zu korrigieren, wenn ich falsch bin):

  • BRISK: Detektor + Descriptor
  • ORB: Detektor + Deskriptor
  • MSER: Detektor
  • FAST: Detektor
  • AGAST: Detektor
  • GFFT: Detektor
  • SimpleBlobDetector: Detektor
  • KAZE: Detektor + Deskriptor
  • AKAZE: Detektor + Deskriptor
  • FREAK: Deskriptors
  • StarDetector: Detektor
  • BriefDescriptorExtractor: Deskriptors
  • LUCID: Deskriptor
  • LATCH: Deskriptor
  • DAISY: Descriptor
  • MSDDetector: Detektor
  • SIFT: Detektor + Descriptor
  • SURF: Detektor + Descriptor

Auch mit OpenCV 3.1, ist der Code:

cv::Ptr<cv::Feature2D> kaze = cv::KAZE::create(); 
std::vector<cv::KeyPoint> kpts; 
cv::Mat descriptors; 
kaze->detect(matImg, kpts); 
kaze->compute(matImg, kpts, descriptors); 
kaze->detectAndCompute(matImg, cv::noArray(), kpts, descriptors); 

cv::Ptr<cv::Feature2D> daisy = cv::xfeatures2d::DAISY::create(); //Contrib 

Um zu wissen, welcher Normtyp zu verwenden ist:

Schließlich

, warum

No more features2d::create?

+0

Vielen Dank für das Teilen dieses Wissen! :) Ich habe gerade festgestellt, dass es eine '#if CV_MAJOR_VERSION> 2' in diesem Code gibt, und es verwendet den neueren' detector = cv :: FastFeatureDetector :: create(); 'anstelle des alten' detector = FeatureDetector: : create (str_detector); '. Das macht viel mehr Sinn und stimmt mit der Dokumentation/dem Quellcode überein. Prost – dtbaker