Android Studio'da OpenCV


141

Android Studio ile uygulamamda OpenCV kütüphanesini kullanmak istiyorum. Burada bulunan talimatları takip ettim ama hata alıyorum

'Varsayılan' adıyla yapılandırma bulunamadı

Ne yanlış olabilir?

2.2.1 sürümüyle Android Studio 1.0 kullanıyorum.


1
Artık Android stüdyosu ile modülleri içe aktarabiliriz ve adımlar çok daha basit olabilir. Bunu deneyebilir miyim stackoverflow.com/a/27356635/1180117
Kiran

Teşekkür ederim, işe yarıyor. Cevap olarak yaz, sonra kabul edebilirim.
Bartosz Bialecki

@BartoszBialecki @Kiran, ben adım No.4 kadar takip ettik, ben bulamıyorum nativebenim altında dizin sdk directory.Am eksik bir şey?
Romantic Electron

1
@RomanticElectron Android sdk değil, OpenCV kütüphanesinin sdk'sinden natvie dizini eklemelisiniz.
Bartosz Bialecki

BartoszBialecki thanks
Romantic Electron

Yanıtlar:


312

Android Studio'da Android OpenCV SDK'sını kullanmak için aşağıdaki adımlar. Bu, bu ( 1 ) SO cevabının basitleştirilmiş bir versiyonudur .

  1. İndir Android için en son OpenCV sdk OpenCV.org ve zip dosyasını açmak.
  2. OpenCV'yi Android Studio'ya aktarın , Dosya -> Yeni -> Modülü İçe Aktar , sıkıştırılmamış opencv arşivinde sdk / java klasörünü seçin .
  3. A. Derle a) compileSdkVersion b) buildToolsVersion c) minSdkVersion ve d) targetSdkVersion.
  4. Modül bağımlılığı ekle tarafından Başvurusu -> Modül Ayarları ve seçmek Bağımlılıklar sekmesini. Altta + simgesini tıklayın , Modül Bağımlılığı'nı ve içe aktarılan OpenCV modülünü seçin.
    • Android Studio v1.2.2 için, Modül Ayarlarına erişmek için: proje görünümünde, bağımlı modülü sağ tıklayın -> Modül Ayarlarını Aç
  5. Sdk / native altındaki libs klasörünü app / src / main altında Android Studio'ya kopyalayın .
  6. Android Studio'da, kopyalanan kütüphaneler dizinini jniLibs olarak yeniden adlandırın ve işimiz bitti.

Adım (6), Android Studio'nun app/src/main/jniLibseski libsklasör yerine yerel kütüphaneleri beklemesinden kaynaklanmaktadır . Android OpenCV'de yeni olanlar için aşağıdaki adımları kaçırmayın

  • include static{ System.loadLibrary("opencv_java"); }(Not: bu adımda OpenCV sürüm 3 için kitaplığı yüklemelisiniz opencv_java3.)
  • Adım (5) için, x86 gibi herhangi bir platform kütüphanesini yoksayarsanız, aygıtınızın / öykünücünüzün bu platformda olmadığından emin olun.

Yazılan OpenCV C / C ++ 'dadır. Java sarmalayıcıları

  1. Android OpenCV SDK - OpenCV.org, Android Java sarmalayıcısını sürdürdü. Bunu öneririm.
  2. OpenCV Java - OpenCV.org otomatik oluşturulan masaüstü Java sarmalayıcısını korumuştur.
  3. JavaCV - Bağımsız geliştiriciler tarafından sağlanan popüler Java sarmalayıcısı. Android'e özgü değil. Bu kütüphane olabilir OpenCV yeni sürümleri ile senkronize olmuyor.

1
Ben silmek Shall, ikinci aşamada aşağıdaki hataları alıyorum javadocs? .Bu da yüklemek için soruyor dizini android sdk 14ben hedefleme olmama rağmen aygıtları desteğiandroid sdk 15
Romantik Elektron

1
@RomanticElectron OpenCV4Android 2.4.10'u link sourceforge.net/projects/opencvlibrary/files/opencv-android/… adresinden indirdiğinizi umuyoruz ve bu masaüstü sürümünü değil mi?
Kiran

