OpenCV en Android Studio

140

Quiero usar la biblioteca OpenCV en mi aplicación con Android Studio. Seguí las instrucciones encontradas aquí pero recibo un error

Configuración con el nombre 'predeterminado' no encontrado

¿Qué puede estar mal?

Yo uso Android Studio 1.0 con gradle 2.2.1.

Bartosz Bialecki
fuente
1
Ahora podríamos importar módulos con Android Studio y los pasos podrían ser mucho más simples. ¿Puedes probar este stackoverflow.com/a/27356635/1180117
Kiran
Gracias, funciona. Escríbelo como respuesta, entonces puedo aceptarlo.
Bartosz Bialecki
@BartoszBialecki @Kiran, lo he seguido al paso No.4, no puedo encontrar el nativedirectorio en mi sdk directorio. ¿Me estoy perdiendo algo?
Romantic Electron
1
@RomanticElectron debe agregar el directorio natvie desde el sdk de la biblioteca OpenCV, no el sdk de Android.
Bartosz Bialecki
@BartoszBialecki gracias
Romantic Electron

Respuestas:

312

Los siguientes pasos para usar Android OpenCV sdk en Android Studio. Esta es una versión simplificada de esta ( 1 ) respuesta SO.

  1. Descargue el último OpenCV sdk para Android desde OpenCV.org y descomprima el archivo zip.
  2. Importe OpenCV a Android Studio , Desde archivo -> Nuevo -> Módulo de importación , elija la carpeta sdk / java en el archivo descomprimido de opencv.
  3. Actualice build.gradle bajo el módulo OpenCV importado para actualizar 4 campos para que coincidan con su proyecto build.gradle a) compileSdkVersion b) buildToolsVersion c) minSdkVersion yd) targetSdkVersion.
  4. Agregue la dependencia del módulo por Aplicación -> Configuración del módulo y seleccione la pestaña Dependencias . Haga clic en el ícono + en la parte inferior, elija Dependencia del módulo y seleccione el módulo OpenCV importado.
    • Para Android Studio v1.2.2, para acceder a la Configuración del módulo: en la vista del proyecto, haga clic con el botón derecho en el módulo dependiente -> Abrir configuración del módulo
  5. Copie la carpeta libs en sdk / native a Android Studio en app / src / main .
  6. En Android Studio, cambie el nombre del directorio de libs copiado a jniLibs y listo.

El paso (6) se debe a que Android Studio espera bibliotecas nativas en app/src/main/jniLibslugar de una libscarpeta anterior . Para aquellos nuevos en Android OpenCV, no se pierdan los siguientes pasos

  • include static{ System.loadLibrary("opencv_java"); }(Nota: para OpenCV versión 3 en este paso, debería cargar la biblioteca opencv_java3).
  • Para el paso (5), si ignora las librerías de la plataforma como x86, asegúrese de que su dispositivo / emulador no esté en esa plataforma.

OpenCV escrito está en C / C ++. Los contenedores Java son

  1. Android OpenCV SDK - OpenCV.org mantuvo el contenedor Java de Android. Sugiero este.
  2. OpenCV Java : OpenCV.org mantuvo el contenedor Java de escritorio generado automáticamente.
  3. JavaCV : contenedor Java popular mantenido por desarrolladores independientes. No es específico de Android. Esta biblioteca podría no estar sincronizada con las versiones más recientes de OpenCV.
Kiran
fuente
1
Recibo errores después del segundo paso, ¿debo eliminar el javadocsdirectorio? También me está pidiendo que lo instale, android sdk 14aunque estoy apuntando a dispositivos compatiblesandroid sdk 15
Romantic Electron
1
@RomanticElectron Espero que hayas descargado OpenCV4Android 2.4.10 del enlace sourceforge.net/projects/opencvlibrary/files/opencv-android/… y no esa versión de escritorio java.
Kiran
2
Ok, lo entendí, pensé que estabas hablando del sdkdirectorio de instalación en mi sistema mientras estabas hablando del directorio que viene con Android Open CV SDK.Ok completó el paso 6. ¿Dónde incluyo static{ System.loadLibrary("opencv_java"); }?
Romantic Electron
55
@RomanticElectron, ¿dónde incluye static {System.loadLibrary ("opencv_java"); }? Dices "Gracias, lo tengo", pero parece que no hay ningún mensaje intermedio. Entonces dices que no es necesario. ¿Podrías explicarme un poco más? Gracias.
puntofisso
8
para cualquier persona que tenga el android-14error después de importar el módulo en el paso 2, debe editarlo manualmente build.gradleen el directorio de openCV en su proyecto como se muestra en el paso 3.
paradite
144

