OpenCV di Android Studio

140

Saya ingin menggunakan pustaka OpenCV di aplikasi saya dengan Android Studio. Saya mengikuti instruksi yang ditemukan di sini tetapi saya mendapatkan kesalahan

Konfigurasi dengan nama 'default' tidak ditemukan

Apa yang salah?

Saya menggunakan Android Studio 1.0 dengan gradle 2.2.1.

Bartosz Bialecki
sumber
1
Sekarang kita bisa mengimpor modul dengan studio Android dan langkah-langkahnya bisa lebih sederhana. Bisakah Anda mencoba stackoverflow.com/a/27356635/1180117
Kiran
Terima kasih, ini berhasil. Tulis itu sebagai jawaban maka saya bisa menerimanya.
Bartosz Bialecki
@ BartoszBialecki @ Kara, saya sudah mengikutinya ke langkah No.4, saya tidak dapat menemukan nativedirektori di bawah sdk direktori saya. Apakah saya kehilangan sesuatu?
Romantic Electron
1
@RomanticElectron Anda harus menambahkan direktori natvie dari SDK perpustakaan OpenCV, bukan Android SDK.
Bartosz Bialecki
@ BartoszBialecki terima kasih
Romantic Electron

Jawaban:

312

Langkah-langkah di bawah ini untuk menggunakan Android OpenCV SDK di Android Studio. Ini adalah versi yang disederhanakan dari ( 1 ) jawaban SO ini.

  1. Unduh OpenCV SDK terbaru untuk Android dari OpenCV.org dan dekompres file zip.
  2. Impor OpenCV ke Android Studio , Dari File -> Baru -> Modul Impor , pilih folder sdk / java di arsip opencv yang tidak di-zip.
  3. Perbarui build.gradle di bawah modul OpenCV yang diimpor untuk memperbarui 4 bidang yang cocok dengan build.gradle proyek Anda a) compileSdkVersion b) buildToolsVersion c) minSdkVersion dan d) targetSdkVersion.
  4. Tambahkan ketergantungan modul dengan Aplikasi -> Pengaturan Modul , dan pilih tab Dependensi . Klik ikon + di bagian bawah, pilih Module Dependency dan pilih modul OpenCV yang diimpor.
    • Untuk Android Studio v1.2.2, untuk mengakses Pengaturan Modul: pada tampilan proyek, klik kanan modul dependen -> Buka Pengaturan Modul
  5. Salin folder libs di bawah sdk / asli ke Android Studio di bawah app / src / main .
  6. Di Android Studio, mengubah nama disalin libs direktori untuk jniLibs dan kita selesai.

Langkah (6) adalah karena Android studio mengharapkan lib asli di dalam folder yang app/src/main/jniLibslebih lama libs. Bagi mereka yang baru mengenal Android OpenCV, jangan lewatkan langkah-langkah di bawah ini

  • termasuk static{ System.loadLibrary("opencv_java"); }(Catatan: untuk OpenCV versi 3 pada langkah ini Anda harus memuat pustaka opencv_java3.)
  • Untuk langkah (5), jika Anda mengabaikan lib platform apa pun seperti x86, pastikan perangkat / emulator Anda tidak ada di platform itu.

OpenCV ditulis dalam C / C ++. Pembungkus Java

  1. Android OpenCV SDK - OpenCV.org mengelola pembungkus Java Android. Saya sarankan yang ini.
  2. OpenCV Java - OpenCV.org mengelola pembungkus Java desktop yang dibuat secara otomatis.
  3. JavaCV - Pembungkus Java populer yang dikelola oleh pengembang independen. Tidak spesifik untuk Android. Pustaka ini mungkin tidak sinkron dengan OpenCV versi yang lebih baru.
