OpenCV w Android Studio

140

Chcę używać biblioteki OpenCV w mojej aplikacji z Android Studio. Postępowałem zgodnie z instrukcjami podanymi tutaj, ale pojawia się błąd

Nie znaleziono konfiguracji o nazwie „domyślna”

Co może być nie tak?

Używam Android Studio 1.0 z gradle 2.2.1.

Bartosza Białeckiego
źródło
1
Teraz możemy importować moduły za pomocą Android Studio, a kroki mogą być znacznie prostsze. Czy możesz wypróbować ten stackoverflow.com/a/27356635/1180117
Kiran,
Dziękuję, działa. Napisz to jako odpowiedź, a wtedy zaakceptuję.
Bartosz Białecki
@BartoszBialecki @Kiran, przeszedłem do kroku 4, nie mogę znaleźć nativekatalogu w swoim sdk katalogu, czy czegoś brakuje?
Romantic Electron
1
@RomanticElectron musisz dodać katalog natvie z sdk biblioteki OpenCV, a nie sdk dla Androida.
Bartosz Białecki
@BartoszBialecki thanks
Romantic Electron

Odpowiedzi:

312

Poniższe kroki dotyczące korzystania z zestawu SDK OpenCV systemu Android w Android Studio. To jest uproszczona wersja tej ( 1 ) odpowiedzi SO.

  1. Pobierz najnowszy pakiet SDK OpenCV dla Androida z OpenCV.org i rozpakuj plik zip.
  2. Importuj OpenCV do Android Studio , z Plik -> Nowy -> Importuj moduł , wybierz folder sdk / java w rozpakowanym archiwum opencv.
  3. Zaktualizuj build.gradle w zaimportowanym module OpenCV, aby zaktualizować 4 pola w celu dopasowania do projektu build.gradle a) compileSdkVersion b) buildToolsVersion c) minSdkVersion id) targetSdkVersion.
  4. Dodaj zależność modułu według aplikacji -> Ustawienia modułu i wybierz kartę Zależności . Kliknij ikonę + u dołu, wybierz Zależność modułu i wybierz zaimportowany moduł OpenCV.
    • W przypadku Android Studio v1.2.2, aby uzyskać dostęp do ustawień modułu: w widoku projektu kliknij prawym przyciskiem myszy moduł zależny -> Otwórz ustawienia modułu
  5. Skopiuj folder libs z sdk / native do Android Studio w app / src / main .
  6. W Android Studio zmień nazwę skopiowanego katalogu libs na jniLibs i gotowe.

Krok (6) jest taki, ponieważ Android studio oczekuje natywnych bibliotek app/src/main/jniLibszamiast starszego libsfolderu. Dla tych, którzy są nowicjuszami w Android OpenCV, nie przegap poniższych kroków

  • include static{ System.loadLibrary("opencv_java"); }(Uwaga: w przypadku OpenCV w wersji 3 na tym etapie należy zamiast tego załadować bibliotekę opencv_java3).
  • W kroku (5), jeśli zignorujesz jakiekolwiek biblioteki platformowe, takie jak x86, upewnij się, że Twoje urządzenie / emulator nie znajduje się na tej platformie.

OpenCV napisany jest w C / C ++. Otoki Java są

  1. Android OpenCV SDK - OpenCV.org obsługuje opakowanie Android Java. Proponuję ten.
  2. OpenCV Java - OpenCV.org utrzymuje automatycznie generowany pakiet Java dla komputerów stacjonarnych.
  3. JavaCV - popularne opakowanie Java obsługiwane przez niezależnych programistów. Nie dotyczy Androida. Ta biblioteka może stracić synchronizację z nowszymi wersjami OpenCV.