Integrando OpenCV v3.1.0 en Android Studio v1.4.1 , instrucciones con detalles adicionales y capturas de pantalla del tipo esto es lo que debería obtener.

La mayor parte del crédito va a Kiran, Kool, 1 "y SteveLiles en opencv.org por sus explicaciones. Estoy agregando esta respuesta porque creo que la interfaz de Android Studio ahora es lo suficientemente estable como para trabajar en este tipo de integración. También tengo que escribir estas instrucciones de todos modos para nuestro proyecto.

Los desarrolladores AS experimentados encontrarán algo de esto pedante. Esta respuesta está dirigida a personas con experiencia limitada en Android Studio.

  1. Cree un nuevo proyecto de Android Studio utilizando el asistente de proyectos (Menú: / Archivo / Nuevo proyecto):

    • Llámalo " cvtest1 "
    • Factor de forma: API 19, Android 4.4 (KitKat)
    • Actividad en blanco llamada MainActivity

      Debe tener un directorio cvtest1 donde se almacena este proyecto. (la barra de título de Android Studio te muestra dónde está cvtest1 cuando abres el proyecto)

  2. Verifique que su aplicación se ejecute correctamente. Intente cambiar algo como el texto "Hola Mundo" para confirmar que el ciclo de compilación / prueba está bien para usted. (Estoy probando con un emulador de un dispositivo API 19).

  3. Descargue el paquete OpenCV para Android v3.1.0 y descomprímalo en algún directorio temporal en alguna parte. (Asegúrese de que sea el paquete específicamente para Android y no solo el paquete OpenCV para Java). Llamaré a este directorio " unzip-dir " Debajo de unzip-dir debería tener un directorio sdk / native / libs con subdirectorios que comienzan con cosas como arm ..., mips ... y x86 ... (una para cada tipo de "arquitectura" en la que se ejecuta Android)

  4. Desde Android Studio, importe OpenCV en su proyecto como módulo: Menú: / Archivo / Nuevo / Importar_Módulo :

    • Directorio fuente: {descomprimir-directorio} / sdk / java
    • Nombre del módulo: Android Studio rellena automáticamente este campo con openCVLibrary310 (el nombre exacto probablemente no importa, pero iremos con esto).
    • Haga clic en siguiente . Obtiene una pantalla con tres casillas de verificación y preguntas sobre frascos, bibliotecas y opciones de importación. Los tres deben ser revisados. Haz clic en Finalizar.

      Android Studio comienza a importar el módulo y se le muestra un archivo import-summary.txt que tiene una lista de lo que no se importó (principalmente archivos javadoc) y otros datos. ingrese la descripción de la imagen aquí

      Pero también se obtiene un mensaje de error que dice que no pudo encontrar destino con la cadena de hash 'android-14' ... . Esto sucede porque el archivo build.gradle en el archivo zip de OpenCV que descargaste dice que se compila usando la versión 14 de la API de Android, que por defecto no tienes con Android Studio v1.4.1. ingrese la descripción de la imagen aquí

  5. Abra el diálogo de estructura del proyecto ( Menú: / Archivo / Estructura_proyecto ). Seleccione el módulo "aplicación", haga clic en la pestaña Dependencias y agregue : openCVLibrary310 como una dependencia del módulo. Cuando selecciona Agregar / Módulo_Dependencia , debería aparecer en la lista de módulos que puede agregar. Ahora se mostrará como una dependencia, pero obtendrá algunos errores más de no se puede encontrar-android-14 en el registro de eventos.

  6. Busque en el archivo build.gradle el módulo de su aplicación. Hay varios archivos build.gradle en un proyecto de Android. El que desea está en el directorio cvtest1 / app y desde la vista del proyecto se ve como build.gradle (Módulo: aplicación) . Tenga en cuenta los valores de estos cuatro campos:

    • compileSDKVersion (el mío dice 23)
    • buildToolsVersion (el mío dice 23.0.2)
    • minSdkVersion (el mío dice 19)
    • targetSdkVersion (el mío dice 23)
  7. Su proyecto ahora tiene un directorio cvtest1 / OpenCVLibrary310 pero no es visible desde la vista del proyecto:

ingrese la descripción de la imagen aquí

Use alguna otra herramienta, como cualquier administrador de archivos, y vaya a este directorio. También puede cambiar la vista del proyecto de Android a Archivos de proyecto y puede encontrar este directorio como se muestra en esta captura de pantalla: ingrese la descripción de la imagen aquí

Dentro hay otro archivo build.gradle (está resaltado en la captura de pantalla anterior). Actualice este archivo con los cuatro valores del paso 6.

  1. Vuelva a sincronizar su proyecto y luego limpie / reconstruya. (Menú: / Build / Clean_Project ) Debería limpiar y construir sin errores y debería ver muchas referencias a : openCVLibrary310 en la pantalla 0: Mensajes .

    ingrese la descripción de la imagen aquí

    En este punto, el módulo debería aparecer en la jerarquía del proyecto como openCVLibrary310 , al igual que la aplicación . (Tenga en cuenta que en ese pequeño menú desplegable cambié de Vista de proyecto a Vista de Android ). También debería ver un archivo build.gradle adicional en "Gradle Scripts", pero la interfaz de Android Studio me parece un poco problemática y, a veces, no lo hace de inmediato. Por lo tanto, intente resincronizar, limpiar e incluso reiniciar Android Studio.

    Debería ver el módulo openCVLibrary310 con todas las funciones de OpenCV en Java como en esta captura de pantalla:

    ingrese la descripción de la imagen aquí

  2. Copie el directorio {unzip-dir} / sdk / native / libs (y todo lo que está debajo) en su proyecto de Android, a cvtest1 / OpenCVLibrary310 / src / main / , y luego cambie el nombre de su copia de libs a jniLibs . Ahora debería tener un cvtest1 / OpenCVLibrary310 / src / main / jniLibs . Vuelva a sincronizar su proyecto y este directorio debería aparecer ahora en la vista del proyecto en openCVLibrary310 .

    ingrese la descripción de la imagen aquí

  3. Vaya al método onCreate de MainActivity.java y agregue este código:

    if (!OpenCVLoader.initDebug()) {
        Log.e(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), not working.");
    } else {
        Log.d(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), working.");
    }

    Luego ejecuta tu aplicación. Debería ver líneas como esta en el monitor de Android: ingrese la descripción de la imagen aquí (No sé por qué esa línea con el mensaje de error está allí)

  4. Ahora intente usar un código openCV. En el siguiente ejemplo, copié un archivo .jpg en el directorio de caché de la aplicación cvtest1 en el emulador de Android. El siguiente código carga esta imagen, ejecuta el algoritmo de detección de bordes astutos y luego escribe los resultados en un archivo .png en el mismo directorio.

    Coloque este código justo debajo del código del paso anterior y modifíquelo para que coincida con sus propios archivos / directorios.

    String inputFileName="simm_01";
    String inputExtension = "jpg";
    String inputDir = getCacheDir().getAbsolutePath();  // use the cache directory for i/o
    String outputDir = getCacheDir().getAbsolutePath();
    String outputExtension = "png";
    String inputFilePath = inputDir + File.separator + inputFileName + "." + inputExtension;
    
    
    Log.d (this.getClass().getSimpleName(), "loading " + inputFilePath + "...");
    Mat image = Imgcodecs.imread(inputFilePath);  
    Log.d (this.getClass().getSimpleName(), "width of " + inputFileName + ": " + image.width());
    // if width is 0 then it did not read your image.
    
    
    // for the canny edge detection algorithm, play with these to see different results
    int threshold1 = 70;
    int threshold2 = 100;
    
    Mat im_canny = new Mat();  // you have to initialize output image before giving it to the Canny method
    Imgproc.Canny(image, im_canny, threshold1, threshold2);
    String cannyFilename = outputDir + File.separator + inputFileName + "_canny-" + threshold1 + "-" + threshold2 + "." + outputExtension;
    Log.d (this.getClass().getSimpleName(), "Writing " + cannyFilename);
    Imgcodecs.imwrite(cannyFilename, im_canny);
  5. Ejecute su aplicación Su emulador debe crear una imagen de "borde" en blanco y negro. Puede usar el Monitor de dispositivo Android para recuperar la salida o escribir una actividad para mostrarla.

