Інтеграція OpenCV v3.1.0 в Android Studio v1.4.1 , інструкції з додатковою деталізацією та скріншоти типу "що є, що вам потрібно".
Більша частина кредитів припадає на Kiran, Kool, 1 "та SteveLiles на opencv.org за їх поясненнями. Я додаю цю відповідь, тому що я вважаю, що інтерфейс Android Studio тепер досить стабільний, щоб працювати з цим типом інтеграційних матеріалів Також мені доведеться написати ці вказівки для нашого проекту.
Досвідчені розробники AS знайдуть частину цього педантичного. Ця відповідь орієнтована на людей з обмеженим досвідом роботи в Android Studio.
Створіть новий проект Android Studio за допомогою майстра проекту (Меню: / Файл / Новий проект):
- Назвіть це " cvtest1 "
- Формовий фактор: API 19, Android 4.4 (KitKat)
Пуста активність назвою MainActivity
У вас повинен бути cvtest1 каталог де зберігається цей проект. (заголовок студії Android показує, де знаходиться cvtest1, коли ви відкриваєте проект)
Перевірте, чи правильно працює ваш додаток. Спробуйте змінити щось на зразок тексту "Hello World", щоб підтвердити, що цикл складання / тестування для вас нормальний. (Я тестую за допомогою емулятора пристрою API 19).
Завантажте пакет OpenCV для Android v3.1.0 і десь розпакуйте його в тимчасовому каталозі. (Переконайтесь, що це пакет спеціально для Android, а не лише пакет OpenCV для Java.) Я буду називати цей каталог " unzip-dir ". Під unzip-dir вам слід мати каталог sdk / native / libs з підкаталогами, які починаються з такі речі, як arm ..., mips ... і x86 ... (по одному для кожного типу "архітектури" Android працює)
З 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.
Відкрийте діалог структури проекту ( Меню: / Файл / Проект_Структура ). Виберіть модуль "додаток", натисніть на вкладку " Залежності" і додайте : openCVLibrary310 як залежність від модуля. Коли ви виберете « Додати / модуль_залежність», він повинен з’явитися у списку модулів, які ви можете додати. Тепер він відображатиметься як залежність, але ви отримаєте ще кілька помилок не в змозі знайти андроїд-14 у журналі подій.
Подивіться у файл build.gradle свого модуля програми. У проекті Android є кілька файлів build.gradle. Той, що ви хочете, знаходиться в каталозі cvtest1 / app і з вигляду проекту він виглядає так build.gradle (Модуль: додаток) . Зверніть увагу на значення цих чотирьох полів:
- compileSDKVersion (мій каже 23)
- buildToolsVersion (моє слово 23.0.2)
- minSdkVersion (мій каже 19)
- targetSdkVersion (мій каже 23)
Зараз у вашому проекті є каталог cvtest1 / OpenCVLibrary310, але це не видно з подання проекту:
Скористайтеся іншим інструментом, наприклад, будь-яким файловим менеджером, і перейдіть до цього каталогу. Ви також можете переключити перегляд проекту з Android на Файли проектів, і ви можете знайти цей каталог, як показано на цьому скріншоті:
Всередині є ще один файл build.gradle (він виділений на наведеному вище скріншоті). Оновіть цей файл чотирма значеннями з кроку 6.
Повторно синхронізуйте проект, а потім очистіть / відновіть його. (Меню: / Build / Clean_Project ) Він повинен очищатись і створюватись без помилок, і ви повинні побачити багато посилань на : openCVLibrary310 на екрані 0: Messages .
У цей момент модуль повинен з’явитися в ієрархії проектів як openCVLibrary310 , як і додаток . (Зверніть увагу , що в цьому маленькому спадному меню я переключився назад від Project View для Android View ). Також слід побачити додатковий build.gradle файл розділі "Сценарії Gradle", але я вважаю, що інтерфейс Android Studio трохи глюкозний, а іноді це не робиться відразу. Тож спробуйте повторно синхронізувати, очистити, навіть перезапустити Android Studio.
Ви повинні побачити модуль openCVLibrary310 з усіма функціями OpenCV під Java, як на цьому знімку екрана:
Скопіюйте каталог {unzip-dir} / sdk / native / libs (і все, що знаходиться під ним) у свій проект Android, в cvtest1 / OpenCVLibrary310 / src / main / , а потім перейменуйте свою копію з libs в jniLibs . Тепер у вас має бути каталог cvtest1 / OpenCVLibrary310 / src / main / jniLibs . Повторіть синхронізацію свого проекту, і цей каталог тепер повинен з’являтися у вікні проекту під відкритим відкритим вікном бібліотеки310 .
Перейдіть до методу 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:
(я не знаю, чому є такий рядок із повідомленням про помилку)
Тепер спробуйте фактично використовувати якийсь код 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);
Запустіть свою програму. Ваш емулятор повинен створити чорно-біле зображення "краю". Ви можете скористатися монітором пристроїв Android, щоб отримати висновок або написати активність для його показу.
У Gotchas :
- Якщо опустити цільову платформу нижче KitKat, деякі бібліотеки OpenCV більше не працюватимуть, зокрема класи, пов'язані з org.opencv.android.Camera2Renderer та іншими пов'язаними класами. Ви, ймовірно, зможете обійти це, просто видаливши відповідні файли OpenCV .java.
- Якщо ви піднімете цільову платформу на Lollipop або вище, мій приклад завантаження файлу може не спрацювати, оскільки використання абсолютних шляхів до файлів нахмурене. Тому вам, можливо, доведеться змінити приклад, щоб завантажити файл із галереї чи десь ще. Навколо плавають численні приклади.