Kiran
źródło
1
Otrzymuję błędy po wykonaniu drugiego kroku, czy mam usunąć javadocskatalog? .Prosi mnie również o zainstalowanie, android sdk 14chociaż celuję w urządzenia, które obsługująandroid sdk 15
Romantic Electron
1
@RomanticElectron Mam nadzieję, że pobrałeś OpenCV4Android 2.4.10 z linku sourceforge.net/projects/opencvlibrary/files/opencv-android/ ... a nie tę java na komputer?
Kiran
2
OK, rozumiem, myślałem, że mówisz o sdkkatalogu instalacyjnym w moim systemie, kiedy mówisz o katalogu, który jest dołączony. Android Open CV SDKOK, wykonałem krok 6. Gdzie mam dołączyć static{ System.loadLibrary("opencv_java"); }?
Romantic Electron
5
@RomanticElectron, gdzie dodajesz static {System.loadLibrary ("opencv_java"); }? Mówisz „Dzięki, mam to”, ale wydaje się, że pomiędzy nimi nie ma żadnej wiadomości. Wtedy mówisz, że to nie jest potrzebne. Czy mógłbyś wyjaśnić trochę więcej? Dzięki.
puntofisso
8
dla każdego, kto ma android-14błąd po zaimportowaniu modułu w kroku 2, musisz ręcznie edytować build.gradlekatalog openCV w swoim projekcie, jak pokazano w kroku 3.
paradite
144

Integracja OpenCV 3.1.0 z Android Studio v1.4.1 , instrukcje z dodatkowymi szczegółami i zrzuty ekranu typu „to jest to, co powinieneś-powinieneś”.

Większość zasługi dla Kirana, Koola 1 "i SteveLilesa z opencv.org za ich wyjaśnienia. Dodaję tę odpowiedź, ponieważ uważam, że interfejs Android Studio jest teraz wystarczająco stabilny, aby pracować z tego typu integracją Ponadto i tak muszę napisać te instrukcje dla naszego projektu.

Doświadczeni programiści AS znajdą trochę tego pedantycznego. Ta odpowiedź jest skierowana do osób z ograniczonym doświadczeniem w Android Studio.

  1. Utwórz nowy projekt Android Studio za pomocą kreatora projektów (Menu: / Plik / Nowy projekt):

    • Nazwij to „ cvtest1
    • Format: API 19, Android 4.4 (KitKat)
    • Puste działanie o nazwie MainActivity

      Powinieneś mieć katalog cvtest1, w którym jest przechowywany ten projekt. (pasek tytułu Android Studio pokazuje, gdzie jest cvtest1 po otwarciu projektu)

  2. Sprawdź, czy Twoja aplikacja działa poprawnie. Spróbuj zmienić coś, na przykład tekst „Hello World”, aby potwierdzić, że cykl kompilacji / testowania jest dla Ciebie odpowiedni. (Testuję na emulatorze urządzenia API 19).

  3. Pobierz pakiet OpenCV dla Androida 3.1.0 i rozpakuj go gdzieś w jakimś katalogu tymczasowym. (Upewnij się, że jest to pakiet przeznaczony specjalnie dla systemu Android, a nie tylko pakiet OpenCV for Java). Nazwę ten katalog „ unzip-dir ” Poniżej unzip-dir powinieneś mieć katalog sdk / native / libs z podkatalogami zaczynającymi się od rzeczy takie jak arm ..., mips ... i x86 ... (po jednym dla każdego typu „architektury”, na której działa Android)

  4. Z Android Studio zaimportuj OpenCV do swojego projektu jako moduł: Menu: / File / New / Import_Module :

    • Katalog źródłowy: {unzip-dir} / sdk / java
    • Nazwa modułu: Android studio automatycznie wypełnia to pole openCVLibrary310 (dokładna nazwa prawdopodobnie nie ma znaczenia, ale zajmiemy się tym).
    • Kliknij dalej . Otrzymasz ekran z trzema polami wyboru i pytaniami dotyczącymi słoików, bibliotek i opcji importu. Wszystkie trzy należy sprawdzić. Kliknij Zakończ.

      Android Studio zaczyna importować moduł i pojawia się plik import-summary.txt , który zawiera listę elementów, które nie zostały zaimportowane (głównie pliki javadoc) oraz inne informacje. wprowadź opis obrazu tutaj

      Ale można również uzyskać komunikat o błędzie nie udało się znaleźć cel z hash ciąg „android-14” ... . Dzieje się tak, ponieważ plik build.gradle w pobranym pliku zip OpenCV mówi, że należy kompilować za pomocą interfejsu Android API w wersji 14, którego domyślnie nie masz w Android Studio v1.4.1. wprowadź opis obrazu tutaj

  5. Otwórz okno dialogowe struktury projektu ( Menu: / File / Project_Structure ). Wybierz moduł „aplikacja”, kliknij zakładkę Zależności i dodaj : openCVLibrary310 jako Zależność modułu. Po wybraniu Dodaj / Module_Dependency powinien pojawić się na liście modułów, które możesz dodać. Teraz pojawi się jako zależność, ale w dzienniku zdarzeń pojawi się kilka innych błędów braku możliwości znalezienia Androida-14 .

  6. Poszukaj w pliku build.gradle swojego modułu aplikacji. W projekcie systemu Android znajduje się wiele plików build.gradle. Ten, który chcesz, znajduje się w katalogu cvtest1 / app iz widoku projektu wygląda jak build.gradle (moduł: aplikacja) . Zwróć uwagę na wartości tych czterech pól:

    • compileSDKVersion (mój mówi 23)
    • buildToolsVersion (mój mówi 23.0.2)
    • minSdkVersion (mój mówi 19)
    • targetSdkVersion (mój mówi 23)
  7. Twój projekt ma teraz katalog cvtest1 / OpenCVLibrary310, ale nie jest on widoczny w widoku projektu:

wprowadź opis obrazu tutaj

Użyj innego narzędzia, na przykład dowolnego menedżera plików, i przejdź do tego katalogu. Możesz także przełączyć widok projektu z Androida na Project Files i możesz znaleźć ten katalog, jak pokazano na tym zrzucie ekranu: wprowadź opis obrazu tutaj

Wewnątrz znajduje się kolejny plik build.gradle (zaznaczony na powyższym zrzucie ekranu). Zaktualizuj ten plik czterema wartościami z kroku 6.

  1. Ponownie zsynchronizuj projekt, a następnie wyczyść go / odbuduj. (Menu: / build / Clean_Project ) Należy oczyścić i budować bez błędów i powinieneś zobaczyć wiele odniesień do : openCVLibrary310 w 0: Wiadomości ekranu.

    wprowadź opis obrazu tutaj

    W tym momencie moduł powinien pojawić się w hierarchii projektu jako openCVLibrary310 , podobnie jak app . (Należy pamiętać, że w tym menu rozwijanym trochę przeszedłem z powrotem z Projektu widokiem na Androida View ). Powinieneś także zobaczyć dodatkowy plik build.gradle w sekcji „Skrypty Gradle”, ale uważam, że interfejs Android Studio jest trochę zawiły i czasami nie robi tego od razu. Spróbuj więc ponownie zsynchronizować, wyczyścić, a nawet ponownie uruchomić Android Studio.

    Powinieneś zobaczyć moduł openCVLibrary310 ze wszystkimi funkcjami OpenCV w Javie, jak na tym zrzucie ekranu:

    wprowadź opis obrazu tutaj

  2. Skopiuj katalog {unzip-dir} / sdk / native / libs (i wszystko, co się w nim znajduje) do projektu na Androida, do cvtest1 / OpenCVLibrary310 / src / main / , a następnie zmień nazwę kopii z libs na jniLibs . Powinieneś teraz mieć katalog cvtest1 / OpenCVLibrary310 / src / main / jniLibs . Ponownie zsynchronizuj swój projekt, a ten katalog powinien teraz pojawić się w widoku projektu w openCVLibrary310 .

    wprowadź opis obrazu tutaj

  3. Przejdź do metody onCreate pliku MainActivity.java i dołącz ten kod:

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

    Następnie uruchom aplikację. Powinieneś zobaczyć takie linie w monitorze Androida: wprowadź opis obrazu tutaj (Nie wiem, dlaczego jest tam ta linia z komunikatem o błędzie)

  4. Teraz spróbuj faktycznie użyć kodu openCV. W poniższym przykładzie skopiowałem plik .jpg do katalogu pamięci podręcznej aplikacji cvtest1 na emulatorze Androida. Poniższy kod ładuje ten obraz, uruchamia sprytny algorytm wykrywania krawędzi, a następnie zapisuje wyniki z powrotem do pliku .png w tym samym katalogu.

    Umieść ten kod tuż pod kodem z poprzedniego kroku i zmień go, aby pasował do twoich własnych plików / katalogów.

    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. Uruchom aplikację. Twój emulator powinien utworzyć czarno-biały obraz „krawędzi”. Możesz użyć Android Device Monitor, aby pobrać dane wyjściowe lub napisać działanie, aby je pokazać.