Los gotchas :

  • Si baja su plataforma de destino debajo de KitKat, algunas de las bibliotecas de OpenCV ya no funcionarán, específicamente las clases relacionadas con org.opencv.android.Camera2Renderer y otras clases relacionadas. Probablemente pueda evitar esto simplemente eliminando los archivos apropiados de OpenCV .java.
  • Si eleva su plataforma de destino a Lollipop o superior, mi ejemplo de cargar un archivo podría no funcionar porque el uso de rutas de archivos absolutas está mal visto. Por lo tanto, es posible que tenga que cambiar el ejemplo para cargar un archivo desde la galería o en otro lugar. Hay numerosos ejemplos flotando alrededor.
ssimm
fuente
2
Edición del 16 de febrero: jniLibs ahora en el directorio openCVLibrary310, no en el directorio principal de la aplicación. Funciona, pero me parece más limpio mantenerlos en la parte de opencv. Además de más capturas de pantalla y la parte "Gotchas".
ssimm
Creo que faltan algunas declaraciones de importación, de lo contrario, ¡muy buen trabajo! +1
Allan Nørgaard
1
Seguí tu respuesta pero fallé. 1 Obtuve el error OpenCV error: Cannot load info library for OpenCV 2 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/www.deven.com.opencv-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libopencv_java3.so Lo que hice sobre este error paso a paso como lo escribiste.
Devendra Singh
2
@DevendraSingh Recibí el mismo error que tú, pero me di cuenta de que había perdido el paso 9.
aasu
2
¿Qué pasa si queremos codificar en C ++ para OpenCV en Android Studio?
user8663682
37

Para todos los que sintieron que querían huir con todos los pasos y capturas de pantalla de las respuestas anteriores (¡genial!), Esto funcionó para mí con android studio 2.2.1:

  1. Cree un nuevo proyecto, asígnele el nombre que desee y tome el predeterminado (minSdkVersion 15 está bien).
  2. Descargue el archivo zip desde aquí: https://sourceforge.net/projects/opencvlibrary/files/opencv-android/ (descargué la versión 3.1.0, pero puede haber una versión más nueva).
  3. Descomprima el archivo zip, el mejor lugar está en la carpeta de su espacio de trabajo, pero en realidad no importa.
  4. En el interior Android Studio, haga clic File->New-> Import Moduley navegue y presione \path_to_your_unzipped_file\OpenCV-android-sdk\sdk\javaAceptar, luego acepte todos los cuadros de diálogo predeterminados.
  5. En el gradlearchivo de su app módulo, agregue esto al bloque de dependencias:

    dependencies {
        compile project(':openCVLibraryXYZ')
        //rest of code
    }

Donde XYZ es la versión exacta que descargas, por ejemplo en mi caso:

    dependencies {
        compile project(':openCVLibrary320')
        //rest of code
    }
yshahak
fuente
1
Agradable y simple, thnx ;-) Funciona también para la versión 3.2.0.
blacharnia
2
Gracias, de hecho es la solución más fácil. Un punto de mi parte. El nuevo módulo OpenCV no se pudo compilar. La respuesta aquí me ayudó a solucionar este problema stackoverflow.com/a/40302788/408780
Tima
solo para agregar a lo que dijo @blacharnia, solo asegúrese de usar 'compilar proyecto (': openCVLibrary320 ')' en la sección de dependencias de la cuna en lugar de 310
Abraham Philip
Tal vez de manera más general, para agregar a los comentarios anteriores, use "compilar proyecto (': openCVLibraryXYZ')" donde XYZ es el número de versión de openCV Android SDK sin los 'puntos' - esto también funciona ahora para la versión 3.4.0 -> ie use "compilar proyecto (': openCVLibrary340')"
Mick
@Mick gracias, edité la respuesta de acuerdo a tu sugerencia.
yshahak
9

