OpenCV в Android Studio


141

Я хочу використовувати бібліотеку OpenCV у своєму додатку з Android Studio. Я дотримувався знайдених інструкцій тут, але я отримую помилку

Конфігурація з ім'ям "за замовчуванням" не знайдено

Що може бути не так?

Я використовую Android Studio 1.0 з gradle 2.2.1.


1
Тепер ми могли імпортувати модулі за допомогою студії Android, а кроки можуть бути набагато простішими. Чи можете ви спробувати це stackoverflow.com/a/27356635/1180117
Кіран

Дякую, це працює. Напишіть це як відповідь, тоді я можу прийняти.
Bartosz Bialecki

@BartoszBialecki @Kiran, я дотримувався цього кроку до кроку 4, я не можу знайти nativeкаталог під своїм sdk каталогом. Я щось пропускаю?
Романтичний Електрон

1
@RomanticElectron вам потрібно додати каталог natvie з sdk бібліотеки OpenCV, а не Android sdk.
Bartosz Bialecki

@BartoszBialecki дякую
Романтичний Електрон

Відповіді:


312

Нижче описані кроки щодо використання sdk Android OpenCV в Android Studio. Це спрощена версія цієї відповіді ( 1 ) ТА.

  1. Завантажте найновіший OpenCV sdk для Android з OpenCV.org та розпакуйте zip-файл.
  2. Імпортуйте OpenCV в Android Studio , з файлу -> нове -> модуль імпорту , виберіть папку sdk / java в нерозпакованому архіві opencv.
  3. Оновіть build.gradle під імпортованим модулем OpenCV, щоб оновити 4 поля, щоб відповідати вашому проекту build.gradle a) compileSdkVersion b) buildToolsVersion c) minSdkVersion та d) targetSdkVersion.
  4. Додайте залежність модуля за допомогою програми -> Налаштування модуля та виберіть вкладку Залежності . Клацніть піктограму + внизу, виберіть Залежність модуля та виберіть імпортований модуль OpenCV.
    • Щоб отримати доступ до налаштувань модуля для Android Studio v1.2.2: у вікні проекту правою кнопкою миші клацніть відповідний модуль -> Відкрити налаштування модуля
  5. Скопіюйте папку libs під sdk / native в Android Studio під програмою / src / main .
  6. В Android Studio перейменуйте скопійований каталог libs в jniLibs і ми закінчили.

Крок (6) - оскільки студія Android очікує, що рідні файли app/src/main/jniLibsзамість старої libsпапки. Для нових користувачів Android OpenCV не пропускайте нижче кроків

  • включити static{ System.loadLibrary("opencv_java"); }(Примітка. Для OpenCV версії 3 на цьому кроці слід замість цього завантажити бібліотеку opencv_java3.)
  • На кроці (5), якщо ви ігноруєте будь-які вкладки платформи, наприклад x86, переконайтеся, що ваш пристрій / емулятор не знаходиться на цій платформі.

OpenCV написано на C / C ++. Обгортки Java є

  1. Android OpenCV SDK - OpenCV.org підтримував Android Java обгортку. Я пропоную цю.
  2. OpenCV Java - OpenCV.org підтримує автоматично створений робочий стіл обгортки Java.
  3. JavaCV - Популярна Java обгортка, що підтримується незалежними розробниками. Не для Android. Ця бібліотека може не синхронізуватися з новими версіями OpenCV.

1
Після другого кроку я отримую помилки, чи потрібно видалити javadocsкаталог? Також він просить мене встановити, android sdk 14хоча я націлюю на пристрої, які підтримуютьandroid sdk 15
Romantic Electron

1
@RomanticElectron Сподіваюся, ви завантажили OpenCV4Android 2.4.10 зі посилання sourceforge.net/projects/opencvlibrary/files/opencv-android/…, а не та версія на робочому столі Java?
Кіран

2
Ок, я це зрозумів, я думав, що ви говорили про sdkінсталяційний каталог в моїй системі, коли ви говорили про каталог, який постачається з. Android Open CV SDKОк завершено крок 6. Куди мені включити static{ System.loadLibrary("opencv_java"); }?
Романтичний Електрон

5
@RomanticElectron, куди ви включаєте статичну {System.loadLibrary ("opencv_java"); }? Ви кажете "Дякую, я це зрозумів", але, здається, немає ніякого повідомлення між ними. Тоді ви кажете, що це не потрібно. Чи можете ви пояснити трохи більше? Дякую.
puntofisso

8
для тих, хто має android-14помилку після імпорту модуля на кроці 2, вам потрібно вручну відредагувати build.gradleкаталог директорій openCV у вашому проекті, як показано на кроці 3.
paradite

