OpenCV in Android Studio


140

Voglio usare la libreria OpenCV nella mia app con Android Studio. Ho seguito le istruzioni trovate qui ma ricevo un errore

Configurazione con nome "predefinito" non trovata

Cosa può esserci di sbagliato?

Uso Android Studio 1.0 con il grado 2.2.1.


1
Ora potremmo importare moduli con Android Studio e i passaggi potrebbero essere molto più semplici. Puoi provare questo stackoverflow.com/a/27356635/1180117
Kiran l'

Grazie, funziona. Scrivilo come risposta, quindi posso accettarlo.
Bartosz Bialecki,

@BartoszBialecki @Kiran, l'ho seguito al passaggio n. 4, non riesco a trovare la nativedirectory nella mia sdk directory. Mi manca qualcosa?
Electron romantico,

1
@RomanticElectron devi aggiungere la directory natvie dal sdk della libreria OpenCV, non da Android sdk.
Bartosz Bialecki,

@BartoszBialecki ringrazia
Electron romantico il

Risposte:


312

I passaggi seguenti per l'utilizzo di Android OpenCV sdk in Android Studio. Questa è una versione semplificata di questa ( 1 ) risposta SO.

  1. Scarica l' ultimo OpenCV sdk per Android da OpenCV.org e decomprimi il file zip.
  2. Importa OpenCV in Android Studio , da File -> Nuovo -> Modulo di importazione , scegli la cartella sdk / java nell'archivio aperto decompresso.
  3. Aggiorna build.gradle sotto il modulo OpenCV importato per aggiornare 4 campi in modo che corrispondano al tuo progetto build.gradle a) compileSdkVersion b) buildToolsVersion c) minSdkVersion e d) targetSdkVersion.
  4. Aggiungi la dipendenza del modulo dall'applicazione -> Impostazioni modulo e seleziona la scheda Dipendenze . Fare clic sull'icona + in basso, selezionare Dipendenza modulo e selezionare il modulo OpenCV importato.
    • Per Android Studio v1.2.2, per accedere alle Impostazioni del modulo: nella vista del progetto, fare clic con il tasto destro del mouse sul modulo dipendente -> Apri le Impostazioni del modulo
  5. Copia la cartella libs in sdk / native in Android Studio in app / src / main .
  6. In Android Studio, rinomina la directory libs copiata in jniLibs e il gioco è fatto.

Il passaggio (6) è dato dal fatto che Android Studio prevede librerie native app/src/main/jniLibsanziché libscartelle precedenti . Per quelli che non conoscono OpenCV per Android, non perdere i passaggi seguenti

  • include static{ System.loadLibrary("opencv_java"); }(Nota: per OpenCV versione 3 in questo passaggio devi invece caricare la libreria opencv_java3.)
  • Per il passaggio (5), se ignori le librerie della piattaforma come x86, assicurati che il tuo dispositivo / emulatore non sia su quella piattaforma.

OpenCV scritto è in C / C ++. I wrapper Java lo sono

  1. SDK Android OpenCV - OpenCV.org ha mantenuto il wrapper Java per Android. Suggerisco questo.
  2. OpenCV Java - OpenCV.org mantenuto wrapper Java desktop generato automaticamente.
  3. JavaCV : popolare wrapper Java gestito da sviluppatori indipendenti. Non specifico per Android. Questa libreria potrebbe non essere sincronizzata con le versioni più recenti di OpenCV.

1
Ricevo errori dopo il secondo passaggio, devo cancellare la javadocsdirectory? Mi sta anche chiedendo l'installazione android sdk 14anche se sto prendendo di mira dispositivi che supportanoandroid sdk 15
Romantic Electron,

1
@RomanticElectron Spero di aver scaricato OpenCV4Android 2.4.10 dal link sourceforge.net/projects/opencvlibrary/files/opencv-android/… e non quella versione desktop java?
Kiran,

2
Ok, ho capito, pensavo che stavi parlando della sdkdirectory di installazione sul mio sistema mentre parlavi della directory che viene fornita. Android Open CV SDKOk, completato il passaggio 6. Dove devo includere static{ System.loadLibrary("opencv_java"); }?
Romantic Electron,

