Android
Integrar OpenCV en Android Studio
Buscar..
Observaciones
Las bibliotecas Open CV se pueden encontrar en la web utilizando un motor de búsqueda.
Las 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 más arriba, es posible que mi ejemplo de carga de un archivo no funcione 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 de la galería o en otro lugar. Hay numerosos ejemplos flotando alrededor.
Instrucciones
Probado con AS v1.4.1 pero también debería funcionar con versiones más nuevas.
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 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 algún lugar. (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 el brazo ..., mips ... y x86 ... (uno para cada tipo de "arquitectura" con Android)
Desde Android Studio, importe OpenCV en su proyecto como módulo: Menú: / Archivo / Nuevo / Import_Module :
- Directorio de origen: {unzip-dir} / sdk / java
- Nombre del módulo: Android studio rellena automáticamente este campo con openCVLibrary310 (el nombre exacto probablemente no importa, pero seguiremos con esto).
- Haga clic en siguiente . Obtendrá una pantalla con tres casillas de verificación y preguntas sobre archivos jar, bibliotecas y opciones de importación. Los tres deben ser revisados. Haga clic en Finalizar.
Android Studio comienza a importar el módulo y se muestra un archivo import-summary.txt que contiene una lista de lo que no se importó (en su mayoría archivos javadoc) y otros datos.
Pero también aparece un mensaje de error que indica que no se pudo encontrar el objetivo con la cadena de hash 'android-14' .... Esto sucede porque el archivo build.gradle en el archivo zip OpenCV que descargaste dice que compilar utilizando la versión 14 de la API de Android, que de forma predeterminada no tiene con Android Studio v1.4.1.
Abra el diálogo de la 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 de módulo. Cuando selecciona Agregar / Módulo_dependencia , debería aparecer en la lista de módulos que puede agregar. Ahora aparecerá como una dependencia, pero obtendrá algunos errores más de " no encontrar-android-14" en el registro de eventos.
Busque en el archivo build.gradle para su módulo de 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 parece a build.gradle (Module: app) . 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 mio 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 límpielo / reconstrúyalo. ( Menú: / Build / Clean_Project ) Debería limpiarse y construirse sin errores y debería ver muchas referencias a : openCVLibrary310 en la pantalla 0: Messages .
En este punto, el módulo debe 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 nuevo desde la vista de proyecto a la vista de Android ). También debería ver un archivo build.gradle adicional en "Gradle Scripts" pero encuentro que la interfaz de Android Studio está un poco dañada y que a veces no lo hace de inmediato. Así que intenta volver a sincronizar, limpiar e incluso reiniciar Android Studio.
Debería ver el módulo openCVLibrary310 con todas las funciones de OpenCV bajo java como en esta captura de pantalla:
Copie el directorio {unzip-dir} / sdk / native / libs (y todo lo que contiene ) a 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é está esa línea con el mensaje de error)
- Ahora trata de usar realmente algún código openCV. En el siguiente ejemplo, copié un archivo .jpg al 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 y luego vuelve a escribir los resultados en un archivo .png en el mismo directorio.
Put this code just below the code from the previous step and alter it to match your own files/directories.
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 utilizar el Monitor de dispositivo de Android para recuperar la salida o escribir una actividad para mostrarla.