144

Інтеграція OpenCV v3.1.0 в Android Studio v1.4.1 , інструкції з додатковою деталізацією та скріншоти типу "що є, що вам потрібно".

Більша частина кредитів припадає на Kiran, Kool, 1 "та SteveLiles на opencv.org за їх поясненнями. Я додаю цю відповідь, тому що я вважаю, що інтерфейс Android Studio тепер досить стабільний, щоб працювати з цим типом інтеграційних матеріалів Також мені доведеться написати ці вказівки для нашого проекту.

Досвідчені розробники AS знайдуть частину цього педантичного. Ця відповідь орієнтована на людей з обмеженим досвідом роботи в Android Studio.

  1. Створіть новий проект Android Studio за допомогою майстра проекту (Меню: / Файл / Новий проект):

    • Назвіть це " cvtest1 "
    • Формовий фактор: API 19, Android 4.4 (KitKat)
    • Пуста активність назвою MainActivity

      У вас повинен бути cvtest1 каталог де зберігається цей проект. (заголовок студії Android показує, де знаходиться cvtest1, коли ви відкриваєте проект)

  2. Перевірте, чи правильно працює ваш додаток. Спробуйте змінити щось на зразок тексту "Hello World", щоб підтвердити, що цикл складання / тестування для вас нормальний. (Я тестую за допомогою емулятора пристрою API 19).

  3. Завантажте пакет OpenCV для Android v3.1.0 і десь розпакуйте його в тимчасовому каталозі. (Переконайтесь, що це пакет спеціально для Android, а не лише пакет OpenCV для Java.) Я буду називати цей каталог " unzip-dir ". Під unzip-dir вам слід мати каталог sdk / native / libs з підкаталогами, які починаються з такі речі, як arm ..., mips ... і x86 ... (по одному для кожного типу "архітектури" Android працює)

  4. З Android Studio імпортуйте OpenCV у ваш проект у вигляді модуля: Меню: / Файл / Новий / Імпорт_Модуль :

    • Джерело-довідник: {unzip-dir} / sdk / java
    • Назва модуля: Android-студія автоматично заповнює в цьому полі відкритийCVLibrary310 (точне ім’я, мабуть, не має значення, але ми з цим підемо).
    • Натисніть на наступний . Ви отримуєте екран із трьома прапорцями та питаннями про банки, бібліотеки та варіанти імпорту. Усі три слід перевірити. Натисніть на Готово.

      Android Studio починає імпортувати модуль, і вам відображається файл import-summary.txt, який містить перелік того, що не було імпортовано (в основному файли javadoc) та іншу інформацію. введіть тут опис зображення

      Але ви також отримаєте повідомлення про помилку , яке говорить не вдалося знайти мета з хеш рядка «андроїд-14» ... . Це трапляється тому, що файл build.gradle в завантаженому вами ZIP-файлі OpenCV говорить про компіляцію за допомогою Android API версії 14, чого за замовчуванням у вас немає в Android Studio v1.4.1. введіть тут опис зображення

  5. Відкрийте діалог структури проекту ( Меню: / Файл / Проект_Структура ). Виберіть модуль "додаток", натисніть на вкладку " Залежності" і додайте : openCVLibrary310 як залежність від модуля. Коли ви виберете « Додати / модуль_залежність», він повинен з’явитися у списку модулів, які ви можете додати. Тепер він відображатиметься як залежність, але ви отримаєте ще кілька помилок не в змозі знайти андроїд-14 у журналі подій.

  6. Подивіться у файл build.gradle свого модуля програми. У проекті Android є кілька файлів build.gradle. Той, що ви хочете, знаходиться в каталозі cvtest1 / app і з вигляду проекту він виглядає так build.gradle (Модуль: додаток) . Зверніть увагу на значення цих чотирьох полів:

    • compileSDKVersion (мій каже 23)
    • buildToolsVersion (моє слово 23.0.2)
    • minSdkVersion (мій каже 19)
    • targetSdkVersion (мій каже 23)
  7. Зараз у вашому проекті є каталог cvtest1 / OpenCVLibrary310, але це не видно з подання проекту:

введіть тут опис зображення

Скористайтеся іншим інструментом, наприклад, будь-яким файловим менеджером, і перейдіть до цього каталогу. Ви також можете переключити перегляд проекту з Android на Файли проектів, і ви можете знайти цей каталог, як показано на цьому скріншоті: введіть тут опис зображення