5
@RomanticElectron dove includi {System.loadLibrary statico ("opencv_java"); }? Dici "Grazie, ce l'ho" ma non sembra esserci alcun messaggio in mezzo. Quindi dici che non è necessario. Potresti spiegare un po 'di più? Grazie.
puntofisso,

8
per chiunque abbia l' android-14errore dopo aver importato il modulo nel passaggio 2, è necessario modificare manualmente build.gradlela directory openCV nel progetto come mostrato nel passaggio 3.
paradite

144

Integrazione di OpenCV v3.1.0 in Android Studio v1.4.1 , istruzioni con dettagli aggiuntivi e schermate di tipo questo è ciò che dovresti ottenere.

La maggior parte del merito va a Kiran, Kool, 1 "e SteveLiles su opencv.org per le loro spiegazioni. Sto aggiungendo questa risposta perché credo che l'interfaccia di Android Studio sia ora abbastanza stabile per lavorare su questo tipo di elementi di integrazione Inoltre devo scrivere queste istruzioni comunque per il nostro progetto.

Gli sviluppatori esperti di AS troveranno questo pedante. Questa risposta è rivolta a persone con esperienza limitata in Android Studio.

  1. Crea un nuovo progetto Android Studio usando la procedura guidata del progetto (Menu: / File / Nuovo progetto):

    • Chiamalo " cvtest1 "
    • Fattore di forma: API 19, Android 4.4 (KitKat)
    • Attività vuota denominata MainActivity

      È necessario disporre di una directory cvtest1 in cui è archiviato questo progetto. (la barra del titolo di Android Studio mostra dove si trova cvtest1 quando si apre il progetto)

  2. Verifica che l'app funzioni correttamente. Prova a cambiare qualcosa come il testo "Hello World" per confermare che il ciclo di compilazione / test è adatto a te. (Sto testando con un emulatore di un dispositivo API 19).

  3. 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 le sottodirectory che iniziano con cose come arm ..., mips ... e x86 ... (uno per ogni tipo di "architettura" su cui gira Android)

  4. Da Android Studio importa OpenCV nel tuo progetto come modulo: Menu: / File / Nuovo / 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 ha importanza, ma andremo con questo).
    • Fai clic su Avanti . Viene visualizzata una schermata con tre caselle di controllo e domande su vasetti, librerie e opzioni di importazione. Tutti e tre dovrebbero essere controllati. Clicca su Fine.

      Android Studio inizia a importare il modulo e ti viene mostrato un file import-summary.txt che ha un elenco di ciò che non è stato importato (principalmente file javadoc) e altre informazioni. inserisci qui la descrizione dell'immagine

      Ma anche si riceve un messaggio di errore che è riuscito a trovare bersaglio con stringa hash 'android-14' ... . Ciò accade perché il file build.gradle nel file zip OpenCV che hai scaricato dice di compilare utilizzando l'API android versione 14, che per impostazione predefinita non hai con Android Studio v1.4.1. inserisci qui la descrizione dell'immagine

  5. Apre la finestra di dialogo della struttura del progetto ( Menu: / File / Project_Structure ). Selezionare il modulo "app", fare clic sulla scheda Dipendenze e aggiungere : openCVLibrary310 come dipendenza del modulo. Quando si seleziona Aggiungi / Module_Dependency, questo dovrebbe apparire nell'elenco dei moduli che è possibile aggiungere. Ora apparirà come una dipendenza, ma nel registro eventi verranno visualizzati altri errori Impossibile trovare-Android-14 .

  6. Cerca nel file build.gradle il modulo della tua 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 (Modulo: app) . Nota i valori di questi quattro campi:

    • compileSDKVersion (la mia dice 23)
    • buildToolsVersion (il mio dice 23.0.2)
    • minSdkVersion (il mio dice 19)
    • targetSdkVersion (il mio dice 23)
  7. Il progetto ora ha una directory cvtest1 / OpenCVLibrary310 ma non è visibile dalla vista del progetto:

inserisci qui la descrizione dell'immagine

Usa qualche altro strumento, come qualsiasi file manager, e vai a questa directory. Puoi anche passare dalla vista del progetto da Android a File di progetto e puoi trovare questa directory come mostrato in questo screenshot: inserisci qui la descrizione dell'immagine