Do pułapek :

  • Jeśli obniżysz platformę docelową poniżej KitKat, niektóre biblioteki OpenCV przestaną działać, w szczególności klasy związane z org.opencv.android.Camera2Renderer i innymi pokrewnymi klasami. Prawdopodobnie możesz to obejść, po prostu usuwając odpowiednie pliki OpenCV .java.
  • Jeśli podniesiesz platformę docelową do Lollipopa lub powyżej, mój przykład ładowania pliku może nie działać, ponieważ użycie bezwzględnych ścieżek plików jest źle widziane. Być może będziesz musiał zmienić przykład, aby załadować plik z galerii lub gdzie indziej. Istnieje wiele przykładów.
ssimm
źródło
2
Edycja z 16 lutego: jniLibs teraz w katalogu openCVLibrary310, a nie w głównym katalogu aplikacji. Albo działa, ale wydaje mi się czystsze, jeśli trzymam je w części opencv. Plus więcej zrzutów ekranu i część „Gotchas”.
ssimm
Myślę, że brakuje niektórych instrukcji importu, w przeciwnym razie bardzo dobra robota! +1
Allan Nørgaard
1
Poszedłem za twoją odpowiedzią, ale zawiodłem. 1 Mam błąd 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 Co to za błąd zrobiłem krok po kroku, jak napisałeś.
Devendra Singh
2
@DevendraSingh Mam ten sam błąd, co ty, ale zdałem sobie sprawę, że przegapiłem krok 9.
aasu
2
co jeśli chcemy kodować w C ++ dla opencv na Android Studio?
user8663682
37

Dla wszystkich, którzy czuli, że chcą uciec ze wszystkimi krokami i zrzutami ekranu z (świetnie!) Powyższych odpowiedzi, działało to dla mnie z android studio 2.2.1:

  1. Utwórz nowy projekt, nazwij go tak, jak chcesz i wybierz domyślny (minSdkVersion 15 jest w porządku).
  2. Pobierz plik zip stąd: https://sourceforge.net/projects/opencvlibrary/files/opencv-android/ (pobrałem wersję 3.1.0, ale mogą istnieć nowsze wersje).
  3. Rozpakuj plik zip, najlepsze miejsce jest w folderze obszaru roboczego, ale to nie ma znaczenia.
  4. Wewnątrz Android Studiokliknij File->New-> Import Modulei przejdź do \path_to_your_unzipped_file\OpenCV-android-sdk\sdk\javai naciśnij OK, a następnie zaakceptuj wszystkie domyślne okna dialogowe.
  5. W gradlepliku swojego app modułu dodaj to do bloku zależności:

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

Gdzie XYZ to dokładna wersja, którą pobierasz, na przykład w moim przypadku:

    dependencies {
        compile project(':openCVLibrary320')
        //rest of code
    }
yshahak
źródło
1
Ładnie i prosto, thnx ;-) Działa również dla wersji 3.2.0.
blacharnia
2
Dziękuję, to rzeczywiście łatwiejsze rozwiązanie. Jeden punkt ode mnie. Nie można skompilować nowego modułu OpenCV. Odpowiedź tutaj pomogła mi rozwiązać ten problem stackoverflow.com/a/40302788/408780
Tima
aby dodać do tego, co powiedział @blacharnia, po prostu upewnij się, że używasz 'compile project (': openCVLibrary320 ')' w sekcji zależności cradle zamiast 310
Abraham Philip
Może bardziej ogólnie, aby dodać do powyższych komentarzy, użyj opcji „compile project (': openCVLibraryXYZ')”, gdzie XYZ to numer wersji pakietu openCV Android SDK bez „kropek” - to działa również teraz dla wersji 3.4.0 -> ie użyj opcji „kompiluj projekt (': openCVLibrary340')”
Mick
@Mick dzięki, zredagowałem odpowiedź zgodnie z twoją sugestią.
yshahak
9

