La funzione OpenCV SURF non è implementata

Quando provo a eseguire l’esempio find_obj.cpp o qualsiasi programma find_obj.cpp SURF, ottengo il seguente errore nel prompt dei comandi durante l’esecuzione del codice. Il progetto si costruisce senza errori e avvisi. Sto usando VS2011 beta, OpenCV 2.4 e Windows7.

Messaggio di errore:

 OpenCV Error: The function/feature is not implemented  in unknown function,file ..\..\..\src\opencv\modules\legacy\src\features2d.cpp, line 77 

Ho provato a build nuovamente OpenCV 2.4 usando Cmake e poi VS2011 in modalità debug e poi ho aggiunto i percorsi lib nell’IDE, ma ancora nessun risultato.

Come posso ripararlo?

  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  using namespace std; using namespace cv; int main() { cv::initModule_nonfree();//THIS LINE IS IMPORTANT IplImage *image1 = cvLoadImage("C:\\SURF\\1.jpg"); IplImage *image2 = cvLoadImage("C:\\SURF\\2.jpg"); CvMemStorage* memoryBlock = cvCreateMemStorage(); CvSeq* image1KeyPoints; CvSeq* image1Descriptors; CvSeq* image2KeyPoints; CvSeq* image2Descriptors; // Only values with a hessian greater than 500 are considered for keypoints CvSURFParams params = cvSURFParams(500, 1); cvExtractSURF(image1, 0, &image1KeyPoints, &image1Descriptors, memoryBlock, params); cvExtractSURF(image2, 0, &image2KeyPoints, &image2Descriptors, memoryBlock, params); return 0; } 

Tratto da questa risposta (perché non fai la domanda a Google prima di chiedere?):

Il codice SIFT e SURF è stato spostato in OpenCV v2.4 in un nuovo modulo chiamato nonfree . Assicurati di colbind (DLL in Windlows) ad esso. In linux questa libreria è chiamata libopencv_nonfree.so .

Non è un bug. SURF si trova nel modulo non libero. Per usarlo devi inizializzare il modulo non libero:

  #include  ... cv::initModule_nonfree(); 

Recentemente, sto imparando il SURF. Per questa domanda è ansible aggiungere opencv_nonfree240d.lib e opencv_nonfree240.lib al percorso lib del progetto.

Per ubuntu lo script su https://help.ubuntu.com/community/OpenCV può essere modificato per l’uso non libero di surf / setaccia aggiungendo

libopencv_nonfree

alla fine del comando sudo apt-get, e

-D BUILD_opencv_nonfree = ON

alla fine del comando cmake. Ha funzionato solo per me dopo aver disinstallato tutto ciò che riuscivo a trovare che riguardava opencv dal centro software. Per inciso, il software center disponeva anche di una libreria non libera opencv, “libopencv-nonfree2.4” che non sembrava essere d’aiuto. Non sono un esperto in questo genere quindi non so se quello che ho fatto sia corretto al 100%, ma consente comandi come

surf = cv2.SURF (400)

e

keypoints = surfDetector.detect (im)

per eseguire ciò che non aveva precedentemente (il primo ha causato un errore di tipo “non trovato” mentre il secondo ha causato un segfault).

La versione di opencv.sh che mi ha permesso di usare il surf / sift non libero incollato su http://pastebin.com/sQzDdx5i
La versione che sta funzionando ora è opencv-2.4.9 ma probabilmente questo funzionerebbe per altre versioni in quanto lo script sembra essere in qualche modo agnostico come i nomi di lib.