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):
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 comienzan 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 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.
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.
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:
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) 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 .
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á allí)
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 la salida o escribir una actividad para mostrarla.