Kiran
sumber
1
Saya mendapatkan kesalahan setelah langkah kedua, Haruskah saya menghapus javadocsdirektori? Ini juga meminta saya untuk menginstal android sdk 14meskipun saya menargetkan perangkat yang mendukungandroid sdk 15
Romantic Electron
1
@RomanticElectron Harap Anda telah mengunduh OpenCV4Android 2.4.10 dari link sourceforge.net/projects/opencvlibrary/files/opencv-android/… dan bukan versi desktop java?
Kiran
2
Ok saya mengerti, saya pikir Anda berbicara tentang sdkdirektori instalasi pada sistem saya sementara Anda berbicara tentang direktori yang datang dengan. Android Open CV SDKOke selesaikan langkah 6. Di mana saya termasuk static{ System.loadLibrary("opencv_java"); }?
Romantic Electron
5
@RomanticElectron di mana Anda menyertakan static {System.loadLibrary ("opencv_java"); }? Anda mengatakan "Terima kasih, saya sudah mendapatkannya" tetapi sepertinya tidak ada pesan di antaranya. Maka Anda mengatakan itu tidak diperlukan. Bisakah Anda jelaskan lebih banyak? Terima kasih.
puntofisso
8
bagi siapa pun yang memiliki android-14kesalahan setelah mengimpor modul pada langkah 2, Anda perlu mengedit secara manual build.gradledi direktori openCV di proyek Anda seperti yang ditunjukkan pada langkah 3.
paradite
144

Mengintegrasikan OpenCV v3.1.0 ke dalam Android Studio v1.4.1 , instruksi dengan detail tambahan dan screenshot jenis ini-adalah-apa-yang-harus-Anda-dapatkan.

Sebagian besar kredit diberikan kepada Kiran, Kool, 1 ", dan SteveLiles di opencv.org untuk penjelasan mereka. Saya menambahkan jawaban ini karena saya percaya bahwa antarmuka Android Studio sekarang cukup stabil untuk bekerja dengan jenis integrasi seperti ini. Juga saya harus menulis instruksi ini untuk proyek kami.

Pengembang AS yang berpengalaman akan menemukan beberapa hal yang luar biasa ini. Jawaban ini ditujukan untuk orang-orang dengan pengalaman terbatas di Android Studio.

  1. Buat proyek Android Studio baru menggunakan pemandu proyek (Menu: / File / Proyek Baru):

    • Sebut saja " cvtest1 "
    • Faktor bentuk: API 19, Android 4.4 (KitKat)
    • Aktivitas Kosong bernama MainActivity

      Anda harus memiliki direktori cvtest1 tempat proyek ini disimpan. (bilah judul Android studio menunjukkan di mana cvtest1 adalah saat Anda membuka proyek)

  2. Pastikan aplikasi Anda berjalan dengan benar. Coba ubah sesuatu seperti teks "Hello World" untuk mengonfirmasi bahwa siklus pembuatan / pengujian OK untuk Anda. (Saya sedang menguji dengan emulator perangkat API 19).

  3. Unduh paket OpenCV untuk Android v3.1.0 dan unzip di beberapa direktori sementara di suatu tempat. (Pastikan itu adalah paket khusus untuk Android dan bukan hanya paket OpenCV untuk Java.) Saya akan memanggil direktori ini " unzip-dir " Di bawah unzip-dir Anda harus memiliki direktori sdk / native / libs dengan subdirektori yang dimulai dengan hal-hal seperti lengan ..., mips ... dan x86 ... (satu untuk setiap jenis "arsitektur" yang dijalankan Android)

  4. Dari Android Studio, impor OpenCV ke proyek Anda sebagai modul: Menu: / File / New / Import_Module :

    • Direktori sumber: {unzip-dir} / sdk / java
    • Nama modul: Android studio secara otomatis mengisi bidang ini dengan openCVLibrary310 (nama persisnya mungkin tidak masalah tetapi kita akan lanjutkan dengan ini).
    • Klik selanjutnya . Anda mendapatkan layar dengan tiga kotak centang dan pertanyaan tentang stoples, pustaka, dan opsi impor. Ketiganya harus diperiksa. Klik pada Selesai.

      Android Studio mulai mengimpor modul dan Anda akan diperlihatkan file import-summary.txt yang memiliki daftar apa yang tidak diimpor (kebanyakan file javadoc) dan informasi lainnya. masukkan deskripsi gambar di sini

      Tapi Anda juga mendapatkan pesan kesalahan pepatah gagal menemukan target dengan hash string 'android-14' ... . Ini terjadi karena file build.gradle dalam file zip OpenCV yang Anda unduh mengatakan untuk kompilasi menggunakan Android API versi 14, yang secara default Anda tidak miliki dengan Android Studio v1.4.1. masukkan deskripsi gambar di sini

  5. Buka dialog struktur proyek ( Menu: / File / Project_Structure ). Pilih modul "aplikasi", klik pada tab Dependensi dan tambahkan : openCVLibrary310 sebagai Ketergantungan Modul. Ketika Anda memilih Tambah / Module_Dependensi itu akan muncul dalam daftar modul yang dapat Anda tambahkan. Sekarang akan muncul sebagai dependensi tetapi Anda akan mendapatkan beberapa kesalahan tidak dapat-menemukan-android-14 di log peristiwa.

  6. Lihat di file build.gradle untuk modul aplikasi Anda. Ada beberapa file build.gradle di proyek Android. Yang Anda inginkan ada di direktori cvtest1 / app dan dari tampilan proyek sepertinya build.gradle (Module: app) . Perhatikan nilai dari empat bidang ini:

    • compileSDKVersion (milikku mengatakan 23)
    • buildToolsVersion (milik saya mengatakan 23.0.2)
    • minSdkVersion (milikku mengatakan 19)
    • targetSdkVersion (milikku mengatakan 23)
  7. Proyek Anda sekarang memiliki direktori cvtest1 / OpenCVLibrary310 tetapi tidak terlihat dari tampilan proyek:

masukkan deskripsi gambar di sini

Gunakan beberapa alat lain, seperti pengelola file apa pun, dan buka direktori ini. Anda juga dapat mengalihkan tampilan proyek dari Android ke File Proyek dan Anda dapat menemukan direktori ini seperti yang ditunjukkan dalam tangkapan layar ini: masukkan deskripsi gambar di sini

Di dalamnya ada file build.gradle lain (disorot pada tangkapan layar di atas). Perbarui file ini dengan empat nilai dari langkah 6.

  1. Sinkronisasi ulang proyek Anda lalu bersihkan / bangun kembali. (Menu: / Build / Clean_Project ) Ini harus membersihkan dan membangun tanpa kesalahan dan Anda akan melihat banyak referensi ke : openCVLibrary310 di layar 0: Pesan .

    masukkan deskripsi gambar di sini

    Pada titik ini modul akan muncul dalam hirarki proyek sebagai openCVLibrary310 , sama seperti aplikasi . (Perhatikan bahwa dalam menu drop-down kecil itu saya beralih dari Project View ke Android View ). Anda juga harus melihat file build.gradle tambahan di bawah "Gradle Scripts" tetapi saya menemukan antarmuka Android Studio sedikit glitchy dan kadang-kadang tidak langsung melakukannya. Jadi cobalah menyinkronkan ulang, membersihkan, bahkan memulai ulang Android Studio.

    Anda akan melihat modul openCVLibrary310 dengan semua fungsi OpenCV di bawah java seperti di screenshot ini:

    masukkan deskripsi gambar di sini

  2. Salin {unzip-dir} / sdk / / asli libs direktori (dan segala sesuatu di bawah itu) untuk proyek Android Anda, untuk cvtest1 / OpenCVLibrary310 / src / main / , dan kemudian mengubah nama salinan dari libs ke jniLibs . Anda sekarang harus memiliki cvtest1 / OpenCVLibrary310 / src / main / jniLibs . Sinkronisasi ulang proyek Anda dan direktori ini sekarang akan muncul dalam tampilan proyek di bawah openCVLibrary310 .

    masukkan deskripsi gambar di sini

  3. Buka metode onCreate dari MainActivity.java dan tambahkan kode ini:

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

    Kemudian jalankan aplikasi Anda. Anda akan melihat baris seperti ini di Monitor Android: masukkan deskripsi gambar di sini (Saya tidak tahu mengapa ada baris dengan pesan kesalahan)

  4. Sekarang cobalah untuk benar-benar menggunakan beberapa kode openCV. Pada contoh di bawah ini saya menyalin file .jpg ke direktori cache aplikasi cvtest1 pada emulator android. Kode di bawah ini memuat gambar ini, menjalankan algoritme deteksi tepi cerdik dan kemudian menulis hasilnya kembali ke file .png di direktori yang sama.

    Letakkan kode ini tepat di bawah kode dari langkah sebelumnya dan ubahlah agar sesuai dengan file / direktori Anda sendiri.

    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. Jalankan aplikasi Anda. Emulator Anda harus membuat gambar "tepi" hitam dan putih. Anda dapat menggunakan Monitor Perangkat Android untuk mengambil output atau menulis aktivitas untuk menunjukkannya.

