OpenCV in Android Studio

140

Ich möchte die OpenCV-Bibliothek in meiner App mit Android Studio verwenden. Ich habe die hier aufgeführten Anweisungen befolgt , erhalte jedoch eine Fehlermeldung

Konfiguration mit dem Namen 'Standard' nicht gefunden

Was kann falsch sein?

Ich benutze Android Studio 1.0 mit Gradle 2.2.1.

Bartosz Bialecki
quelle
1
Jetzt könnten wir Module mit Android Studio importieren und die Schritte könnten viel einfacher sein. Können Sie versuchen, diese stackoverflow.com/a/27356635/1180117
Kiran
Danke, es funktioniert. Schreibe es als Antwort, dann kann ich es akzeptieren.
Bartosz Bialecki
@BartoszBialecki @Kiran, ich habe es bis Schritt 4 befolgt. Ich kann das nativeVerzeichnis unter meinem sdk Verzeichnis nicht finden. Fehlt mir etwas?
Romantisches Elektron
1
@RomanticElectron Sie müssen natvie Verzeichnis aus dem SDK der OpenCV-Bibliothek hinzufügen, nicht Android SDK.
Bartosz Bialecki
@ BartoszBialecki danke
Romantic Electron

Antworten:

312

Die folgenden Schritte zur Verwendung von Android OpenCV sdk in Android Studio. Dies ist eine vereinfachte Version dieser ( 1 ) SO-Antwort.

  1. Laden Sie das neueste OpenCV sdk für Android von OpenCV.org herunter und dekomprimieren Sie die Zip-Datei.
  2. Importieren Sie OpenCV in Android Studio. Wählen Sie unter Datei -> Neu -> Importmodul den Ordner sdk / java im entpackten opencv-Archiv.
  3. Aktualisieren Sie build.gradle unter dem importierten OpenCV-Modul, um 4 Felder entsprechend Ihrem Projekt zu aktualisieren. Build.gradle a) compileSdkVersion b) buildToolsVersion c) minSdkVersion und d) targetSdkVersion.
  4. Fügen Sie die Modulabhängigkeit nach Anwendung -> Moduleinstellungen hinzu und wählen Sie die Registerkarte Abhängigkeiten . Klicken Sie unten auf das Symbol + , wählen Sie Modulabhängigkeit und wählen Sie das importierte OpenCV-Modul aus.
    • Für Android Studio v1.2.2, um auf die Moduleinstellungen zuzugreifen: Klicken Sie in der Projektansicht mit der rechten Maustaste auf das abhängige Modul -> Moduleinstellungen öffnen
  5. Kopieren Sie den libs- Ordner unter sdk / native nach Android Studio unter app / src / main .
  6. Benennen Sie in Android Studio das kopierte libs- Verzeichnis in jniLibs um, und wir sind fertig.

Schritt (6) ist, da Android Studio native Bibliotheken app/src/main/jniLibsanstelle älterer libsOrdner erwartet . Verpassen Sie für diejenigen, die neu in Android OpenCV sind, die folgenden Schritte nicht

  • include static{ System.loadLibrary("opencv_java"); }(Hinweis: Für OpenCV Version 3 sollten Sie in diesem Schritt stattdessen die Bibliothek laden opencv_java3.)
  • Wenn Sie in Schritt (5) Plattformbibliotheken wie x86 ignorieren, stellen Sie sicher, dass sich Ihr Gerät / Emulator nicht auf dieser Plattform befindet.

OpenCV ist in C / C ++ geschrieben. Java-Wrapper sind

  1. Android OpenCV SDK - OpenCV.org hat den Android Java Wrapper gewartet. Ich schlage diesen vor.
  2. OpenCV Java - OpenCV.org hat den automatisch generierten Desktop-Java-Wrapper verwaltet.
  3. JavaCV - Beliebter Java-Wrapper, der von unabhängigen Entwicklern verwaltet wird. Nicht Android-spezifisch. Diese Bibliothek ist möglicherweise nicht mehr mit neueren OpenCV-Versionen synchronisiert.
