Índice
Si quieres compilar OpenCV 3.2 por ti mismo con soporte para Java, esto te ayudará. También te ayudará si, compilado OpenCV, quisieras saber como usarlo en IntelliJ IDEA. ¡Empecemos!
Para compilar OpenCV 3.2 con soporte para Java debes comprobar que tienes instalado en tu sistema lo siguiente:
Prerequisitos
- Java JDK 7+: necesitamos un JDK para construir el Java binding, así que si no lo tienes instalado puedes hacerlo desde oracle web page. Puedes comprobar tu versión de JDK ejecutando:
java -version
en un terminal. - Apache Ant: teclea
ant -version
para comprobar que tienes Apache Ant instalado. Si no lo tienes, instálalo tecleandosudo apt-get install ant
. - Python 2.6+: teclea
python --version
en la terminal para comprobar si tienes python instalado y en que versión.
1. Descarga OpenCV 3.2
Ve a opencv documentation y descarga la última versión estable para Linux/Mac.
2. Descomprime donde quieras instalar y crea un directorio en el que construir
Extrae el contenido de la carpeta opencv-3.2.0 donde quieras posicionarlo. Después, navega dentro de ese directorio y crea una carpeta vacía build, donde se guardarán los resultados de la compilación:
cris@cris ~ $ cd opencv-3.2.0/
cris@cris ~ $ mkdir build
3. Exporta la variable JAVA_HOME y genera el makefile
Debes comprobar que la variable $JAVA_HOME contiene el path a tu JDK y que sea visible a otros procesos. Tecleando: echo $JAVA_HOME
debe mostrarse el path de tu JDK. Si no, en una terminalmodifica el valor de la variable al path del JDK y expórtala. Por ejemplo:
cris@cris ~$ export JAVA_HOME=/home/jdk1.8.0_111/
navega al directirio build y genera el makefile:
cris@cris ~/opencv-3.2.0/build $ cmake -DBUILD_SHARED_LIBS=OFF ..
Comprueba que cuando estás generando el makefile la salida en el campo de Java es la siguiente:
Es decir, debe estar especificado Apache Ant, así como el path JNI, y Java wrappers debe estar a YES.
4. Construye
Ejecuta el make para compilar openCV con soporte para Java y crear el jar:
cris@cris ~/opencv-3.2.0/build $ make -j8
Cuando finalice, comprueba que se han creado los archivos opencv-320.jar y libopencv_java320.so (.so o .dll):
cris@cris ~/opencv-3.2.0/build $ find . -name opencv-320.jar*
opencv-320.jar
opencv-320.jar.dephelper
cris@cris ~/opencv-3.2.0/build $ find . -name libopencv_java320.so
libopencv_java320.so
Ahora que lo tenemos compilado, el siguiente paso será crear un ejemplo en Java para comprobar que funciona. Yo uso el IDE IntelliJ IDEA Ultimate 2016, por lo que en la siguiente sección explicaré como crear un proyecto en Java de OpenCV en INTELLIJ.
Creando un proyecto Java OpenCV en INTELLIJ 16
La forma más fácil de crear un proyecto de OpenCV en Java y Scala es usando SBT. Así que abrimos IntelliJ y creamos un nuevo proyecto SBT. Una ve creado, seleccionamos File->Project Structure
(Comprueba que en Module JDK aparece tu SDK) y selecciona la pestaña Dependencies. Aquí, hacemos click en + y añadimos opencv-320.jar y la librería, que se encuentra en opencv3.2.0/build/lib :
Finalmente, tomamos el ejemplo de detección de caras de opencv documentation , lo corregimos (dado que es para la versión 2.4.4 de OpenCV) y lo guardamos en un fichero llamado helloOpenCV.java dentro de la carpeta src->main->java
. El código de ejemplo adaptado a la versión 3.2 de OpenCV es:
import org.opencv.core.*;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.objdetect.CascadeClassifier;
import static org.opencv.imgproc.Imgproc.rectangle;
//
// Detects faces in an image, draws boxes around them, and writes the results
// to "faceDetection.png".
//
class DetectFaceDemo {
public void run() {
System.out.println("\nRunning DetectFaceDemo");
// Create a face detector from the cascade file in the resources
// directory.
CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("/lbpcascade_frontalface.xml").getPath());
Mat image = Imgcodecs.imread(getClass().getResource("/lena.png").getPath());
// Detect faces in the image.
// MatOfRect is a special container class for Rect.
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));
// Draw a bounding box around each face.
for (Rect rect : faceDetections.toArray()) {
rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));
}
// Save the visualized detection.
String filename = "faceDetection.png";
System.out.println(String.format("Writing %s", filename));
Imgcodecs.imwrite(filename, image);
}
}
public class HelloOpenCV {
public static void main(String[] args) {
System.out.println("Hello, OpenCV");
// Load the native library.
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
new DetectFaceDemo().run();
}
}
Por último ejecutamos el ejemplo HelloOpenCV y comprobamos que funciona, escribiendo la detección de la cara de lenna en la imágen faceDetection.png.
¿Has visto algún error?: Por favor, ayúdame a corregirlo contactando conmigo o comentando abajo.
Quizá también te interese leer...
- 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
- Conectar base de datos ORACLE a aplicación Java remotamente