2
Ok ben bahsediyorsun sandım, anladım sdksen ile gelir dizine hakkında konuşurken sistemimde kurulum dizinindeki Android Open CV SDKben eklerim adımı 6. tamamladı .ok static{ System.loadLibrary("opencv_java"); }?
Romantic Electron

5
@RomanticElectron statik {System.loadLibrary ("opencv_java"); }? "Teşekkürler anladım" diyorsunuz ama aralarında mesaj yok gibi görünüyor. O zaman gerekli olmadığını söylüyorsun. Biraz daha açıklayabilir misiniz? Teşekkürler.
puntofisso

8
android-142. adımda modülü içe build.gradleaktardıktan sonra hatayla karşılaşan herkes için , 3. adımda gösterildiği gibi projenizdeki openCV dizinini elle düzenlemeniz gerekir .
paradite

144

OpenCV v3.1.0'ı Android Studio v1.4.1'e , ek ayrıntılara sahip talimatlar ve yapmanız gereken bu tür ekran görüntüleri ile entegre etmek .

Kredilerin çoğu açıklamaları için opencv.org'da Kiran, Kool, 1 "ve SteveLiles'a gidiyor. Bu cevabı ekliyorum çünkü Android Studio'nun arayüzünün bu tür entegrasyon öğeleri üzerinde çalışacak kadar kararlı olduğuna inanıyorum Ayrıca bu talimatları projemiz için yazmam gerekiyor.