Kiran
quelle
1
Ich erhalte Fehler nach dem zweiten Schritt : Soll ich das lösche javadocsVerzeichnis .Es fragt mich auch für die Installation? android sdk 14Obwohl ich Targeting - Geräte , dass die Unterstützungandroid sdk 15
Romantisches Electron
1
@RomanticElectron Hoffen Sie, dass Sie OpenCV4Android 2.4.10 vom Link sourceforge.net/projects/opencvlibrary/files/opencv-android/… heruntergeladen haben und nicht diese Java-Desktop-Version?
Kiran
2
Ok, ich habe es verstanden. Ich dachte, Sie haben über das sdkInstallationsverzeichnis auf meinem System gesprochen, während Sie über das Verzeichnis gesprochen haben, das mit Android Open CV SDK.Ok abgeschlossen ist. Schritt 6. Wo füge ich ein static{ System.loadLibrary("opencv_java"); }?
Romantisches Elektron
5
@RomanticElectron wo schließen Sie static {System.loadLibrary ("opencv_java") ein; }? Sie sagen "Danke, ich habe es", aber es scheint keine Nachricht dazwischen zu geben. Dann sagst du, es wird nicht benötigt. Könnten Sie etwas mehr erklären? Vielen Dank.
Puntofisso
8
Für alle, die den android-14Fehler nach dem Importieren des Moduls in Schritt 2 haben, müssen Sie build.gradledas Verzeichnis im openCV-Verzeichnis in Ihrem Projekt manuell bearbeiten, wie in Schritt 3 gezeigt.
Paradite
144

Integration von OpenCV v3.1.0 in Android Studio v1.4.1 , Anweisungen mit zusätzlichen Details und Screenshots vom Typ "Dies ist das, was Sie erhalten sollten".

Der größte Teil des Kredits geht an Kiran, Kool, 1 "und SteveLiles von opencv.org für ihre Erklärungen. Ich füge diese Antwort hinzu, weil ich glaube, dass die Benutzeroberfläche von Android Studio jetzt stabil genug ist, um mit dieser Art von Integrationsmaterial zu arbeiten Außerdem muss ich diese Anleitung sowieso für unser Projekt schreiben.