Android Studio 3.4 + OpenCV 4.1

  1. Descargue el último archivo zip de OpenCV desde aquí (la versión más reciente actual es 4.1.0) y descomprímalo en su espacio de trabajo o en otra carpeta.

  2. Cree un nuevo proyecto de Android Studio normalmente. Haga clic File->New->Import Module, navegue /path_to_unzipped_files/OpenCV-android-sdk/sdk/java, establezca el Nombre del módulo comoopencv , haga clic Nexty desmarque todas las opciones en la pantalla.

  3. Habilita Projectel modo de visualización de archivos (el modo predeterminado es Android). En el opencv/build.gradlecambio de archivos apply plugin: 'com.android.application'a apply plugin: 'com.android.library'y reemplazar application ID "org.opencv"con

    minSdkVersion 21
    targetSdkVersion 28

    (según los valores en app/build.gradle). Proyecto de sincronización con archivos Gradle.

  4. Agregue esta cadena al bloque de dependencias en el app/build.gradlearchivo

    dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
  5. Seleccione nuevamente Androidel modo de vista de archivo. Haga clic derecho en el appmódulo y vaya a New->Folder->JNI Folder. Seleccione cambiar ubicación de carpeta y establecer src/main/jniLibs/.

  6. Seleccione nuevamente Projectel modo de visualización de archivos y copie todas las carpetas de /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libsa app/src/main/jniLibs.

  7. Nuevamente en Androidel modo de vista de archivo, haga clic derecho en el appmódulo y elija Link C++ Project with Gradle. Seleccionar sistema de compilaciónndk-build y ruta al OpenCV.mkarchivo /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk.

    path_to_unzipped_files no debe contener espacios, ¡o recibirá un error!

Para verificar la inicialización de OpenCV, agregue el mensaje Toast en el onCreate()método MainActivity :

Toast.makeText(MainActivity.this, String.valueOf(OpenCVLoader.initDebug()), Toast.LENGTH_LONG).show();

Si la inicialización es exitosa, verá trueen el mensaje de Toast lo que verá false.

Plo_Koon
fuente
Arriba dices "reemplazar ID de aplicación" org.opencv "con ....." pero no hay nada después de "con". ¿Puedes por favor aclarar? ¿Quiere decir "eliminar la entrada applicationId y agregar dos entradas de la siguiente manera:"
Dale
@Dale Sí, debe reemplazar la application ID "org.opencv"cadena con dos cadenas: minSdkVersion 21y targetSdkVersion 28(de acuerdo con los valores en el archivo app / build.gradle)
Plo_Koon
Seguí todos los pasos como lo describiste. Pero obteniendo el error E / art: dlopen ("/ data / app / com.example.objectsegmentation-1 / lib / arm64 / libopencv_java4.so", RTLD_LAZY) falló: dlopen falló: biblioteca "libc ++ _ shared.so" no encontrada
Masthan
0

Se muestra cualquier persona que tenga problemas al crear jniLibs cpp ... solo agregue ndk ...

Aklesh Singh
fuente
0

Esto funcionó para mí y fue tan fácil como agregar una dependencia de gradle:

https://bintray.com/seesaa/maven/opencv#

https://github.com/seesaa/opencv-android

La única advertencia es que tuve que usar un dispositivo de depuración de hardware ya que los emuladores de brazo funcionaban demasiado lento para mí (como AVD Manager dice que lo harán) y, como se describe en el archivo README, esta versión no incluye soporte x86 o x86_64.

Parece construir y la prueba sugerida:

static {
    OpenCVLoader.initDebug();
}

escupe un montón de resultados que me parecen correctos.

Naumdev
fuente
Esto fue de un nuevo proyecto en el estudio de Android. No importé nada, no descargué nada, etc. Simplemente agregue la dependencia de gradle y sincronice.
Naumdev
0

En su build.gradle

repositories {
  jcenter()
}

implementation 'com.quickbirdstudios:opencv:4.1.0'

Más información

Raymond Chenon
fuente