Deneyimli AS geliştiricileri bu bilgiçliğin bir kısmını bulacaktır. Bu yanıt, Android Studio'da sınırlı deneyime sahip kişileri hedefliyor.

  1. Proje sihirbazını kullanarak yeni bir Android Studio projesi oluşturun (Menü: / Dosya / Yeni Proje):

    • Buna " cvtest1 " deyin
    • Form faktörü: API 19, Android 4.4 (KitKat)
    • MainActivity adlı Boş Etkinlik

      Bu projenin saklandığı bir cvtest1 dizininiz olmalıdır . (Android stüdyosunun başlık çubuğu, projeyi açtığınızda cvtest1'in nerede olduğunu gösterir)

  2. Uygulamanızın düzgün çalıştığını doğrulayın. Derleme / test döngüsünün sizin için uygun olduğunu onaylamak için "Merhaba Dünya" metni gibi bir şeyi değiştirmeyi deneyin. (Bir API 19 cihazının öykünücüsü ile test ediyorum).

  3. Android v3.1.0 için OpenCV paketini indirin ve bir yerde geçici bir dizinde açın. (Emin olun o Java paketi için sadece OpenCV özellikle Android için paket olup.) Bu dizin "diyeceğiz unzip-dir altında" unzip-dir Eğer bir olmalıdır sdk / yerli / kütüphaneleri ile başlayan alt dizinleri ile dizin arm ..., mips ... ve x86 ... gibi şeyler (Android'in çalıştığı her "mimari" türü için bir tane)

  4. Android Studio'dan OpenCV'yi projenize modül olarak içe aktarın: Menü: / Dosya / Yeni / Import_Module :

    • Kaynak dizin: {unzip-dir} / sdk / java
    • Modül adı: Android stüdyosu bu alanı otomatik olarak openCVLibrary310 ile doldurur (tam ad muhtemelen önemli değildir, ancak bununla devam edeceğiz).
    • Sonrakini tıklayın . Üç onay kutusu ve kavanozlar, kütüphaneler ve içe aktarma seçenekleri hakkında sorular içeren bir ekran alırsınız. Üçünün de kontrol edilmesi gerekir. Bitir'e tıklayın .

      Android Studio modülü içe aktarmaya başlar ve size içe aktarılmayanların bir listesini (çoğunlukla javadoc dosyaları) ve diğer bilgi parçalarını içeren bir import-özet.txt dosyası gösterilir . resim açıklamasını buraya girin

      Ama aynı zamanda bir hata mesajı söyleyerek olsun ... karma dize 'android-14' ile hedef bulamadılar . Bu, indirdiğiniz OpenCV zip dosyasındaki build.gradle dosyasının, varsayılan olarak Android Studio v1.4.1 ile sahip olmadığınız android API sürüm 14'ü kullanarak derlendiğini söylemesi nedeniyle olur. resim açıklamasını buraya girin

  5. Proje yapısı diyalog penceresini açın ( Menü: / Dosya / Project_Structure ). "App" modülünü seçin, Bağımlılıklar sekmesine tıklayın ve şunu ekleyin : openCVLibrary310 , Modül Bağımlılığı olarak. Add / Module_Dependency öğesini seçtiğinizde , ekleyebileceğiniz modüller listesinde görünmelidir. Artık bir bağımlılık olarak görünecek , ancak olay günlüğünde birkaç tane daha bulamıyor-android-14 hatası alacaksınız .

  6. Bak build.gradle uygulama modülü için dosyanın. Bir Android projesinde birden fazla build.gradle dosyası vardır. İstediğiniz cvtest1 / app dizinindedir ve proje görünümünden build.gradle (Module: app) gibi görünür . Bu dört alanın değerlerine dikkat edin:

    • compileSDKVersion (benimki 23 diyor)
    • buildToolsVersion (benimki 23.0.2 diyor)
    • minSdkVersion (benimki 19 diyor)
    • targetSdkVersion (benimki 23 diyor)
  7. Projenizin artık bir cvtest1 / OpenCVLibrary310 dizini var, ancak proje görünümünden görünmüyor:

resim açıklamasını buraya girin

Herhangi bir dosya yöneticisi gibi başka bir araç kullanın ve bu dizine gidin. Ayrıca gelen proje görünümü geçiş yapabilirsiniz Android için Proje Dosyaları ve bu ekran görüntüsünde görüldüğü gibi bu dizin bulunmaktadır: resim açıklamasını buraya girin

İçinde başka bir build.gradle dosyası var (yukarıdaki ekran görüntüsünde vurgulanmıştır). Bu dosyayı 6. adımdaki dört değerle güncelleyin.

  1. Projenizi yeniden senkronize edin ve ardından temizleyin / yeniden oluşturun. (Menü: / Build / Clean_Project ) Hatasız temizlemeli ve derlemeli ve 0: Mesajlar ekranında openCVLibrary310 ile ilgili birçok referans görmelisiniz .

    resim açıklamasını buraya girin

    Bu noktada modül, proje hiyerarşisinde tıpkı uygulama gibi openCVLibrary310 olarak görünmelidir . (O küçük açılır menüde ben geri anahtarlamalı geldiğini hatırlatırız Projesi Görünüm için Android Görünüm ). Ayrıca "Gradle Scripts" altında ek bir build.gradle dosyası görmelisiniz, ancak Android Studio arayüzünü biraz hantal buluyorum ve bazen bunu hemen yapmıyor. Bu yüzden Android Studio'yu yeniden senkronize etmeyi, temizlemeyi ve hatta yeniden başlatmayı deneyin.

    Bu ekran görüntüsü gibi java altında tüm OpenCV işlevlerine sahip openCVLibrary310 modülünü görmelisiniz:

    resim açıklamasını buraya girin

  2. Kopya {unzip-dir} / sdk / yerli / kütüphaneleri için, Android projeye (bunun altında ve her şey) dizin cvtest1 / OpenCVLibrary310 / src / main / ve ardından gelen kopyasını yeniden adlandırmak kütüphanelerini için jniLibs . Şimdi bir cvtest1 / OpenCVLibrary310 / src / main / jniLibs dizininiz olmalıdır. Projenizi yeniden senkronize edin ve bu dizinin artık openCVLibrary310 altındaki proje görünümünde görünmesi gerekir .

    resim açıklamasını buraya girin

  3. MainActivity.java'nın onCreate yöntemine gidin ve şu kodu ekleyin:

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

    Ardından uygulamanızı çalıştırın. Android Monitör'de böyle satırlar görmelisiniz: resim açıklamasını buraya girin (Hata mesajıyla bu satırın neden orada olduğunu bilmiyorum)

  4. Şimdi gerçekten bir openCV kodu kullanmaya çalışın. Aşağıdaki örnekte, bir .jpg dosyasını android emülatöründeki cvtest1 uygulamasının önbellek dizinine kopyaladım. Aşağıdaki kod bu görüntüyü yükler, açık kenar algılama algoritmasını çalıştırır ve sonuçları aynı dizindeki bir .png dosyasına geri yazar.

    Bu kodu önceki adımdaki kodun hemen altına koyun ve kendi dosyalarınız / dizinlerinizle eşleşecek şekilde değiştirin.

    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. Uygulamanızı çalıştırın. Emülatörünüz siyah beyaz bir "kenar" görüntü oluşturmalıdır. Çıkışı almak için Android Cihaz Monitörü'nü kullanabilir veya göstermek için bir etkinlik yazabilirsiniz.

Sorunlar :

  • Hedef platformunuzu KitKat'ın altına indirirseniz OpenCV kütüphanelerinin bazıları artık çalışmaz, özellikle org.opencv.android.Camera2Renderer ve diğer ilgili sınıflarla ilgili sınıflar. Muhtemelen sadece uygun OpenCV .java dosyalarını kaldırarak bu sorunu çözebilirsiniz.
  • Hedef platformunuzu Lollipop veya üstüne yükseltirseniz, mutlak dosya yollarının kullanımı kaşlarını çattığından bir dosya yükleme örneğim çalışmayabilir. Bu nedenle galeriden veya başka bir yerden dosya yüklemek için örneği değiştirmeniz gerekebilir. Etrafta yüzen çok sayıda örnek var.

2
16-Şub edit: jniLibs şimdi openCVLibrary310 dizininde, ana uygulama dizininde değil. Ya işe yarıyor ama onları opencv bölümünde tutmak benim için daha temiz görünüyor. Artı daha fazla ekran görüntüsü ve "Gotchas" bölümü.
ssimm

Bazı ithalat beyanları eksik olduğunu düşünüyorum, aksi takdirde çok iyi bir iş! +1
Allan Nørgaard

1
Cevabını takip ettim ama başarısız oldum. 1 hatayı aldım 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 Bu hatayla ilgili yazdığınız gibi adım adım ne yaptım.
Devendra Singh

2
@DevendraSingh Seninle aynı hatayı aldım ama 9. adımı
atladığımı

2
Android Studio'da opencv için c ++ 'da kodlamak istiyorsak ne olur?
user8663682

38

Yukarıdaki cevaplardaki (harika!) Tüm adımlar ve ekran görüntüleri ile kaçmak istediklerini hisseden herkes için, bu benim için çalıştı android studio 2.2.1:

  1. Yeni bir proje oluşturun, istediğiniz gibi adlandırın ve varsayılanı alın (minSdkVersion 15 iyidir).
  2. Zip dosyasını buradan indirin: https://sourceforge.net/projects/opencvlibrary/files/opencv-android/ (3.1.0 sürümünü indirdim, ancak daha yeni bir sürüm olabilir).
  3. Zip dosyasını açın, en iyi yer çalışma alanı klasörünüzde, ancak gerçekten önemli değil.
  4. İçeride Android Studiotıklayın File->New-> Import Moduleve Tamam'a gidin \path_to_your_unzipped_file\OpenCV-android-sdk\sdk\javave tıklayın , ardından tüm varsayılan iletişim kutularını kabul edin.
  5. In gradleyour ait dosyada app modülü, bağımlılıkları bloğa bu ekleyin:

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

XYZ indirdiğiniz tam sürüm ise, örneğin benim durumumda:

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

1
Güzel ve basit, thnx ;-) 3.2.0 sürümü için de çalışır.
blacharnia

2
Teşekkürler, gerçekten daha kolay bir çözüm. Benden bir nokta. Yeni OpenCV modülü derlenemedi. Bu sorunun cevabı bu sorunu düzeltmeme yardımcı oldu stackoverflow.com/a/40302788/408780
Tima

@blacharnia'nın söylediklerine eklemek için, 310 yerine beşik bağımlılıkları bölümünde 'derleme projesi (': openCVLibrary320 ')' kullandığınızdan emin olun
Abraham Philip

Belki daha genel olarak, yukarıdaki yorumlara eklemek için "compile project (': openCVLibraryXYZ')" kullanın, burada XYZ, 'noktalar' olmadan openCV Android SDK'nın sürüm numarasıdır - bu şimdi 3.4.0 sürümü için de çalışır -> ie "compile project (': openCVLibrary340')" kullanın
Mick

@ Teşekkürler, cevabını önerinize göre düzenledim.
yshahak

9

Android Studio 3.4 + OpenCV 4.1

  1. En son OpenCV zip dosyasını buradan indirin (en yeni sürüm 4.1.0'dır) ve çalışma alanınızda veya başka bir klasörde sıkıştırmayı açın.

  2. Normalde yeni Android Studio projesi oluşturun. Tıklayın File->New->Import Module, gidin /path_to_unzipped_files/OpenCV-android-sdk/sdk/java, Modül adını şu şekilde ayarlayın , ekrandaki tüm seçenekleri opencvtıklayın Nextve işaretini kaldırın.

  3. ProjectDosya görüntüleme modunu etkinleştir (varsayılan mod Android). Gelen opencv/build.gradledosya değişikliği apply plugin: 'com.android.application'için apply plugin: 'com.android.library've değiştirme application ID "org.opencv"ile

    minSdkVersion 21
    targetSdkVersion 28

    (içindeki değerlere göre app/build.gradle). Projeyi Gradle dosyalarıyla senkronize et.

  4. Bu dizeyi app/build.gradledosyadaki bağımlılıklar bloğuna ekleyin

    dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
  5. AndroidDosya görüntüleme modunu tekrar seçin . appModüle sağ tıklayın ve gidin New->Folder->JNI Folder. Klasör konumunu değiştir'i seçin ve ayarlayın src/main/jniLibs/.

  6. Tekrar seçilirse Projectdosya görüntüleme modunu ve tüm klasörleri kopyalamak /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libsiçin app/src/main/jniLibs.

  7. Yine Androiddosya görüntüleme modunda appmodülü sağ tıklayın ve seçin Link C++ Project with Gradle. Sistem Oluştur'u ndk-buildve OpenCV.mkdosya yolunu seçin /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk.

    path_to_unzipped_files boşluk içermemelidir, yoksa hata alırsınız!

OpenCV başlatmayı kontrol etmek için MainActivity onCreate()yönteminde Toast mesajı ekleyin :

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

Başlatma başarılı olursa trueTost mesajında ​​görürsünüz false.


Yukarıda "uygulama kimliğini değiştirin" org.opencv "ile ....." diyorsunuz ama "ile" takip eden hiçbir şey yok. Lütfen açıklar mısın? Eğer demek istiyorsunuz ki "applicationID girişi kaldırmak ve aşağıdaki gibi iki giriş ekleyin:"
Dale

@Dale Evet, application ID "org.opencv"dizeyi iki dizeyle değiştirmelisiniz : minSdkVersion 21ve targetSdkVersion 28(app / build.gradle dosyasındaki değerlere göre)
Plo_Koon

Açıkladığınız gibi tüm adımları izledim. Ancak hata E / art: dlopen ("/ data / app / com.example.objectsegmentation-1 / lib / arm64 / libopencv_java4.so", RTLD_LAZY) başarısız oldu: dlopen başarısız oldu: kütüphane "libc ++ _ shared.so" bulunamadı
Masthan

0

JniLibs cpp oluştururken sorun yaşayan herkes gösterilir .. sadece eklemek ndk ..


0

Bu benim için çalıştı ve bir sınıf bağımlılığı eklemek kadar kolaydı:

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

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

Bir uyarı, kol emülatörleri benim için çok yavaş çalıştığı için bir donanım hata ayıklama cihazı kullanmak zorunda olduğum (AVD Manager'ın söyleyeceği gibi) ve reAD README'de açıklandığı gibi, bu sürüm x86 veya x86_64 desteğini içermiyor.

Oluşturulmuş ve önerilen test gibi görünüyor:

static {
    OpenCVLoader.initDebug();
}

bana doğru görünen bir sürü çıktı verir.


Bu android stüdyosunda yeni bir projeden. Hiçbir şey içe aktarmadım, hiçbir şey indirmedim, vb.Sadece gradle bağımlılığını ekleyin ve senkronize edin.
Naumdev

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.