Erfahrene AS-Entwickler werden einige dieser pedantischen finden. Diese Antwort richtet sich an Personen mit begrenzter Erfahrung in Android Studio.

  1. Erstellen Sie mit dem Projektassistenten ein neues Android Studio-Projekt (Menü: / Datei / Neues Projekt):

    • Nennen Sie es " cvtest1 "
    • Formfaktor: API 19, Android 4.4 (KitKat)
    • Leere Aktivität mit dem Namen MainActivity

      Sie sollten ein cvtest1- Verzeichnis haben, in dem dieses Projekt gespeichert ist. (Die Titelleiste von Android Studio zeigt Ihnen, wo sich cvtest1 befindet, wenn Sie das Projekt öffnen.)

  2. Stellen Sie sicher, dass Ihre App ordnungsgemäß ausgeführt wird. Versuchen Sie, etwas wie den Text "Hallo Welt" zu ändern, um zu bestätigen, dass der Erstellungs- / Testzyklus für Sie in Ordnung ist. (Ich teste mit einem Emulator eines API 19-Geräts).

  3. Laden Sie das OpenCV-Paket für Android v3.1.0 herunter und entpacken Sie es irgendwo in einem temporären Verzeichnis. (Stellen Sie sicher, dass es sich um das Paket speziell für Android handelt und nicht nur um das OpenCV für Java-Paket.) Ich nenne dieses Verzeichnis " unzip-dir ". Unter unzip-dir sollten Sie ein Verzeichnis sdk / native / libs mit Unterverzeichnissen haben, die mit beginnen Dinge wie Arm ..., Mips ... und x86 ... (eine für jede Art von "Architektur", auf der Android läuft)

  4. Importieren Sie OpenCV aus Android Studio als Modul in Ihr Projekt: Menü: / File / New / Import_Module :

    • Quellverzeichnis : {unzip-dir} / sdk / java
    • Modulname : Android Studio füllt dieses Feld automatisch mit openCVLibrary310 aus (der genaue Name spielt wahrscheinlich keine Rolle, aber wir werden damit fortfahren ).
    • Klicken Sie auf Weiter . Sie erhalten einen Bildschirm mit drei Kontrollkästchen und Fragen zu Gläsern, Bibliotheken und Importoptionen. Alle drei sollten überprüft werden. Klicken Sie auf Fertig stellen.

      Android Studio beginnt mit dem Import des Moduls und es wird eine Datei import-summary.txt angezeigt , die eine Liste der nicht importierten Dateien (hauptsächlich Javadoc-Dateien) und andere Informationen enthält. Geben Sie hier die Bildbeschreibung ein

      Sie erhalten jedoch auch die Fehlermeldung, dass das Ziel mit der Hash-Zeichenfolge 'android-14' nicht gefunden werden konnte . Dies liegt daran, dass die Datei build.gradle in der von Ihnen heruntergeladenen OpenCV-Zip-Datei besagt, dass sie mit der Android API Version 14 kompiliert werden soll, die Sie mit Android Studio v1.4.1 standardmäßig nicht haben. Geben Sie hier die Bildbeschreibung ein

  5. Öffnen Sie den Projektstrukturdialog ( Menü: / File / Project_Structure ). Wählen Sie das Modul "App" aus, klicken Sie auf die Registerkarte " Abhängigkeiten" und fügen Sie Folgendes hinzu : openCVLibrary310 als Modulabhängigkeit . Wenn Sie Add / Module_Dependency auswählen , sollte es in der Liste der Module angezeigt werden, die Sie hinzufügen können. Es wird nun als Abhängigkeit angezeigt , aber im Ereignisprotokoll werden einige weitere Fehler angezeigt, bei denen Android-14 nicht gefunden werden kann.

  6. Suchen Sie in der Datei build.gradle nach Ihrem App-Modul. In einem Android-Projekt gibt es mehrere build.gradle-Dateien. Die gewünschte befindet sich im Verzeichnis cvtest1 / app und sieht in der Projektansicht wie build.gradle (Modul: App) aus . Beachten Sie die Werte dieser vier Felder:

    • compileSDKVersion (meins sagt 23)
    • buildToolsVersion (meins sagt 23.0.2)
    • minSdkVersion (meins sagt 19)
    • targetSdkVersion (meins sagt 23)
  7. Ihr Projekt verfügt jetzt über ein Verzeichnis cvtest1 / OpenCVLibrary310, das jedoch in der Projektansicht nicht sichtbar ist:

Geben Sie hier die Bildbeschreibung ein

Verwenden Sie ein anderes Tool, z. B. einen Dateimanager, und wechseln Sie in dieses Verzeichnis. Sie können auch die Projektansicht von Android auf Projektdateien umschalten und dieses Verzeichnis wie in diesem Screenshot gezeigt finden: Geben Sie hier die Bildbeschreibung ein

