usar - OpenCV en Android Studio
sourceforge opencv android (6)
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.
Quiero usar la biblioteca OpenCV en mi aplicación con Android Studio. Seguí las instrucciones encontradas here 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.
Los siguientes pasos para usar Android OpenCV sdk en Android Studio. Esta es una versión simplificada de esta ( 1 ) respuesta SO.
- Descargue el último OpenCV sdk para Android desde OpenCV.org y descomprima el archivo zip.
- Importe OpenCV a Android Studio , Desde archivo -> Nuevo -> Módulo de importación , elija la carpeta sdk / java en el archivo descomprimido de opencv.
- Actualice build.gradle en 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.
-
Agregue dependencia de módulo
por
Aplicación -> Configuración de módulo
y seleccione la pestaña
Dependencias
.
Haga clic en el icono
+
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
- Copie la carpeta libs en sdk / native a Android Studio en app / src / main .
- En Android Studio, cambie el nombre del directorio libs copiado a jniLibs y listo.
El paso (6) se debe a que Android Studio espera bibliotecas nativas en
app/src/main/jniLibs
lugar de la carpeta de
app/src/main/jniLibs
más antigua.
Para aquellos nuevos en Android OpenCV, no se pierdan los siguientes pasos
-
incluir
static{ System.loadLibrary("opencv_java"); }
static{ System.loadLibrary("opencv_java"); }
(Nota: para OpenCV versión 3 en este paso, debería cargar la bibliotecaopencv_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
- Android OpenCV SDK - OpenCV.org mantuvo el contenedor Java de Android. Sugiero este.
- OpenCV Java : OpenCV.org mantuvo el contenedor Java de escritorio generado automáticamente.
- 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.
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
:
- Cree un nuevo proyecto, asígnele el nombre que desee y tome el predeterminado (minSdkVersion 15 está bien).
- 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).
- Descomprima el archivo zip, el mejor lugar está en la carpeta de su espacio de trabajo, pero en realidad no importa.
-
Dentro de
Android Studio
, haga clic enFile->New-> Import Module
y navegue a/path_to_your_unzipped_file/OpenCV-android-sdk/sdk/java
y presione Aceptar, luego acepte todos los cuadros de diálogo predeterminados. -
En el archivo
gradle
de su módulo deapp
, 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
}
Se muestra cualquier persona que tenga problemas al crear jniLibs cpp ... solo agregue ndk ...
Android Studio 3.4 + OpenCV 4.1
-
Descargue el último archivo zip de OpenCV desde https://sourceforge.net/projects/opencvlibrary/files/opencv-android/ (la versión más reciente actual es 4.1.0) y descomprímalo en su espacio de trabajo o en otra carpeta.
-
Cree un nuevo proyecto de Android Studio normalmente. Haga clic en
File->New->Import Module
, navegue a/path_to_unzipped_files/OpenCV-android-sdk/sdk/java
, configure el nombre del módulo comoopencv
, haga clic enNext
y desactive todas las opciones en la pantalla. -
Habilite el modo de vista de archivo de
Project
(el modo predeterminado esAndroid
). En el cambio de archivoopencv/build.gradle
,apply plugin: ''com.android.application''
paraapply plugin: ''com.android.library''
y reemplace elapplication ID "org.opencv"
conminSdkVersion 21 targetSdkVersion 28
(según los valores en
app/build.gradle
). Proyecto de sincronización con archivos Gradle. -
Agregue esta cadena al bloque de dependencias en el archivo
app/build.gradle
dependencies { ... implementation project(path: '':opencv'') ... }
-
Seleccione nuevamente el modo de visualización de archivos de
Android
. Haga clic derecho en el módulo de laapp
y vaya aNew->Folder->JNI Folder
. Seleccione cambiar ubicación de carpeta y configuresrc/main/jniLibs/
. -
Seleccione nuevamente el modo de vista de archivo de
Project
y copie todas las carpetas desde/path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libs
aapp/src/main/jniLibs
. -
Nuevamente, en el modo de vista de archivos de
Android
, haga clic derecho en el módulo de laapp
y elijaLink C++ Project with Gradle
. Seleccione Build Systemndk-build
y ruta al archivo/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 método
onCreate()
:
Toast.makeText(MainActivity.this, String.valueOf(OpenCVLoader.initDebug()), Toast.LENGTH_LONG).show();
Si la inicialización es exitosa, verá
true
en el mensaje Toast; de lo contrario, verá
false
.
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.
-
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)
-
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).
-
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 comiencen con cosas como arm ..., mips ... y x86 ... (una para cada tipo de "arquitectura" en la que se ejecuta Android)
-
Desde Android Studio, importe OpenCV en su proyecto como módulo: Menú: / Archivo / Nuevo / Importar_Módulo :
- Directorio de origen: {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 jarras, 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.
Pero también recibe un mensaje de error que dice que no se pudo encontrar el objetivo con la cadena 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.
-
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.
-
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)
-
Su proyecto ahora tiene un directorio cvtest1 / OpenCVLibrary310 pero no es visible desde la vista del proyecto:
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:
Dentro hay otro archivo build.gradle (está resaltado en la captura de pantalla anterior). Actualice este archivo con los cuatro valores del paso 6.
-
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 .
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:
-
Copie el directorio {unzip-dir} / sdk / native / libs (y todo lo que está debajo de él) 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 directorio cvtest1 / OpenCVLibrary310 / src / main / jniLibs . Vuelva a sincronizar su proyecto y este directorio debería aparecer ahora en la vista del proyecto en openCVLibrary310 .
-
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: (No sé por qué esa línea con el mensaje de error está ahí)
-
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);
-
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 el resultado o escribir una actividad para mostrarlo.
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 quitando 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 deba cambiar el ejemplo para cargar un archivo desde la galería o en otro lugar. Hay numerosos ejemplos flotando.