Índice
En mi último post Compilar OpenCV 3.2 para Java y usarlo en IntelliJ IDEA Expliqué cómo compilar OpenCV desde el código fuente con soporte para JAVA, sin embargo, La parte no gratuita de OpenCV no se incluye por defecto. Si quieres usar parte de la parte privativa de OpenCV, como los descriptores SIFT o SURF, deberás hacer lo siguiente:
[1]. Descarga OpenCV 3.2, descomprime y crea un directorio donde construirlo
Siguiendo los pasos de mi último post.
[2]. Descarga y descomprime la parte no gratuita
La parte no gratuita la separaron de la gratuita en OpenCV3+, por lo que necesitas descargarla aparte desde el repo github de opencv o clonar el repositorio. Después extrae opencv_contrib y ponla dentro de tu carpeta opencv :
cris@cris ~ $ cp Downloads/opencv-contrib opencv-3.2.0/
[3]. Genera los makefiles
Nos movemos a la carpeta de construcción que creamos antes dentro de la carpeta de opencv (en mi caso se llama build), y escribimos:
cris@cris~$ cmake -DBUILD_SHARED_LIBS=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../dist -DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules ..
Con DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib/modules
estamos especificando donde encontrar la parte no gratuita.
Si la generación de los makefiles ha sido correcta, entonces ya puedes compilar. Si estás compilando openCV para JAVA, debes comprobar que la variable $JAVA_HOME
tiene el path de tu JDK y que esta está visible por procesos hijo. Para ello, cuando hagas: echo $JAVA_HOME
te deberá mostrar el path de tu JDK. Si no, en una terminal, establece el valor de la variable a el path de tu JDK y expórtala, por ejemplo:
cris@cris ~$ export JAVA_HOME=/home/jdk1.8.0_111/
Fíjate cuando estés generando el makefile, que la salida para el campo de Java es así:
Es decir, que hay un path para JNI especificado,y Java wrappers está a YES.
[4]. Construye
ejecuta make para compilar openCV con Java y crear un jar:
cris@cris ~/opencv-3.2.0/build $ make -j8
- donde j8 indica el nivel de paralelismo deseado.
Asegúrate de que los ficheros opencv-320.jar y libopencv_java320.so (.so o .dll) han sido creados dentro de /build.
cris@cris ~/opencv-3.2.0/build $ ls -R | grep opencv-320.jar
opencv-320.jar
opencv-320.jar.dephelper
cris@cris ~/opencv-3.2.0/build $ ls -R | grep libopencv_java320.so
libopencv_java320.so
[5]. Edita el archivo features2d_manual.hpp
Ok, si la construcción ha ido bien, vete a /modules/features2d/misc/java/src/cpp
:
cris@cris ~/opencv-3.2.02 $ cd modules/features2d/misc/java/src/cpp/
y edita features2d_manual.hpp con tu editor de texto favorito, como sigue:
- En la línea 8, tras
#include "features2d_converters.hpp"
añade#include "opencv2/xfeatures2d.hpp"
- En la línea 121, en el método create, dentro de
case SITF
ycase SURF
reemplaza :
//name = name + "SIFT";
por fd=xfeatures2d::SIFT::create();
y //name = name + "SURF";
por fd=xfeatures2d::SURF::create();
- haz lo mismo en la línea 242 para los extractores SIFT y SURF:
case SIFT:
de = xfeatures2d::SIFT::create();
break;
case SURF:
de = xfeatures2d::SURF::create();
break;
[5].Reconstruye para aplicar los cambios
Vete a tu carpeta opencv/build y ejecuta make install
. Cuando finalice, sólo necesitarás incluir los ficheros .so y .jar en tu proyecto de openCV y podrás usar los descriptores SIFT y SURF en tu código.
Referencias:
- SURF and SIFT algorithms doesn’t work in OpenCV 3.0 Java | Stackoverflow
¿Has visto algún error?: Por favor, ayúdame a corregirlo contactando conmigo o comentando abajo.
Quizá también te interese leer...
- Compilar OpenCV 3.2 para Java y usarlo en IntelliJ IDEA
- Qué es un NullPointerException y cómo solucionarlo
- Qué Esta Causando Un NullPointerException en Facebook E Internet y cómo solucionarlo
- Crear Un Navegador GPS Que Dibuje El Camino Seguido en Android
- 5 Razones para estar entusiasmados con Java en el 2013