Im Inneren befindet sich eine weitere build.gradle- Datei (im obigen Screenshot hervorgehoben). Aktualisieren Sie diese Datei mit den vier Werten aus Schritt 6.

  1. Synchronisieren Sie Ihr Projekt erneut und bereinigen Sie es anschließend. (Menü: / Build / Clean_Project ) Es sollte fehlerfrei bereinigt und erstellt werden, und im Bildschirm 0: Nachrichten sollten viele Verweise auf : openCVLibrary310 angezeigt werden.

    Geben Sie hier die Bildbeschreibung ein

    Zu diesem Zeitpunkt sollte das Modul in der Projekthierarchie wie die App als openCVLibrary310 angezeigt werden . (Beachten Sie, dass ich in diesem kleinen Dropdown-Menü von der Projektansicht zur Android-Ansicht zurückgeschaltet habe ). Sie sollten auch eine zusätzliche build.gradle- Datei unter "Gradle Scripts" sehen, aber ich finde die Android Studio-Oberfläche etwas fehlerhaft und manchmal funktioniert dies nicht sofort. Versuchen Sie also, Android Studio erneut zu synchronisieren, zu bereinigen oder sogar neu zu starten.

    Sie sollten das openCVLibrary310-Modul mit allen OpenCV-Funktionen unter Java wie in diesem Screenshot sehen:

    Geben Sie hier die Bildbeschreibung ein

  2. Kopieren Sie das Verzeichnis {unzip-dir} / sdk / native / libs (und alles darunter) in Ihr Android-Projekt nach cvtest1 / OpenCVLibrary310 / src / main / und benennen Sie Ihre Kopie von libs in jniLibs um . Sie sollten jetzt ein Verzeichnis cvtest1 / OpenCVLibrary310 / src / main / jniLibs haben . Synchronisieren Sie Ihr Projekt erneut, und dieses Verzeichnis sollte jetzt in der Projektansicht unter openCVLibrary310 angezeigt werden .

    Geben Sie hier die Bildbeschreibung ein

  3. Gehen Sie zur onCreate-Methode von MainActivity.java und fügen Sie diesen Code hinzu:

    if (!OpenCVLoader.initDebug()) {
        Log.e(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), not working.");
    } else {
        Log.d(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), working.");
    }
    

    Führen Sie dann Ihre Anwendung aus. Im Android-Monitor sollten folgende Zeilen angezeigt werden: Geben Sie hier die Bildbeschreibung ein (Ich weiß nicht, warum diese Zeile mit der Fehlermeldung vorhanden ist.)

  4. Versuchen Sie nun, tatsächlich einen openCV-Code zu verwenden. Im folgenden Beispiel habe ich eine JPG-Datei in das Cache-Verzeichnis der Anwendung cvtest1 auf dem Android-Emulator kopiert. Der folgende Code lädt dieses Bild, führt den Algorithmus zur Erkennung kniffliger Kanten aus und schreibt die Ergebnisse in eine PNG-Datei im selben Verzeichnis zurück.

    Fügen Sie diesen Code direkt unter den Code aus dem vorherigen Schritt ein und ändern Sie ihn so, dass er Ihren eigenen Dateien / Verzeichnissen entspricht.

    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. Führen Sie Ihre Anwendung aus. Ihr Emulator sollte ein Schwarzweiß-Randbild erstellen. Sie können den Android-Gerätemonitor verwenden, um die Ausgabe abzurufen, oder eine Aktivität schreiben, um sie anzuzeigen.

Die Fallstricke :

  • Wenn Sie Ihre Zielplattform unter KitKat senken, funktionieren einige der OpenCV-Bibliotheken nicht mehr, insbesondere die Klassen, die sich auf org.opencv.android.Camera2Renderer und andere verwandte Klassen beziehen. Sie können dies wahrscheinlich umgehen, indem Sie einfach die entsprechenden OpenCV-Java-Dateien entfernen.
  • Wenn Sie Ihre Zielplattform auf Lollipop oder höher erhöhen, funktioniert mein Beispiel zum Laden einer Datei möglicherweise nicht, da die Verwendung absoluter Dateipfade verpönt ist. Daher müssen Sie möglicherweise das Beispiel ändern, um eine Datei aus der Galerie oder an einer anderen Stelle zu laden. Es gibt zahlreiche Beispiele.
