OpenCV 2.4.3rc y CUDA 4.2: “Error de OpenCV: sin compatibilidad con GPU”

He subido varias capturas de pantalla en este álbum: http://imgur.com/a/w4jHc

Estoy tratando de ejecutar GPU en OpenCV en Visual Studio 2008. Estoy ejecutando uno de los códigos de ejemplo de la GPU de OpenCV, bgfg_segm.cpp. Sin embargo, cuando compilo (sin errores de comstackción) arroja un “Error de OpenCV: No soporte GPU”.

  • Windows 7, 32 bits
  • Visual Studio 2008
  • nVidia Quadro 1000M con el controlador versión 301.27
  • OpenCV 2.4.3rc (utilizando las librerías comstackdas previamente incluidas)
  • CUDA Toolkit 4.2, CUDA SDK.

Puedo ejecutar los archivos .exe en C: \ ProgramData \ NVIDIA Corporation \ NVIDIA GPU Computing SDK 4.2 \ C \ bin \ win32 \ Release sin ningún error, por lo que parece que CUDA está funcionando.

Realmente espero que puedas ayudar porque siento que me estoy perdiendo algo obvio aquí. Cualquier pensamiento o sugerencia es muy apreciada.

EDICIÓN 9 de noviembre de 2012:

Terminé siguiendo las instrucciones de sgar91 y parece que las cosas están funcionando ahora.

Una nota al margen: cuando ingrese Environment Variables revise las rutas para CUDA. Uno de los míos tenía una barra diagonal inversa ( \ ) demasiada antes del bin como esta C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\\bin; . Hay tres referencias a CUDA y su SDK, así que compruébalo. Tal vez fue solo un golpe de suerte de una sola vez. No estoy seguro de que esto importe en absoluto.

Una nota más: instalé Visual Studio 2010 Express y observé que las instrucciones de sgar91 están pensadas para Visual Studio 2010 (también conocido como “vc10”). No funcionará en Visual Studio 2008 (también conocido como “vc9”) o Visual Studio 2012 (también conocido como “vc11”), ya que no hay archivos lib creados previamente con OpenCV 2.4.3 para vc9 y vc11 (solo vc10). Además, tenga en cuenta que si está en Windows de 64 bits, debe cambiar todas las rutas X86 (32 bits) a X64 (64 bits) en su lugar cuando siga su guía, y en Visual Studio debe cambiar la Plataforma de soluciones de Win32. (menú desplegable en la parte superior, centro junto a Depurar o Liberar) a x64.

Sin embargo, una nota adicional: OpenCV 2.4.3 es compatible con CUDA 4.2 (o mejor dicho, las librerías se han comstackdo con CUDA 4.2). Si instala CUDA 5.0, no funcionará. Lanza un mensaje de error. No recuerdo cual. Si necesita absolutamente CUDA 5.0, debe esperar que OpenCV lo incluya en futuras versiones o comstackr sus propias librerías mediante CMake.

Ejecuté el código a continuación (es de aquí , pero tuve que corregir una línea para hacerlo comstackr) y compiló y mostró la imagen, así que supongo que esto significa que las cosas están funcionando.

 #ifdef _DEBUG #pragma comment(lib,"opencv_gpu243d") #pragma comment(lib,"opencv_core243d") #pragma comment(lib,"opencv_highgui243d") #else #pragma comment(lib,"opencv_core243") #pragma comment(lib,"opencv_highgui243") #pragma comment(lib,"opencv_gpu243") #endif #include  #include "opencv2/opencv.hpp" #include "opencv2/gpu/gpu.hpp" int main (int argc, char* argv[]) { try { cv::Mat src_host = cv::imread("file.png", CV_LOAD_IMAGE_GRAYSCALE); cv::gpu::GpuMat dst, src; src.upload(src_host); cv::gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY); cv::Mat result_host(dst); //cv::Mat result_host = dst; //old line commented out cv::imshow("Result", result_host); //new line added by me cv::waitKey(); } catch(const cv::Exception& ex) { std::cout << "Error: " << ex.what() << std::endl; } return 0; } 

No puedo obtener ningún código en C: \ opencv \ samples \ gpu para que funcione. Se comstack, pero luego arroja un error. Pero a la mierda, lo resolveré de alguna manera 🙂

Está utilizando esos binarios de OpenCV que se comstackn sin soporte de GPU.

C:\opencv\build\x86\... tienen soporte de GPU.

Tienes que usar los archivos binarios y lib que están presentes en la carpeta build\gpu .

C:\opencv\build\gpu\x86\... con soporte para GPU.

ACTUALIZAR:

Procedimiento:

En Visual Studio 2010, vaya a las propiedades del proyecto. En los directorios de VC ++, verá la siguiente página:

Agregue la ruta de acceso de la carpeta de include de OpenCV en el cuadro de texto Incluir directorios . Asegúrese de que las rutas múltiples estén separadas por un punto y coma y que no haya espacio en ninguna de la ruta.

De forma similar, agregue la ruta de las carpetas de lib de OpenCV tanto para la GPU como para las versiones que no sean GPU en el cuadro de texto Directorios de bibliotecas . (No olvides el punto y coma)

Importante: Al escribir las rutas en el cuadro, primero escriba la ruta de la GPU y luego la ruta No GPU.

enter image description here

El siguiente paso es agregar la ruta de la carpeta bin de OpenCV. Pero no en Visual Studio, sino en la variable de entorno de Path como se muestra a continuación:

enter image description here

  • Haz clic derecho en My Computer
  • Ir a propiedades
  • Ir a Environment Variables sección Environment Variables
  • Edite la Path variable del sistema
  • Añada C:\OpenCV\build\gpu\x86\vc10\bin y C:\OpenCV\build\x86\vc10\bin a la ruta de C:\OpenCV\build\x86\vc10\bin . No te olvides de separar los diferentes valores con punto y coma. También —> GPU viene primero .
  • Guardar y Salir.

Reinicie Visual Studio. Las directivas linker y #include ahora reconocerán las bibliotecas OpenCV. Como también hemos agregado la ruta de acceso de las bibliotecas de GPU, la compatibilidad completa de GPU estará disponible en OpenCV.

Para utilizar la funcionalidad de GPU de OpenCV, solo tienes que hacer lo siguiente:

  • #include opencv2/gpu/gpu.hpp
  • Especifique opencv_gpu243d.lib para la configuración de depuración o opencv_gpu243.lib para la configuración de la versión en el campo de dependencias adicionales en la sección Linker->Input de las propiedades del proyecto.

Alguna información adicional:

En Visual Studio, existe una manera fácil de vincular bibliotecas en lugar de especificarlas en las propiedades del proyecto.

Simplemente escriba estas líneas al principio de su código:

 #ifdef _DEBUG #pragma comment(lib,"opencv_core243d") #pragma comment(lib,"opencv_highgui243d") #else #pragma comment(lib,"opencv_core243") #pragma comment(lib,"opencv_highgui243") #endif