Android
Integrare OpenCV in Android Studio
Ricerca…
Osservazioni
Le librerie Open CV possono essere trovate sul web usando un motore di ricerca.
I Gotchas :
- Se si abbassa la piattaforma di destinazione sotto KitKat alcune delle librerie OpenCV non funzioneranno più, in particolare le classi relative a org.opencv.android.Camera2Renderer e altre classi correlate. Probabilmente è possibile aggirare questo problema semplicemente rimuovendo i file OpenCV .java appropriati.
- Se si aumenta la piattaforma di destinazione su Lollipop o sopra il mio esempio di caricamento di un file potrebbe non funzionare perché l'uso di percorsi di file assoluti è disapprovato. Quindi potresti dover cambiare l'esempio per caricare un file dalla galleria o da qualche altra parte. Ci sono numerosi esempi in giro.
Istruzioni
Testato con AS v1.4.1 ma dovrebbe funzionare anche con le versioni più recenti.
Crea un nuovo progetto Android Studio utilizzando la procedura guidata del progetto (Menu: / File / Nuovo progetto):
- Chiamalo " cvtest1 "
- Fattore di forma: API 19, Android 4.4 (KitKat)
- Attività vuota denominata MainActivity
Dovresti avere una directory cvtest1 in cui è archiviato questo progetto. (la barra del titolo di Android Studio ti mostra dove cvtest1 è quando apri il progetto)
Verifica che la tua app funzioni correttamente. Prova a cambiare qualcosa come il testo "Hello World" per confermare che il ciclo di build / test è OK per te. (Sto testando con un emulatore di un dispositivo API 19).
Scarica il pacchetto OpenCV per Android v3.1.0 e decomprimilo in qualche directory temporanea da qualche parte. (Assicurati che sia il pacchetto specifico per Android e non solo il pacchetto OpenCV per Java.) Chiamerò questa directory " unzip-dir " Sotto unzip-dir dovresti avere una directory sdk / native / libs con sottodirectory che iniziano con cose come arm ..., mips ... e x86 ... (uno per ogni tipo di "architettura" su cui gira Android)
Da Android Studio importa OpenCV nel tuo progetto come modulo: Menu: / File / New / Import_Module :
- Directory di origine: {unzip-dir} / sdk / java
- Nome del modulo: Android Studio riempie automaticamente questo campo con openCVLibrary310 (il nome esatto probabilmente non importa ma andremo con questo).
- Clicca su Avanti . Si ottiene una schermata con tre caselle di controllo e domande su barattoli, librerie e opzioni di importazione. Tutti e tre dovrebbero essere controllati. Clicca su Finisci.
Android Studio inizia a importare il modulo e viene visualizzato un file import-summary.txt con un elenco di ciò che non è stato importato (principalmente file javadoc) e altre informazioni.
Ma ricevi anche un messaggio di errore che dice di non riuscire a trovare il target con la stringa hash 'android-14' .... Ciò accade perché il file build.gradle nel file zip OpenCV scaricato dice di compilare utilizzando la versione 14 dell'API di Android, che per impostazione predefinita non si dispone di Android Studio v1.4.1.
Aprire la finestra di dialogo struttura del progetto ( Menu: / File / Struttura_progetto ). Selezionare il modulo "app", fare clic sulla scheda Dipendenze e aggiungere : openCVLibrary310 come dipendenza del modulo. Quando si seleziona Aggiungi / Module_Dependency dovrebbe apparire nell'elenco dei moduli che è possibile aggiungere. Verrà ora visualizzato come una dipendenza, ma nel registro eventi verranno visualizzati altri errori non-find-android-14 .
Cerca nel file build.gradle per il modulo dell'app. Esistono più file build.gradle in un progetto Android. Quello che vuoi è nella directory cvtest1 / app e dalla vista del progetto sembra build.gradle (Module: app) . Nota i valori di questi quattro campi:
- compileSDKVersion (il mio dice 23)
- buildToolsVersion (il mio dice 23.0.2)
- minSdkVersion (il mio dice 19)
- targetSdkVersion (il mio dice 23)
Il tuo progetto ora ha una directory cvtest1 / OpenCVLibrary310 ma non è visibile dalla vista del progetto:
Usa qualche altro strumento, come qualsiasi gestore di file, e vai in questa directory. Puoi anche cambiare la vista del progetto da Android a File di progetto e puoi trovare questa directory come mostrato in questo screenshot:
All'interno c'è un altro file build.gradle (è evidenziato nello screenshot qui sopra). Aggiorna questo file con i quattro valori del passaggio 6.
Risincronizza il tuo progetto e poi puliscilo / ricostruilo. ( Menu: / Build / Clean_Project ) Dovrebbe essere pulito e compilato senza errori e dovresti vedere molti riferimenti a : openCVLibrary310 nella schermata 0: Messaggi .
A questo punto il modulo dovrebbe apparire nella gerarchia del progetto come openCVLibrary310 , proprio come l' app . (Si noti che in quel piccolo menu a discesa sono passato dalla Vista Progetto alla vista Android ). Dovresti anche vedere un ulteriore file build.gradle in "Gradle Scripts" ma trovo l'interfaccia di Android Studio un po 'problematica e talvolta non lo fa subito. Quindi prova a risincronizzare, pulire, riavviare anche Android Studio.
Dovresti vedere il modulo openCVLibrary310 con tutte le funzioni OpenCV sotto java come in questo screenshot:
Copia la directory {unzip-dir} / sdk / native / libs (e tutto sotto di essa) sul tuo progetto Android, su cvtest1 / OpenCVLibrary310 / src / main / , quindi rinomina la tua copia da libs a jniLibs . Ora dovresti avere una directory cvtest1 / OpenCVLibrary310 / src / main / jniLibs . Risincronizza il tuo progetto e questa directory dovrebbe ora apparire nella vista del progetto sotto openCVLibrary310 .
Vai al metodo onCreate di MainActivity.java e aggiungi questo codice:
if (!OpenCVLoader.initDebug()) {
Log.e(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), not working.");
} else {
Log.d(this.getClass().getSimpleName(), " OpenCVLoader.initDebug(), working.");
}
Quindi esegui la tua applicazione. Dovresti vedere linee come questa nel monitor Android:
(Non so perché quella riga con il messaggio di errore è lì)
- Ora prova a utilizzare effettivamente un codice openCV. Nell'esempio seguente ho copiato un file .jpg nella directory cache dell'applicazione cvtest1 sull'emulatore Android. Il codice sotto carica questa immagine, esegue l'algoritmo di rilevamento dei bordi canny e quindi scrive i risultati in un file .png nella stessa directory.
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);
- Esegui la tua applicazione. Il tuo emulatore dovrebbe creare un'immagine "bordo" in bianco e nero. Puoi utilizzare Android Device Monitor per recuperare l'output o scrivere un'attività per mostrarlo.