Java/processing con OpenCV en 64bits

Según la wikipedia “OpenCV es una biblioteca libre de visión artificial originalmente desarrollada por Intel. Desde que apareció su primera versión alfa en el mes de enero de 1999, se ha utilizado en infinidad de aplicaciones. Desde sistemas de seguridad con detección de movimiento, hasta aplicativos de control de procesos donde se requiere reconocimiento de objetos. Esto se debe a que su publicación se da bajo licencia BSD, que permite que sea usada libremente para propósitos comerciales y de investigación con las condiciones en ella expresadas”.

Y gracias a Stephane Cousot y Douglas Edric Stanley contamos con la implementación de OpenCV para processing y/o java.

INSTALACIÓN

Para instalarla tenemos que en primer lugar instalar opencv, lo bueno es que figura en la mayoría de respositorios así que bastaría usar el administrador de paquetes para instalarlo.
aptitude install opencv
urpmi opencv
pacman -S opencv
emerge opencv
....

dependiendo del sistema en el que estes.

Esto debiera instalar las librerías y cabeceras necesarias en las carpetas del sistema /usr/include y /usr/lib. Como estas ubicaciones ya hacen parte del PATH no vanos a tener los problemas que normalmente se presentan en windows. Al parecer en ubuntu algunas librerías se instalan por aparte, por si acaso esta es la lista de librerías que deberías tener instalada:
/usr/lib/libml.so
/usr/lib/libhighgui.so
/usr/lib/libcxcore.so
/usr/lib/libcvaux.so
/usr/lib/libcv.so
Si no es así seguramente es un paquete separado así que por medio del administrador de paquetes lo puedes buscar e instalar.

Ahora descargamos la librería para processing al momento la 01, aconsejable también los ejemplos para java y/o processing.

El procedimiento es el mismo que cualquier librería, descomprimimos el paquete y copiamos la carpeta dentro de processing-1.0.9/libraries/ y listo.

A este momento si tenemos un dispositivo v4l conectado y configurado correctamente (osea funcionando), debería estar funcionando los ejemplos de la librería, y ya se podría trabajar en ella. Pero los que usamos distribuciones de 64 bits encontraremos un problema como es ya habitual.

AMD64

Si corres algún ejemplo de opencv en processing sobre 64bits puedes encontrar un error del tipo:

!!! required library not found : /usr/lib/libOpenCV.so: /usr/lib/libOpenCV.so: wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch)

Si has visto mis post anteriores ya sabrás cual es el problema, tenemos que encontrar un libOpenCV.so compilado para 64bits, pero esta vez la solución fué un poco más “elaborada”, ya que este paquete no existe en los repositorios, fué un paquete compilado especialmente para la implementación de OpenCv en Processing.

Tendremos entonces que compilarlo de las fuentes que se incluyen en el paquete de lka librería que descargamos. Para una solución más sencilla subí el archivo compilado a mi servidor, así que lo pueden descargar de aquí: libOpenCV.so y reemplazar el existente en processing-1.0.9/libraries/OpenCV/library. Con esto queda solucionado y podrás utilizar opencv en 64bits sin problema.

Si quieres compilarlo estos son los pasos que yo seguí, para evitar compilar las clases, lo que hize fué extraer del archivo processing-1.0.9/libraries/OpenCV/library/OpenCV.jar los archivos Bob.class y OpenCV.class, con cualquier gestor de compresión de archivos lo puedes hacer, y los copié en processing-1.0.9/libraries/OpenCV/source/java/hypermedia/video luego desde consola

cd processing-1.0.9/libraries/OpenCV/source/java
javah -jni hypermedia.video.OpenCV

esto nos genera un fichero cabecera hypermedia_video_OpenCV.h, lo movemos a processing-1.0.9/libraries/OpenCV/source/cpp y compilamos la libreria libOpenCV.so
mv ./hypermedia_video_OpenCV.h processing-1.0.9/libraries/OpenCV/source/cpp
cd processing-1.0.9/libraries/OpenCV/source/cpp
g++ -shared OpenCV.cpp -o libOpenCV.so -I/usr/include/opencv/ -I/usr/lib/jvm/java-1.6.0-openjdk/include/ -lcv -lhighgui -fPIC