ssimm
quelle
2
16-Feb edit: jniLibs jetzt im openCVLibrary310-Verzeichnis, nicht im Haupt-App-Verzeichnis. Beides funktioniert, aber es scheint mir sauberer, sie im OpenCV-Teil zu behalten. Plus mehr Screenshots und den Teil "Gotchas".
SSimm
Ich denke einige Importanweisungen fehlen, sonst sehr gute Arbeit! +1
Allan Nørgaard
1
Ich bin Ihrer Antwort gefolgt, aber gescheitert. 1 Ich habe den Fehler 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 Was über diesen Fehler habe ich Schritt für Schritt gemacht, wie Sie geschrieben haben.
Devendra Singh
2
@ DevendraSingh Ich habe den gleichen Fehler wie Sie bekommen, aber ich habe festgestellt, dass ich Schritt 9 verpasst habe.
aasu
2
Was ist, wenn wir in C ++ für OpenCV auf Android Studio codieren möchten?
user8663682
37

Für alle, die das Gefühl hatten, mit all den Schritten und Screenshots der (großartigen!) Antworten oben davonlaufen zu wollen, funktionierte dies für mich mit android studio 2.2.1:

  1. Erstellen Sie ein neues Projekt, benennen Sie es wie gewünscht und übernehmen Sie die Standardeinstellung (minSdkVersion 15 ist in Ordnung).
  2. Laden Sie die Zip-Datei von hier herunter : https://sourceforge.net/projects/opencvlibrary/files/opencv-android/ (Ich habe die Version 3.1.0 heruntergeladen, aber möglicherweise gibt es neuere Versionen).
  3. Entpacken Sie die Zip-Datei. Der beste Ort befindet sich in Ihrem Arbeitsbereich-Ordner, aber das spielt keine Rolle.
  4. Android StudioKlicken Sie im Inneren auf File->New-> Import Moduleund navigieren Sie zu \path_to_your_unzipped_file\OpenCV-android-sdk\sdk\javaund klicken Sie auf OK. Akzeptieren Sie dann alle Standarddialoge.
  5. In der gradleDatei des app Moduls, fügen Sie diese an die Abhängigkeiten Block:

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

Wobei XYZ die genaue Version ist, die Sie herunterladen, zum Beispiel in meinem Fall:

    dependencies {
        compile project(':openCVLibrary320')
        //rest of code
    }
Yshahak
quelle
1
Schön und einfach, danke ;-) Funktioniert auch für die Version 3.2.0.
Blacharnia
2
Vielen Dank, es ist in der Tat die einfachere Lösung. Ein Punkt von mir. Das neue OpenCV-Modul konnte nicht kompiliert werden. Die Antwort hier half mir, dieses Problem zu beheben stackoverflow.com/a/40302788/408780
Tima
Um das zu ergänzen, was @blacharnia gesagt hat, stellen Sie einfach sicher, dass Sie 'compile project (': openCVLibrary320 ')' im Abschnitt Cradle Dependencies anstelle von 310
Abraham Philip
Um die obigen Kommentare zu ergänzen, verwenden Sie möglicherweise allgemeiner "compile project (': openCVLibraryXYZ')", wobei XYZ die Versionsnummer des openCV Android SDK ohne die 'Punkte' ist - dies funktioniert jetzt auch für Version 3.4.0 -> dh benutze "compile project (': openCVLibrary340')"
Mick
@ Mick danke, ich habe die Antwort nach deinem Vorschlag bearbeitet.
Yshahak
9

