2014-12-17 19 views
11

Ho OpenCV 3.0, e ho compilato & installato con il modulo opencv_contrib in modo che non sia un problema. Sfortunatamente gli esempi delle versioni precedenti non funzionano con quello attuale, e quindi anche se questa domanda ha already been askedmore than once vorrei un esempio più attuale con cui posso effettivamente lavorare. Anche lo official examples non funziona in questa versione (il rilevamento delle funzioni funziona ma non altri esempi di funzionalità) e comunque usano SURF.Come utilizzare SIFT in OpenCV 3.0 con C++?

Quindi, come utilizzare OpenCV SIFT su C++? Voglio afferrare i punti chiave in due immagini e abbinarli, in modo simile allo this example, ma anche solo ottenere i punti e i descrittori sarebbe sufficiente. Aiuto!

risposta

37
  1. otteniate opencv_contrib repo
  2. prendere il vostro tempo con il readme lì, aggiungerlo alla tua impostazioni principali cmake OpenCV
  3. replica CMake/fare/install nella repo OpenCV principale

quindi:

#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); 

Inoltre, non dimenticare di collegare opencv_xfea tures2d!

+0

Nella documentazione detect e compute appare solo come funzioni python. La documentazione è incompleta? La classe SIFT è meglio documentata ovunque? Ed è SIFT :: operator() inutilizzabile o sto facendo qualcosa di orribilmente sbagliato? Modifica: la funzione di creazione (...) non è da nessuna parte che ho visto nella documentazione online ... Suppongo che sto cercando in tutti i posti sbagliati o che dovrò fare a meno di dox. –

+0

^^ forse la modifica aiuta? L'operatore – berak

+0

() è ancora lì, ma usando quello da un puntatore, lo renderebbe simile a f2d-> operator (...). meglio usare: f2d-> detectAndCompute (...) quindi. (e sì, i documenti * necessitano * di una correzione urgente ...) – berak