esto nos genera la librería libOpenCV.so que podemos copiar a processing-1.0.9/libraries/OpenCV/library reemplazando la anterior, y listo!! OpenCV funcionando.

13 thoughts on “Java/processing con OpenCV en 64bits

  1. Hola que tal excelente post, solo una duda, lo anterior funciona tanto para OpenCV 1.0 como OpenCV 2.0, de antemano muchas gracias saludos

  2. la verdad no sé decirte si funciona con la 1.0, yo instalé la 2.0.0, pero supongo que si, ya que la librería funciona en windows con openCV 1.0.

  3. Gabriel on

    Que tal Sergio, te agradezco por escribir tan detalladamente los pasos para hacer funcionar opencv con processing en 64 bits.
    Intente ambos métodos: bajar la libreria compilada, y compilarla yo (al compilarla yo me da unos errores con el jni.h y no supe que más hacer). Bajando la libreria libOpenCV.so y correr cualquier cosa que use opencv me dice:
    wrong ELF class: ELFCLASS64 (Possible cause: architecture word width mismatch)

    Lo que me deja perplejo porque mi maquina deberia ejecutar ELFCLASS64… alguna idea?

    Gracias de antemano!

  4. Hola Gabriel,
    Debe ser que tienes el java que incluye processing, el cual es de 32 bits. Debes instalar un jdk y linkearlo para reemplazar el java de processing.
    Fijate el post anterior http://www.gnu-media.org/?p=49
    Es el mismo error que inicialmente genera GSVideo, en ese post explico como solucionarlo y solucionar el problema derivado que se presenta con opengl a partir de esto.

  5. Gabriel on

    Muchísimas gracias Sergio! Seguí tu consejo de reemplazar processing-1.0.9/java con un link al openjdk y todo funciona de maravilla :)
    Gracias!

  6. Hola que tal Sergio, sigo con los problemas, he logrado cargarlo en Linux, sin embargo para mi es necesario que corra tambien en windows, pero al tratar de adquirir una imagen desde la web cam no es posible, me prende el foco de la camara y como si la tomase pero no sale nada,, Tendras alguna idea de que sera??? de antemano Gracias

  7. No Julio, la verdad no lo he probado en windows, aunque mi intención es similar a la tuya y es poder contar con programas multiplataforma.
    Pero nadie en la casa usa windows, así que me toca probar después en la universidad sobre windows xp, y mac 10.5.
    Tan pronto lo haga comentaré los resultados.

  8. Miguel on

    Por favor como, de donde consigo OpenCV para winXp de 64 bits…slds

  9. La verdad no se decirte, en windows siempre he manejado 32bits, precisamente por problemas de compatibilidad, incluso en windows 7.

  10. Miguel on

    Por favor, como instalo OpenCV en plataforma de 64bits pero en WINXP…..Gracias por la rpta.

  11. guaso69 on

    me da el error “unsatisfiedlinkerror: hypermedia.video.opencv,capture(III)V”, en el ejemplo del face_detection en la linea de codigo : ” opencv.capture( width, height );”…….. no se q puede ser …

  12. Marisol on

    Hola, tengo un problema. Estoy intentando usar la librería OpenCV en java (utilizo JCreator y tengo puesto el jdk1.6.0_22). Mi duda está en que no sé dónde tengo que añadir OpenCV para poder usar sus funciones. He copiado la carpeta de OpenCV dentro de jdk1.6.0_22>>lib, pero nada. No sé si no lo estoy haciendo bien, si me he dejado algo por instalar. ¿Alguien me puede ayudar? Gracias.

  13. no conozco jCreator, pero supongo que es lo mismo que para eclipse, y la cosa sería primero tener instalado OpenCV, segundo bajar la librería para java/processing http://ubaa.net/shared/processing/opencv/ y para el caso de java también hay que descargar processing porque hay que importar el core, entonces descárgalo de http://processing.org. Por úlimo importa/incluye todas las librerías (opencv y processing.core) al path en tu proyecto en JCreator.

Leave a Reply