2012-06-24 8 views
9

Lorsque j'essaie d'exécuter l'exemple find_obj.cpp ou un programme OpenCV SURF, l'erreur suivante apparaît dans l'invite de commande lors de l'exécution du code. Le projet se construit sans erreurs et avertissements. J'utilise VS2011 beta, OpenCV 2.4 et windows7.La fonction OpenCV SURF n'est pas implémentée

Message d'erreur:

OpenCV Error: The function/feature is not implemented < OpenCV was built without SURF support> in unknown function,file ..\..\..\src\opencv\modules\legacy\src\features2d.cpp, line 77 

j'ai essayé de construire le OpenCV 2.4 à nouveau en utilisant Cmake puis VS2011 en mode débogage, puis ajouté les chemins lib dans l'IDE, mais toujours pas de résultat.

Comment puis-je résoudre ce problème?

#include <opencv2/objdetect/objdetect.hpp> 
    #include <opencv2/features2d/features2d.hpp> 
    #include <opencv2/core/core.hpp> 
    #include <opencv2/highgui/highgui.hpp> 
    #include <opencv2/legacy/legacy.hpp> 
    #include <opencv2/legacy/compat.hpp> 
    #include <opencv2/flann/flann.hpp> 
    #include <opencv2/calib3d/calib3d.hpp> 
    #include <opencv2/nonfree/features2d.hpp> 
    #include <opencv2/nonfree/nonfree.hpp> 

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; 
} 

Répondre

10

Extrait de this answer (pourquoi ne pas Google votre question avant de demander?):

Le code EIPD et SURF a été déplacé dans OpenCV v2.4 à un nouveau module appelé nonfree. Assurez-vous que vous liez (DLL dans Windlows) à elle. En linux cette bibliothèque s'appelle libopencv_nonfree.so.

+2

ya j'ai googlé les forums d'opencv et j'ai inclus l'opencv_nonfree240.lib ..et les en-têtes sont 1 ...... opencv2/objdetect/objdetect.hpp ....... 2 ..... .opencv2/features2d/features2d.hpp ..... 3 ......opencv2/highgui/highgui.hpp ...... 4 ...... opencv2/calib3d/calib3d.hpp ..... 5 ...... opencv2/nonfree/nonfree.hpp .. .... 6 ...... opencv2/imgproc/imgproc_c.h ....... 7 ...... opencv2/legacy/legacy.hpp ...... 8. ..... opencv2/héritage/compat.hpp ...... –

+0

@Astor .... dans l'IDE ... i définir le chemin vers le répertoire C: \ OpenCV2.4 \ OpenCV \ build \ x86 \ vc10 \ lib ... j'ai sauvegardé l'opencv2.4 dans le lecteur c ... le dossier bin contient toute la DLL où j'ai vérifié qu'il contient l'opencv_nonfree240.dll ... et dans les dépendances supplémentaires j'ai donné l'opencv_nonfree240. lib –

+0

répertoires bibliothèque = C: \ OpenCV2.4 \ OpenCV \ build \ x86 \ VC10 \ lib dépendances supplémentaires = opencv_nonfree240.lib ceci est mon réglage dans VS2011 –

3

Récemment, j'apprends le SURF. Pour cette question, vous pouvez ajouter opencv_nonfree240d.lib et opencv_nonfree240.lib au chemin lib de votre projet.

8

Ce n'est pas un bug. SURF est situé dans un module non libre. Pour l'utiliser, vous devez initialiser le module nonfree:

#include <opencv2/nonfree/nonfree.hpp> 
    ... 
    cv::initModule_nonfree(); 
0

Pour ubuntu le script à https://help.ubuntu.com/community/OpenCV peut être modifié pour le surf nonfree/tamiser utilisation en ajoutant

libopencv_nonfree

à la fin de la sudo commande apt-get, et

-D BUILD_opencv_nonfree = ON

à la fin de la commande cmake. Cela n'a fonctionné que pour moi après avoir désinstallé tout ce que je pouvais trouver en traitant avec opencv du centre de logiciel. Incidemment, le centre de logiciel avait également une bibliothèque opencv non libre, "libopencv-nonfree2.4" qui n'a pas semblé aider les choses. Je ne suis pas un expert dans ce genre de choses alors je ne sais pas si ce que je faisais est 100% à droite, mais il permet des commandes telles que

de surf = cv2.SURF (400)

et

keypoints = surfDetector.detect (im)

pour exécuter ce qui n'avait pas précédemment (le premier a provoqué une erreur de type «introuvable» alors que le second a provoqué une erreur de segmentation).

La version de opencv.sh qui m'a permis d'utiliser surfer nonfree/Tamiser collé à http://pastebin.com/sQzDdx5i
La version qui fonctionne est maintenant OpenCV-2.4.9 mais peut-être cela fonctionnerait pour les autres versions que le script semble être quelque peu agnostique comme le font les noms de bibliothèques.

Questions connexes