The Gotcha :

  • Jika Anda menurunkan platform target Anda di bawah KitKat, beberapa pustaka OpenCV tidak akan berfungsi lagi, khususnya kelas yang terkait org.opencv.android.Camera2Renderer dan kelas terkait lainnya. Anda mungkin dapat menyiasatinya dengan hanya menghapus file .java OpenCV apprpriate.
  • Jika Anda menaikkan platform target Anda ke Lollipop atau di atas, contoh saya memuat file mungkin tidak berfungsi karena penggunaan path file absolut disukai. Jadi, Anda mungkin harus mengubah contoh untuk memuat file dari galeri atau di tempat lain. Ada banyak contoh yang beredar.
ssimm
sumber
2
Suntingan 16-Feb: jniLibs sekarang di direktori openCVLibrary310, bukan direktori aplikasi utama. Entah berhasil tetapi tampaknya lebih bersih bagi saya untuk menjaga mereka di bagian pembuka. Ditambah tangkapan layar lebih banyak dan bagian "Gotchas".
ssimm
Saya pikir beberapa pernyataan impor tidak ada, atau pekerjaan yang sangat baik! +1
Allan Nørgaard
1
Saya mengikuti jawaban Anda tetapi gagal. 1 saya mendapatkan kesalahan 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 Apa kesalahan ini tentang saya lakukan langkah demi langkah seperti yang Anda tulis.
Devendra Singh
2
@DevendraSingh Saya mendapatkan kesalahan yang sama seperti yang Anda alami tetapi saya menyadari bahwa saya telah melewatkan langkah 9.
aasu
2
bagaimana jika kita ingin kode c ++ untuk opencv di android studio?
user8663682
37

Untuk semua orang yang merasa ingin melarikan diri dengan semua langkah dan tangkapan layar pada jawaban (hebat!) Di atas, ini berhasil bagi saya dengan android studio 2.2.1:

  1. Buat proyek baru, beri nama sesuai keinginan dan pilih default (minSdkVersion 15 tidak masalah).
  2. Unduh file zip dari sini: https://sourceforge.net/projects/opencvlibrary/files/opencv-android/ (saya mengunduh versi 3.1.0, tetapi mungkin ada versi yang lebih baru).
  3. Buka zip file zip, tempat terbaik adalah di folder ruang kerja Anda, tetapi itu tidak masalah.
  4. Di dalam Android Studio, klik File->New-> Import Moduledan navigasikan ke \path_to_your_unzipped_file\OpenCV-android-sdk\sdk\javadan tekan Ok, lalu terima semua dialog default.
  5. Dalam gradlefile app modul Anda , tambahkan ini ke blok dependensi:

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

Di mana XYZ adalah versi persis yang Anda unduh, misalnya dalam kasus saya:

    dependencies {
        compile project(':openCVLibrary320')
        //rest of code
    }
yshahak
sumber
1
Bagus dan sederhana, thnx ;-) Bekerja juga untuk versi 3.2.0.
blacharnia
2
Terima kasih, ini memang solusi yang lebih mudah. Satu poin dari saya. Modul OpenCV baru tidak dapat dikompilasi. Jawabannya di sini membantu saya untuk memperbaiki masalah ini stackoverflow.com/a/40302788/408780
Tima
hanya untuk menambahkan apa yang dikatakan @blacharnia, pastikan Anda menggunakan 'compile project (': openCVLibrary320 ')' di bagian dependensi cradle alih-alih 310
Abraham Philip
Mungkin lebih umum, untuk menambahkan komentar di atas, gunakan "compile project (': openCVLibraryXYZ')" di mana XYZ adalah nomor versi openCV Android SDK tanpa 'titik' - ini juga berfungsi sekarang untuk versi 3.4.0 -> yaitu gunakan "kompilasi proyek (': openCVLibrary340')"
Mick
@Mick terima kasih, saya mengedit jawaban sesuai dengan saran Anda.
yshahak
9