All'interno c'è un altro file build.gradle (è evidenziato nella schermata sopra). Aggiorna questo file con i quattro valori dal passaggio 6.

  1. Risincronizza il tuo progetto e quindi puliscilo / ricostruiscilo. (Menu: / Build / Clean_Project ) Dovrebbe essere pulito e compilato senza errori e dovresti vedere molti riferimenti a : openCVLibrary310 nella schermata 0: Messaggi .

    inserisci qui la descrizione dell'immagine

    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 file build.gradle aggiuntivo sotto "Gradle Scripts" ma trovo che l'interfaccia di Android Studio sia un po 'glitch e a volte non lo fa subito. Quindi prova a risincronizzare, pulire e persino riavviare Android Studio.

    Dovresti vedere il modulo openCVLibrary310 con tutte le funzioni OpenCV sotto Java come in questo screenshot:

    inserisci qui la descrizione dell'immagine

  2. Copia la directory {unzip-dir} / sdk / native / libs (e tutto il resto) 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 in openCVLibrary310 .

    inserisci qui la descrizione dell'immagine

  3. 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 eseguire l'applicazione. Nel monitor Android dovresti vedere righe come questa: inserisci qui la descrizione dell'immagine (Non so perché quella riga con il messaggio di errore sia presente)

  4. 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 seguente carica questa immagine, esegue l'algoritmo di rilevamento dei bordi canny e quindi riscrive i risultati in un file .png nella stessa directory.

    Inserisci questo codice appena sotto il codice del passaggio precedente e modificalo in modo che corrisponda ai tuoi file / directory.

    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. Esegui la tua applicazione. L'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.

The 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 puoi aggirare questo problema semplicemente rimuovendo i file .java di OpenCV apprendiati.
  • Se aumenti la tua 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.

2
Modifica del 16 febbraio: jniLibs ora nella directory openCVLibrary310, non nella directory dell'app principale. O funziona, ma mi sembra più pulito tenerli nella parte aperta. Più altri screenshot e la parte "Gotchas".
ssimm,

Penso che manchino alcune dichiarazioni di importazione, altrimenti un ottimo lavoro! +1
Allan Nørgaard

1
Ho seguito la tua risposta ma non ci sono riuscito. 1 ho ottenuto l'errore 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 Cosa ho fatto di questi errori passo dopo passo mentre scrivevi.
Devendra Singh,

2
@DevendraSingh Ho avuto lo stesso errore di te ma mi sono reso conto di aver perso il passaggio 9.
aasu

2
cosa succede se vogliamo codificare in c ++ per opencv su Android Studio?
user8663682

37

Per tutti coloro che hanno sentito di voler scappare con tutti i passaggi e le schermate delle risposte (fantastiche!) Sopra, questo ha funzionato per me con android studio 2.2.1:

  1. Crea un nuovo progetto, chiamalo come vuoi e prendi quello predefinito (minSdkVersion 15 va bene).
  2. Scarica il file zip da qui: https://sourceforge.net/projects/opencvlibrary/files/opencv-android/ (ho scaricato la versione 3.1.0, ma potrebbero esserci versioni più recenti).
  3. Decomprimi il file zip, il posto migliore è nella cartella dello spazio di lavoro, ma non importa.
  4. All'interno Android Studio, fai clic File->New-> Import Modulee naviga \path_to_your_unzipped_file\OpenCV-android-sdk\sdk\javae premi Ok, quindi accetta tutte le finestre di dialogo predefinite.
  5. Nel gradlefile del tuo app modulo, aggiungi questo al blocco delle dipendenze:

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

Dove XYZ è la versione esatta che scarichi, ad esempio nel mio caso:

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

1
Bello e semplice, grazie ;-) Funziona anche per la versione 3.2.0.
blacharnia,

2
Grazie, è davvero la soluzione più semplice. Un punto da parte mia. Non è stato possibile compilare il nuovo modulo OpenCV. La risposta qui mi ha aiutato a risolvere questo problema stackoverflow.com/a/40302788/408780
Tima

