Autor

Cristina Heredia

Outlier y graduada en Ing. Informática en la ugr. Computer science.

Más artículos de Cristina Heredia | Porfolio

Í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

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.

Categorías:Etiquetas:

Quizá también te interese leer...