Android Studio 3.4 + OpenCV 4.1

  1. Pobierz najnowszy plik zip OpenCV stąd (aktualna najnowsza wersja to 4.1.0) i rozpakuj go w swoim obszarze roboczym lub w innym folderze.

  2. Utwórz nowy projekt Android Studio normalnie. Kliknij File->New->Import Module, przejdź do /path_to_unzipped_files/OpenCV-android-sdk/sdk/java, ustaw nazwę modułu jako opencv, kliknij Nexti usuń zaznaczenie wszystkich opcji na ekranie.

  3. Włącz Projecttryb przeglądania plików (tryb domyślny to Android). W opencv/build.gradlemodyfikacji pliku apply plugin: 'com.android.application'do apply plugin: 'com.android.library'i wymienić application ID "org.opencv"z

    minSdkVersion 21
    targetSdkVersion 28

    (zgodnie z wartościami w app/build.gradle). Synchronizuj projekt z plikami Gradle.

  4. Dodaj ten ciąg do bloku zależności w app/build.gradlepliku

    dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
  5. Wybierz ponownie Androidtryb przeglądania plików. Kliknij prawym przyciskiem myszy appmoduł i gotowe New->Folder->JNI Folder. Wybierz zmień lokalizację folderu i ustaw src/main/jniLibs/.

  6. Wybierz ponownie Projecttryb przeglądania plików i skopiuj wszystkie foldery z /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libsdo app/src/main/jniLibs.

  7. Ponownie w Androidtrybie przeglądania plików kliknij prawym przyciskiem myszy appmoduł i wybierz Link C++ Project with Gradle. Wybierz opcję Build System ndk-buildi ścieżkę do OpenCV.mkpliku /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk.

    path_to_unzipped_files nie może zawierać spacji, w przeciwnym razie wystąpi błąd!

Aby sprawdzić inicjalizację OpenCV dodaj wiadomość Toast w onCreate()metodzie MainActivity :

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

Jeśli inicjalizacja się powiedzie, zobaczysz truekomunikat Toast, w przeciwnym razie zobaczysz false.

Plo_Koon
źródło
Powyżej napisano „zamień identyfikator aplikacji” org.opencv na… ”, ale po„ na ”nie ma nic. Czy możesz wyjaśnić? Czy masz na myśli powiedzieć „usuń wpis applicationId i dodaj dwa wpisy w następujący sposób:”
Dale
@Dale Tak, należy zamienić application ID "org.opencv"ciąg na dwa ciągi: minSdkVersion 21i targetSdkVersion 28(zgodnie z wartościami w pliku app / build.gradle)
Plo_Koon
Wykonałem wszystkie kroki, jak opisałeś. Ale otrzymywanie błędu E / art: dlopen ("/ data / app / com.example.objectsegmentation-1 / lib / arm64 / libopencv_java4.so", RTLD_LAZY) nie powiodło się: dlopen failed: biblioteka "libc ++ _ shared.so" nie została znaleziona
Masthan
0

Każdy, kto napotkał problem podczas tworzenia cpp jniLibs, jest wyświetlany .. wystarczy dodać ndk ..

Aklesh Singh
źródło
0

To zadziałało dla mnie i było tak proste, jak dodanie zależności od stopni:

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

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

Jedynym zastrzeżeniem jest to, że musiałem użyć sprzętowego urządzenia do debugowania, ponieważ emulatory ramion działały dla mnie zbyt wolno (jak mówi AVD Manager) i, jak opisano w README repozytorium, ta wersja nie obejmuje obsługi x86 lub x86_64.

Wydaje się, że buduje i sugerowany test:

static {
    OpenCVLoader.initDebug();
}

wypluwa plik, który wydaje mi się właściwy.

Naumdev
źródło
To był nowy projekt w Android Studio. Niczego nie zaimportowałem, nie pobrałem itd. Po prostu dodaj zależność gradle i zsynchronizuj.
Naumdev
0

W pliku build.gradle

repositories {
  jcenter()
}

implementation 'com.quickbirdstudios:opencv:4.1.0'

Więcej informacji

Raymond Chenon
źródło