solo per aggiungere a ciò che ha detto @blacharnia, assicurati di usare 'compile project (': openCVLibrary320 ')' nella sezione delle dipendenze della culla invece di 310
Abraham Philip,

Forse più in generale, per aggiungere ai commenti sopra, usa "compila progetto (': openCVLibraryXYZ')" dove XYZ è il numero di versione dell'SDK Android openCV senza i 'punti' - ora funziona anche per la versione 3.4.0 -> ie usa "compila progetto (': openCVLibrary340')"
Mick

@ Grazie, ho modificato la risposta in base al tuo suggerimento.
yshahak,

9

Android Studio 3.4 + OpenCV 4.1

  1. Scarica l'ultimo file zip OpenCV da qui (l'attuale versione più recente è la 4.1.0) e decomprimilo nell'area di lavoro o in un'altra cartella.

  2. Crea normalmente un nuovo progetto Android Studio. Fare clic su File->New->Import Module, selezionare /path_to_unzipped_files/OpenCV-android-sdk/sdk/java, impostare Nome modulo come opencv, fare clic Nexte deselezionare tutte le opzioni nella schermata.

  3. Abilita Projectmodalità di visualizzazione file (modalità predefinita è Android). Nel opencv/build.gradlefile passare apply plugin: 'com.android.application'a apply plugin: 'com.android.library'e sostituirlo application ID "org.opencv"con

    minSdkVersion 21
    targetSdkVersion 28

    (secondo i valori in app/build.gradle). Sincronizza il progetto con i file Gradle.

  4. Aggiungi questa stringa al blocco delle dipendenze nel app/build.gradlefile

    dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
  5. Seleziona di nuovo Androidla modalità di visualizzazione file. Fai clic con il tasto destro sul appmodulo e vai a New->Folder->JNI Folder. Seleziona cambia posizione cartella e imposta src/main/jniLibs/.

  6. Selezionare di nuovo Projectla modalità di visualizzazione file e copiare tutte le cartelle da /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libsa app/src/main/jniLibs.

  7. Sempre in Androidmodalità visualizzazione file, fai clic con il pulsante destro del mouse sul appmodulo e scegli Link C++ Project with Gradle. Seleziona Crea sistema ndk-builde percorso al OpenCV.mkfile /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk.

    path_to_unzipped_files non deve contenere spazi, altrimenti si otterrà un errore!

Per verificare l'inizializzazione OpenCV aggiungi il messaggio Toast nel onCreate()metodo MainActivity :

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

Se l'inizializzazione ha esito positivo, vedrai truenel messaggio Toast, altrimenti vedrai false.


Sopra dici "sostituisci ID applicazione" org.opencv "con ....." ma non c'è nulla che segue il "con". Potete per favore chiarire? Intendi dire "rimuovi la voce applicationId e aggiungi due voci come segue:"
Dale,

@Dale Sì, è necessario sostituire la application ID "org.opencv"stringa con due stringhe: minSdkVersion 21e targetSdkVersion 28(in base ai valori nel file app / build.gradle)
Plo_Koon

Ho seguito tutti i passaggi come hai descritto. Ma ottenere l'errore E / art: dlopen ("/ data / app / com.example.objectsegmentation-1 / lib / arm64 / libopencv_java4.so", RTLD_LAZY) non riuscito: dlopen non riuscito: libreria "libc ++ _ shared.so" non trovata
Masthan

0

Chiunque affronti problemi durante la creazione di jniLibs cpp viene mostrato ..solo aggiungi ndk ..


0

Questo ha funzionato per me ed è stato facile come aggiungere una dipendenza gradle:

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

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

L'unico avvertimento è che dovevo usare un dispositivo di debug hardware poiché gli emulatori di arm funzionavano troppo lentamente per me (come dice AVD Manager) e, come descritto nel repository README, questa versione non include il supporto x86 o x86_64.

Sembra costruire e il test suggerito:

static {
    OpenCVLoader.initDebug();
}

sputa un sacco di output che sembra giusto per me.


Questo proveniva da un nuovo progetto in Android Studio. Non ho importato nulla, non ho scaricato nulla, ecc. Basta aggiungere la dipendenza gradle e la sincronizzazione.
Naumdev,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.