2012-06-24 27 views
9

Cuando intento ejecutar la muestra find_obj.cpp o cualquier programa OpenCV SURF, aparece el siguiente error en el símbolo del sistema al ejecutar el código. El proyecto se construye sin errores y advertencias. Estoy usando VS2011 beta, OpenCV 2.4 y Windows7.La función OpenCV SURF no está implementada

mensaje de error:

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 

me trató de construir el OpenCV 2.4 utilizando de nuevo Cmake y luego VS2011 en modo de depuración y luego agregó los caminos lib en el IDE, pero todavía no hay resultado.

¿Cómo puedo solucionar eso?

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

Respuesta

10

Tomado de this answer (¿por qué no Google su pregunta antes de preguntar?):

El código SIFT y SURF fue trasladado en OpenCV v2.4 a un nuevo módulo llamado nonfree. Asegúrese de estar enlazando (DLL en Windlows) con él. En Linux esta biblioteca se llama libopencv_nonfree.so.

+2

ya i googled los foros OpenCV e incluí la opencv_nonfree240.lib ..y las cabeceras son 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/legacy/compat.hpp ...... –

+0

@Astor .... en el IDE ... configuré el camino a C: \ OpenCV2.4 \ opencv \ build \ x86 \ vc10 \ lib ... he guardado el archivo opencv2.4 en la unidad c ... la carpeta bin contiene todos los dll en los que he comprobado que contiene el archivo opencv_nonfree240.dll ... y en las dependencias adicionales que he proporcionado a opencv_nonfree240. lib –

+0

library directories = C: \ OpenCV2.4 \ opencv \ build \ x86 \ vc10 \ lib dependencias adicionales = opencv_nonfree240.lib esta es mi configuración en VS2011 –

3

Recientemente, estoy aprendiendo el SURF. Para esta pregunta, puede agregar opencv_nonfree240d.lib y opencv_nonfree240.lib a la ruta de acceso lib de su proyecto.

8

No es un error. SURF está ubicado en un módulo no libre. Para usarlo se debe inicializar el módulo no libre:

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

para Ubuntu el guión en https://help.ubuntu.com/community/OpenCV puede ser modificado por el surf no libre/tamizar uso mediante la adición de

libopencv_nonfree

hasta el final de la sudo apt-get comando y

-D BUILD_opencv_nonfree = ON

hasta el final del comando cmake. Solo funcionó para mí después de desinstalar todo lo que pude encontrar tratando con opencv desde el centro de software. Por cierto, el centro de software también tenía una biblioteca opencv nonfree, "libopencv-nonfree2.4", que no parecía ser de ayuda. no soy un experto en esas cosas, así que no sé si lo que hice es 100% correcto, pero permite que los comandos tales como

de surf = cv2.SURF (400)

y

puntos clave = surfDetector.detect (im)

para ejecutar which hadnt previamente (el primero causaba un error de tipo 'no encontrado' mientras que el segundo causaba una segfault).

La versión de opencv.sh la que me permitió utilizar la resaca no libre/tamizar pegado a http://pastebin.com/sQzDdx5i
La versión que está trabajando ahora es OpenCV-2.4.9 pero posiblemente esto funcionaría para otras versiones como el guión parece ser algo agnóstico como lo hacen los nombres de lib.

Cuestiones relacionadas