Android Studio 3.4 + OpenCV 4.1

  1. Unduh file zip OpenCV terbaru dari sini (versi terbaru saat ini adalah 4.1.0) dan unzip di ruang kerja Anda atau di folder lain.

  2. Buat proyek Android Studio baru secara normal. Klik File->New->Import Module, navigasikan ke /path_to_unzipped_files/OpenCV-android-sdk/sdk/java, tentukan Nama modul sebagai opencv, klik Nextdan hapus centang semua opsi di layar.

  3. Memungkinkan Project mode tampilan file (mode default adalah Android). Dalam opencv/build.gradleperubahan berkas apply plugin: 'com.android.application'untuk apply plugin: 'com.android.library'dan mengganti application ID "org.opencv"dengan

    minSdkVersion 21
    targetSdkVersion 28

    (sesuai dengan nilai-nilai dalam app/build.gradle). Sinkronkan proyek dengan file Gradle.

  4. Tambahkan string ini ke blok dependensi dalam app/build.gradlefile

    dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
  5. Pilih lagi Android mode tampilan file. Klik kanan pada appmodule dan goto New->Folder->JNI Folder. Pilih ubah lokasi folder dan atur src/main/jniLibs/.

  6. Pilih lagi Projectmode tampilan file dan salin semua folder dari /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libske app/src/main/jniLibs.

  7. Sekali lagi dalam Androidmode tampilan file klik kanan pada appmodul dan pilihLink C++ Project with Gradle . Pilih Bangun Sistem ndk-builddan jalur ke OpenCV.mkfile /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk.

    path_to_unzipped_files tidak boleh mengandung spasi apa pun, atau Anda akan mendapatkan kesalahan!

Untuk memeriksa inisialisasi OpenCV tambahkan pesan Toast di MainActivity onCreate() metode :

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

Jika inisialisasi berhasil, Anda akan melihat truedi pesan Toast lain yang akan Anda lihat false.

Plo_Koon
sumber
Di atas Anda mengatakan "ganti ID aplikasi" org.opencv "dengan ....." tetapi tidak ada yang mengikuti "dengan". Bisakah Anda mengklarifikasi? Apakah Anda bermaksud mengatakan "hapus entri applicationId dan tambahkan dua entri sebagai berikut:"
Dale
@Dale Ya, Anda harus mengganti application ID "org.opencv"string dengan dua string: minSdkVersion 21dan targetSdkVersion 28(sesuai dengan nilai dalam file app / build.gradle)
Plo_Koon
Saya mengikuti semua langkah seperti yang Anda gambarkan. Tetapi mendapatkan kesalahan E / art: dlopen ("/ data / app / com.example.objectsegmentation-1 / lib / arm64 / libopencv_java4.so", RTLD_LAZY) gagal: dlopen gagal: perpustakaan "libc ++ _ shared.so" tidak ditemukan
Masthan
0

Siapa saja yang menghadapi masalah saat membuat jniLibs cpp ditampilkan .. cukup tambahkan ndk ..

Aklesh Singh
sumber
0

Ini bekerja untuk saya dan semudah menambahkan ketergantungan gradle:

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

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

Satu peringatan adalah bahwa saya harus menggunakan perangkat debugging perangkat keras karena emulator lengan berjalan terlalu lambat untuk saya (seperti yang dikatakan oleh Manajer AVD), dan, seperti yang dijelaskan pada README repo, versi ini tidak termasuk dukungan x86 atau x86_64.

Tampaknya untuk membangun dan tes yang disarankan:

static {
    OpenCVLoader.initDebug();
}

memuntahkan sekelompok output yang terlihat benar bagi saya.

Naumdev
sumber
Ini dari proyek baru di studio android. Saya tidak mengimpor apa pun, tidak mengunduh apa pun, dll. Cukup tambahkan ketergantungan gradle dan sinkronisasi.
Naumdev
0

Di build.gradle Anda

repositories {
  jcenter()
}

implementation 'com.quickbirdstudios:opencv:4.1.0'

Lebih banyak info

Raymond Chenon
sumber