Всередині є ще один файл build.gradle (він виділений на наведеному вище скріншоті). Оновіть цей файл чотирма значеннями з кроку 6.

  1. Повторно синхронізуйте проект, а потім очистіть / відновіть його. (Меню: / Build / Clean_Project ) Він повинен очищатись і створюватись без помилок, і ви повинні побачити багато посилань на : openCVLibrary310 на екрані 0: Messages .

    введіть тут опис зображення

    У цей момент модуль повинен з’явитися в ієрархії проектів як openCVLibrary310 , як і додаток . (Зверніть увагу , що в цьому маленькому спадному меню я переключився назад від Project View для Android View ). Також слід побачити додатковий build.gradle файл розділі "Сценарії Gradle", але я вважаю, що інтерфейс Android Studio трохи глюкозний, а іноді це не робиться відразу. Тож спробуйте повторно синхронізувати, очистити, навіть перезапустити Android Studio.

    Ви повинні побачити модуль openCVLibrary310 з усіма функціями OpenCV під Java, як на цьому знімку екрана:

    введіть тут опис зображення

  2. Скопіюйте каталог {unzip-dir} / sdk / native / libs (і все, що знаходиться під ним) у свій проект Android, в cvtest1 / OpenCVLibrary310 / src / main / , а потім перейменуйте свою копію з libs в jniLibs . Тепер у вас має бути каталог cvtest1 / OpenCVLibrary310 / src / main / jniLibs . Повторіть синхронізацію свого проекту, і цей каталог тепер повинен з’являтися у вікні проекту під відкритим відкритим вікном бібліотеки310 .

    введіть тут опис зображення

  3. Перейдіть до методу onCreate MainActivity.java і додайте цей код:

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

    Потім запустіть свою програму. Ви маєте побачити такі рядки в Android Monitor: введіть тут опис зображення (я не знаю, чому є такий рядок із повідомленням про помилку)

  4. Тепер спробуйте фактично використовувати якийсь код openCV. У наведеному нижче прикладі я скопіював файл .jpg в кеш-каталог програми cvtest1 на емуляторі Android. Код внизу завантажує це зображення, запускає алгоритм виявлення реберного ребра і потім записує результати назад у файл .png у той самий каталог.

    Помістіть цей код трохи нижче коду попереднього кроку та змініть його відповідно до власних файлів / каталогів.

    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. Запустіть свою програму. Ваш емулятор повинен створити чорно-біле зображення "краю". Ви можете скористатися монітором пристроїв Android, щоб отримати висновок або написати активність для його показу.

У Gotchas :

  • Якщо опустити цільову платформу нижче KitKat, деякі бібліотеки OpenCV більше не працюватимуть, зокрема класи, пов'язані з org.opencv.android.Camera2Renderer та іншими пов'язаними класами. Ви, ймовірно, зможете обійти це, просто видаливши відповідні файли OpenCV .java.
  • Якщо ви піднімете цільову платформу на Lollipop або вище, мій приклад завантаження файлу може не спрацювати, оскільки використання абсолютних шляхів до файлів нахмурене. Тому вам, можливо, доведеться змінити приклад, щоб завантажити файл із галереї чи десь ще. Навколо плавають численні приклади.

2
16 лютого редагувати: jniLibs тепер у каталозі openCVLibrary310, а не в основній довідці каталогу. Або працює, але мені здається більш чистим зберегти їх у відкритій частині. Плюс ще скріншоти та частина "Gotchas".
ssimm

Я думаю, що деякі заяви про імпорт відсутні, інакше дуже хороша робота! +1
Allan Nørgaard

1
Я слідував за вашою відповіддю, але не зміг. 1 я отримав помилку 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 Що ці помилки про мене зробили поетапно, як ви писали.
Девендра Сінгх

2
@DevendraSingh Я отримав таку ж помилку, що і ти, але я зрозумів, що пропустив крок 9.
аасу

2
що робити, якщо ми хочемо кодувати в c ++ для opencv на андроїд-студії?
користувач8663682

38

Для всіх, хто відчув, що хоче втекти з усіма кроками та знімками екрану на (чудово!) Вище відповіді, це працювало для мене із android studio 2.2.1:

  1. Створіть новий проект, назвіть його так, як вам потрібно, і прийміть за замовчуванням (minSdkVersion 15 добре).
  2. Завантажте zip-файл тут: https://sourceforge.net/projects/opencvlibrary/files/opencv-android/ (я завантажив версію 3.1.0, але можуть бути новіші версії).
  3. Розпакуйте zip-файл, найкраще місце знаходиться в папці робочої області, але це насправді не має значення.
  4. Усередині Android Studioнатисніть File->New-> Import Moduleі перейдіть до \path_to_your_unzipped_file\OpenCV-android-sdk\sdk\javaта натисніть Ок, а потім прийміть усі діалоги за замовчуванням.
  5. У gradleфайлі вашого app модуля додайте це до блоку залежностей:

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

