Android
Интеграция OpenCV в Android Studio
Поиск…
замечания
Библиотеки Open CV можно найти в Интернете с помощью поисковой системы.
Готча :
- Если вы снижаете целевую платформу ниже KitKat, некоторые из библиотек OpenCV больше не будут работать, в частности классы, связанные с org.opencv.android.Camera2Renderer и другие связанные классы. Вы можете обойти это, просто удалив соответствующие файлы OpenCV .java.
- Если вы поднимете свою целевую платформу на Lollipop или выше моего примера загрузки файла, возможно, не сработает, потому что использование абсолютных путей к файлу неодобрительно. Поэтому вам может потребоваться изменить пример загрузки файла из галереи или где-то еще. Есть множество примеров, плавающих вокруг.
инструкции
Протестировано с AS v1.4.1, но должно работать и с более новыми версиями.
Создайте новый проект 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 с подкаталогами, которые начинаются с такие вещи, как рука ..., mips ... и x86 ... (по одному для каждого типа «архитектуры» Android работает)
Из Android Studio импортируйте OpenCV в свой проект как модуль: Menu: / File / New / Import_Module :
- Исходный каталог: {unzip-dir} / sdk / java
- Имя модуля: Студия Android автоматически заполняет это поле с помощью openCVLibrary310 (точное имя, вероятно, не имеет значения, но мы пойдем с этим).
- Нажмите дальше . Вы получаете экран с тремя флажками и вопросами о банках, библиотеках и опциях импорта. Все три должны быть проверены. Нажмите « Готово».
Android Studio начинает импортировать модуль, и вам будет показан файл import-summary.txt, в котором есть список того, что не было импортировано (в основном файлы javadoc) и другие фрагменты информации.
Но вы также получаете сообщение об ошибке, в котором не удалось найти цель с хеш-строкой «андроид-14» .... Это происходит из-за того, что файл build.gradle в загруженном zip-файле OpenCV говорит, что он компилируется с использованием API-интерфейсов Android версии 14, который по умолчанию у вас нет в Android Studio v1.4.1.
Откройте диалог структуры проекта ( меню: / File / Project_Structure ). Выберите модуль «приложение», перейдите на вкладку « Зависимости » и добавьте : openCVLibrary310 в качестве зависимости от модуля. Когда вы выбираете Add / Module_Dependency, он должен появиться в списке модулей, которые вы можете добавить. Теперь он будет отображаться как зависимость, но вы получите еще несколько ошибок can not-find-android-14 в журнале событий.
Посмотрите файл build.gradle для своего модуля приложения. В проекте Android есть несколько файлов build.gradle. Тот, который вы хотите, находится в каталоге cvtest1 / app, и из представления проекта он выглядит как build.gradle (Module: app) . Обратите внимание на значения этих четырех полей:
- compileSDKVersion (мой говорит 23)
- buildToolsVersion (мой говорит 23.0.2)
- minSdkVersion (мой говорит 19)
- targetSdkVersion (мой говорит 23)
Теперь у вашего проекта есть каталог cvtest1 / OpenCVLibrary310, но он не отображается в представлении проекта:
Используйте другой инструмент, например, любой файловый менеджер, и перейдите в этот каталог. Вы также можете переключить представление проекта с Android на файлы проекта, и вы можете найти этот каталог, как показано на этом скриншоте:
Внутри есть еще один файл build.gradle (он показан в приведенном выше снимке экрана). Обновите этот файл четырьмя значениями с шага 6.
Повторно протестируйте свой проект, а затем очистите его / восстановите. ( Меню: / Build / Clean_Project ) Он должен очищать и строить без ошибок, и вы должны увидеть много ссылок на : openCVLibrary310 на экране 0: Сообщения .
На данный момент модуль должен отображаться в иерархии проекта как openCVLibrary310 , как и приложение . (Обратите внимание, что в этом маленьком раскрывающемся меню я переключился с Project View на Android View ). Вы также должны увидеть дополнительный файл build.gradle в разделе «Gradle Scripts», но я обнаружил, что интерфейс Android Studio немного глючит, и иногда он не делает этого сразу. Поэтому попробуйте выполнить повторную синхронизацию, очистку и даже перезагрузку Android Studio.
Вы должны увидеть модуль openCVLibrary310 со всеми функциями OpenCV под java, как на этом скриншоте:
Скопируйте каталог {unzip-dir} / sdk / native / libs (и все под ним) в проект Android, в cvtest1 / OpenCVLibrary310 / src / main / , а затем переименуйте свою копию из libs в jniLibs . Теперь у вас должен быть каталог cvtest1 / OpenCVLibrary310 / src / main / jniLibs . Повторно протестируйте проект, и этот каталог теперь должен появиться в представлении проекта в openCVLibrary310 .
Перейдите в метод 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-файл в том же каталоге.
Put this code just below the code from the previous step and alter it to match your own files/directories.
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 Device Monitor для получения вывода или записи активности для его отображения.