Android Studio 3.4 + OpenCV 4.1

  1. Laden Sie die neueste OpenCV-Zip-Datei von hier herunter (die aktuellste Version ist 4.1.0) und entpacken Sie sie in Ihrem Arbeitsbereich oder in einem anderen Ordner.

  2. Erstellen Sie normal ein neues Android Studio-Projekt. Klicken Sie auf File->New->Import Module, navigieren Sie zu /path_to_unzipped_files/OpenCV-android-sdk/sdk/java, legen opencvSie den NextModulnamen fest , klicken Sie auf und deaktivieren Sie alle Optionen auf dem Bildschirm.

  3. Aktivieren Sie den Dateiansichtsmodus Project(Standardmodus ist Android). In der opencv/build.gradleDateiänderung apply plugin: 'com.android.application'auf apply plugin: 'com.android.library'und ersetzt application ID "org.opencv"mit

    minSdkVersion 21
    targetSdkVersion 28

    (gemäß den Werten in app/build.gradle). Projekt mit Gradle-Dateien synchronisieren.

  4. Fügen Sie diese Zeichenfolge dem Abhängigkeitsblock in der app/build.gradleDatei hinzu

    dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
  5. Wählen Sie erneut den AndroidDateiansichtsmodus. Klicken Sie mit der rechten Maustaste auf das appModul und gehen Sie zu New->Folder->JNI Folder. Wählen Sie Ordner ändern ändern und legen Sie fest src/main/jniLibs/.

  6. Wählen Sie erneut den ProjectDateiansichtsmodus und kopieren Sie alle Ordner von /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libsnach app/src/main/jniLibs.

  7. Wieder in AndroidMode Dateiansicht rechts auf klicken appModul und wählen Link C++ Project with Gradle. Wählen Sie Build System ndk-buildund Pfad zur OpenCV.mkDatei /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk.

    path_to_unzipped_files darf keine Leerzeichen enthalten, sonst wird ein Fehler angezeigt!

Um die OpenCV-Initialisierung zu überprüfen, fügen Sie eine Toast-Nachricht in die MainActivity- onCreate()Methode ein:

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

Wenn die Initialisierung erfolgreich ist, wird truein der Toast-Nachricht etwas anderes angezeigt false.

Plo_Koon
quelle
Oben sagen Sie "Anwendungs-ID ersetzen" org.opencv "durch .....", aber nach "mit" folgt nichts. Können Sie bitte klarstellen? Wollen Sie damit sagen "Entfernen Sie den Eintrag applicationId und fügen Sie zwei Einträge wie folgt hinzu:"
Dale
@ Dale Ja, Sie sollten die application ID "org.opencv"Zeichenfolge durch zwei Zeichenfolgen ersetzen : minSdkVersion 21und targetSdkVersion 28(gemäß den Werten in der Datei app / build.gradle)
Plo_Koon
Ich habe alle von Ihnen beschriebenen Schritte ausgeführt. Der Fehler E / art: dlopen ("/ data / app / com.example.objectsegmentation-1 / lib / arm64 / libopencv_java4.so", RTLD_LAZY) ist jedoch fehlgeschlagen: dlopen fehlgeschlagen: Bibliothek "libc ++ _ shared.so" nicht gefunden
Masthan
0

Jeder, der beim Erstellen von jniLibs cpp auf Probleme stößt, wird angezeigt. Fügen Sie einfach ndk hinzu.

Aklesh Singh
quelle
0

Dies funktionierte für mich und war so einfach wie das Hinzufügen einer Gradle-Abhängigkeit:

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

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

Die einzige Einschränkung war, dass ich ein Hardware-Debugging-Gerät verwenden musste, da Armemulatoren für mich zu langsam liefen (wie AVD Manager sagt), und wie in der Repo-README beschrieben, enthält diese Version keine x86- oder x86_64-Unterstützung.

Es scheint zu bauen und der vorgeschlagene Test:

static {
    OpenCVLoader.initDebug();
}

spuckt eine Menge Ausgabe aus, die für mich ungefähr richtig aussieht.

Naumdev
quelle
Dies war aus einem neuen Projekt in Android Studio. Ich habe nichts importiert, nichts heruntergeladen usw. Fügen Sie einfach die Gradle-Abhängigkeit hinzu und synchronisieren Sie sie.
Naumdev
0

In Ihrem build.gradle

repositories {
  jcenter()
}

implementation 'com.quickbirdstudios:opencv:4.1.0'

Weitere Infos

Raymond Chenon
quelle