Де XYZ - точна версія, яку ви завантажуєте, наприклад, у моєму випадку:

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

1
Приємно і просто, thnx ;-) Працює також для версії 3.2.0.
blacharnia

2
Дякую, це дійсно простіше рішення. Один пункт від мене. Неможливо скомпілювати новий модуль OpenCV. Відповідь тут допомогла мені виправити це питання stackoverflow.com/a/40302788/408780
Тіма

просто щоб додати те, що сказав @blacharnia, просто переконайтеся, що ви використовуєте "компілювати проект (': openCVLibrary320')" у розділі залежності колиски замість 310
Авраам Філіп

Можливо, загалом, щоб додати до вищезазначених коментарів, використовуйте "компілювати проект (': openCVLibraryXYZ')", де XYZ - номер версії openCV Android SDK без 'крапок' - це також працює зараз для версії 3.4.0 -> тобто використовувати "компілювати проект (': openCVLibrary340')"
Mick

@Мік спасибі, я відредагував відповідь відповідно до вашої пропозиції.
yshahak

9

Android Studio 3.4 + OpenCV 4.1

  1. Завантажте останній поштовий файл OpenCV звідси (поточна остання версія - 4.0.0) і розпакуйте його у робочій області або в іншій папці.

  2. Створіть звичайно новий проект Android Studio. Клацніть File->New->Import Module, перейдіть до /path_to_unzipped_files/OpenCV-android-sdk/sdk/java, встановіть назву модуля якopencv , натисніть Nextта зніміть прапорці на всіх параметрах на екрані.

  3. Увімкнути Projectрежим перегляду файлів (режим за замовчуванням Android). У opencv/build.gradleфайлі змініть apply plugin: 'com.android.application'на apply plugin: 'com.android.library'і замініть application ID "org.opencv"на

    minSdkVersion 21
    targetSdkVersion 28

    (відповідно до значень в app/build.gradle). Синхронізуйте проект з файлами Gradle.

  4. Додайте цей рядок до блоку залежностей у app/build.gradleфайлі

    dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
  5. Виберіть знову Androidрежим перегляду файлів. Клацніть правою кнопкою миші на appмодуль і перейдіть New->Folder->JNI Folder. Виберіть змінити папку та встановіть src/main/jniLibs/.

  6. Виберіть знову Projectрежим перегляду файлів і скопіюйте всі папки з /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libsдо app/src/main/jniLibs.

  7. Знову у Androidрежимі перегляду файлів клацніть правою кнопкою миші на appмодулі та виберіть Link C++ Project with Gradle. Виберіть Систему побудовиndk-build та шлях до OpenCV.mkфайлу /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk.

    path_to_unzipped_files не повинен містити пробілів, інакше ви отримаєте помилку!

Щоб перевірити ініціалізацію OpenCV, додайте повідомлення Toast у onCreate()методі MainActivity :

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

Якщо ініціалізація пройде успішно, ви побачите trueв повідомленні Toast ще те, що ви побачите false.


Нагорі ви кажете "замінити ідентифікатор програми" org.opencv "на .....", але нічого не слід після "з". Ви можете, будь ласка, уточнити? Ви маєте на увазі сказати "видаліть запис applicationId та додайте дві записи так:"
Дейл,

@Dale Так, слід замінити application ID "org.opencv"рядок двома рядками: minSdkVersion 21і targetSdkVersion 28(відповідно до значень у файлі app / build.gradle)
Plo_Koon

Я виконував усі кроки, як ви описали. Але отримання помилки E / art: dlopen ("/ data / app / com.example.objectsegmentation-1 / lib / arm64 / libopencv_java4.so", RTLD_LAZY) не вдалося: dlopen fail: library "libc ++ _ shared.so" not found
Мастхан

0

Будь-хто стикається з проблемою під час створення jniLibs CPP, показується .. просто додайте ndk ..


0

Це працювало для мене і було так само просто, як додавання залежності градуля:

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

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

Одним із застережень є те, що мені довелося використовувати апаратний налагоджувальний пристрій, оскільки емулятори для рук працюють занадто повільно для мене (як каже менеджер AVD, що буде), і, як описано в Repo README, ця версія не включає підтримку x86 або x86_64.

Здається, склався і запропонований тест:

static {
    OpenCVLoader.initDebug();
}

випльовує купу результатів, які виглядають як на мене.


Це було зі свіжого проекту в андроїд-студії. Я нічого не імпортував, нічого не завантажував і т. Д. Просто додайте ступінь залежності та синхронізацію.
Наумдев

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.