- Добавление библиотеки OpenCV в проект Android Studio
- Вступление
- 1. Загрузка OpenCV SDK для Android
- 2. Установка OpenCV в проект Android Studio
- 3. Разработка примера приложения OpenCV для Android
- Image Classification with OpenCV for Android
- Application Development
- Step-1: Android Studio Project Configuration
- OpenCV Manager Import
- Application Code Analysis
- CNNExtractorService Content
- MainActivity Content
- OpenCV in Android
- Захват видео с камеры
- Файлы приложения «Capture video from the camera»
- Отслеживание лица, используя каскад Хаара
Добавление библиотеки OpenCV в проект Android Studio
Вступление
Добрый день, уважаемые читатели! Всем давно известно, что мобильные устройства всё чаще комплектуются мощным аппаратным обеспечением. Процессоры современных смартфонов почти сравнялись с настольными аналогами, а проблемы с возможной нехваткой оперативной и внешней памяти уходят на второй план. Сегодня уже не встретишь телефоны или планшеты без внушительной программной платформы вроде Android, iOS или Windows, а кроме того, все мобильные устройства имеют те или иные встроенные модули, вроде фотокамеры. В данной статье речь пойдёт о встраивании библиотеки компьютерного зрения OpenCV в проект приложения для Android. Вероятно, данная статья не имела бы никакой значимой ценности, однако все инструкции в ней предназначены для Android Studio, новой официальной среды разработки от Google. К тому же, в статье описывается статическая инициализация OpenCV в Android без использования OpenCV Manager. Ниже представлен план руководства:
- Загрузка OpenCV SDK для Android
- Установка OpenCV в проект Android Studio
- Разработка примера приложения OpenCV для Android
Не будем терять времени и начнём работу.
1. Загрузка OpenCV SDK для Android
Для того, чтобы использовать OpenCV в своих приложениях, необходимо загрузить соответствующий SDK. Сделать это можно на официальном сайте opencv.org. На рисунке ниже показана ссылка на скачивание нужного архива:
В архив OpenCV SDK для Android входят двоичные файлы библиотек под разные архитектуры микропроцессоров, обёртка на языке программирования Java, которая использует Java Native Interface (JNI) для вызова функций из платформо-зависимых библиотек, исходные коды примеров программ и файлы .apk для установки OpenCV Manager. Следующий шаг — добавление модуля OpenCV в проект Android Studio.
2. Установка OpenCV в проект Android Studio
Импорт модуля OpenCV в проект Android Studio не представляет труда. Для этого нужно выбрать меню File -> New -> Import Module. и указать путь sdk/java из распакованного архива SDK. Все остальные настройки импорта менять не обязательно. На рисунке ниже показано окно мастера с указанием пути импорта модуля и его нового имени в проекте:
После импорта модуля в его build.gradle нужно обязательно обновить параметры compileSdkVersion, buildToolsVersion, minSdkVersion и targetSdkVersion, чтобы они совпадали с соответствующими параметрами из модуля приложения. После того, как модуль OpenCV был добавлен, его нужно присоединить в качестве зависимости к модулю приложения. Для этого нужно выбрать меню File -> Project Structure. и для модуля app указать зависимость от opencv. На рисунке ниже показано окно настройки зависимостей:
Последнее, что осталось сделать — добавить двоичные библиотеки OpenCV в проект, чтобы при сборке они были упакованы в .apk приложения. Для этого нужно скопировать папку sdk/native/libs из OpenCV SDK в папку проекта по пути app/src/main. Затем нужно переименовать папку libs в jniLibs. Следует отметить, что не нужно упаковывать статические библиотеки OpenCV (расширение .a) в .apk и хранить их в проекте. В образовавшейся папке jniLibs для каждой архитектуры можно оставить только файлы с расширением .so. На рисунке ниже показана получившаяся структура папок в Проводнике Windows:
3. Разработка примера приложения OpenCV для Android
Для того, чтобы быстрее начать работу с OpenCV, разработаем простое приложение для вывода изображения с камеры. Ниже приведено содержимое исходных файлов, которые необходимо изменить для запуска программы:
Источник
Image Classification with OpenCV for Android
November 16, 2020 By Leave a Comment
In the previous post, we’ve learned how to work with OpenCV Java API with the example of a PyTorch convolutional neural network, integrated into the Java pipeline. Now we are going to transform the obtained experience into a lightweight Android application.
There are some challenges on the way of creating such an application, and they are partly connected with OpenCV usage. In this post, we’ve collected the steps, which can help you to deal with some common problems while creating an Android application using OpenCV API. If you are mostly interested in the code part, you may skip the project configuration details and go to the “Application Code Analysis” section.
Application Development
Here we will describe the Android application creation process using Android Studio and OpenCV for Android SDK. We are going to cover the following points:
- Android project creation and initial configuration.
- OpenCV module import.
- Application configuration.
- Data capturing and processing pipeline implementation ( MainActivity.java ).
- CNN integration ( CNNExtractorService ).
- Run the final application.
Step-1: Android Studio Project Configuration
In this section, we are going to reproduce the project creation process in Android Studio step-by-step from scratch.
For the application development, we use 4.0.1 IDE version and opencv-4.3.0-android-sdk (for more details about OpenCV Android SDK retrieving, explore README file).
In the Android Studio, after you’ve chosen Start a new Android Studio project option, on the Select a Project Template page click on Phone and Tablet tab to choose Empty Activity :
Then configure your project by filling project name, package, location and API configurations fields:
OpenCV Manager Import
OpenCV Manager represents an Android service for managing OpenCV binaries on the end devices. There are two ways to involve OpenCV manager into the project – asynchronous and static. In the static approach, OpenCV binaries will be included in the application package. In the asynchronous way, OpenCV Manager should be also installed on the target device.
The recommended way is to use static linking as the compatibility provision between the platform and the library became an arduous task.
Thus, we will use static OpenCV manager initialization:
1. Import a new module to the project:
File > New > Import Module . specifying in the Source directory :
2. Set module name:
In the appeared Module name field choose the name for the imported module, in our application, we will use OpenCVLib430 . After import configurations are completed, you will find a new module named OpenCVLib430 in img_classification_android/settings.gradle file:
Download Code To easily follow along this tutorial, please download code by clicking on the button below. It’s FREE!
3. Modify build.graddle files of the new module in accordance with img_classification_android/app/build.graddle :
- Check the lines from the app module: img_classification_android/app/build.graddle containing compile SDK version and build tools version:
- Copy these versions to the appropriate lines of the imported OpenCV Android module ( img_classification_android/OpenCVLib430/build.gradle ):
- In img_classification_android/OpenCVLib430/build.gradle change the default apply plugin: ‘com.android.application’ into apply plugin: ‘com.android.library’ . After that modify defaultConfig block, adding minSdkVersion and targetSdkVersion as in img_classification_android/app/build.graddle :
- Add configured OpenCVLib430 module into app dependencies modifying its build.gradle
Now let’s execute Make Project ( crtl+F9 ) and verify whether the build was successful.
4. Transfer native libraries:
To finalize the OpenCV manager installation we need to transfer native libraries to the app :
Create jniLibs folder in the app/src/main directory. Then move the suitable files for your device architecture from OpenCV-android-sdk/sdk/native/libs into created app/src/main/jniLibs . For example, in our case it’s arm64-v8a (to get the cpu details on the device, you may run cat /proc/cpuinfo ).
5. Install NDK:
Now we need to install NDK (native development kit) to use C++ code of the OpenCV library. To do so, follow the steps below:
- Go to Tools > SDK Manager > Android SDK > SDK Tools
- Find NDK (Side by Side) and fill the checkbox
- Click OK button to proceed with the installation
After successful installation, go to the
/Android/Sdk/ndk/ /sources/cxx-stl/llvm-libc++/libs/ directory. There you will find the folders with the names corresponding to the names of directories in app/src/main/jniLibs. You need to copy libc++_shared.so into the corresponding folders in app/src/main/jniLibs. For example, in our case, we copy
/Android/Sdk/ndk/ /sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_shared.so into app/src/main/jniLibs/arm64-v8a .
The final project structure is below:
Application Code Analysis
In the first part, we described how to obtain the ONNX model with its further use in Java code with OpenCV API. We introduced Mobilenetv2ToOnnx.py script for .onnx obtaining and evaluating the results. After its execution, we get models/pytorch_mobilenet.onnx file, which will be used in the application. To be able to involve the converted model into the code, move it into assets folder.
It should be mentioned that assets directory in the Android project is used for the allocation of the project sources. By default, there is no such directory in the project. It can be created manually with mkdir or with the Android Studio component configurator via the right click on the app component: New > Folder > Assets Folder : app/src/main/assets
For further decoding of the predictions, we should also add imagenet_classes.txt file into app/src/main/assets .
To configure displaying of the precessed frames, we will modify app/src/main/activity_main.xml in the following way:
To configure camera access and screen orientation, we should add the below code into app/src/main/res/layout/AndroidManifest.xml :
Let’s have a look at the project code structure. MainActivity.java interacts with the core application logic, described in the CNNExtractorService implementation – CNNExtractorServiceImpl . MainActivity.java processes obtained from the device data with CNNExtractorService methods and returns labeled images as application response.
CNNExtractorService Content
CNNExtractorService consists of:
getConvertedNet invokes OpenCV org.opencv.dnn.Net obtained from pytorch_mobilenet.onnx :
getPredictedLabel provides inference and transforms MobileNet predictions into resulting object class:
In the first post, we discussed in detail each of the presented in the above code steps. Let’s briefly cover them:
- preprocess input frame – here we prepare input blob for the MobileNet model:
- set OpenCV model input – after input blob was prepared, we pass it into org.opencv.dnn.Net:
- process inference results with getPredictedClass(. ) method:
MainActivity Content
Let’s view MainActivity.java in more detail. One of its necessary parts provides OpenCV Manager initialization.
OpenCV Android Manager
As we’ve already discussed, the recommended way of OpenCV manager initialization is static. The below code represents static initialization:
Application Startup Configuration
The next part is onCreate(Bundle savedInstanceState) method description. Here we configure the application startup. The described in onCreate logic is invoked once on activity creation for its entire lifecycle. Thus, here we inject CNNExtractorService implementation and configure camera listener:
Camera Capturing
For the device camera interactions we need to provide the implementation of the following methods from CvCameraViewListener2 interface:
Источник
OpenCV in Android
Скачиваю с сайта OpenCV архив opencv-3.4.3-android-sdk.zip, распаковываю его и размещаю папку из распакованного архива в корень диска C.
Создаю в в Android Studio проект: File -> New -> New Project. Даю проекту имя opencv_project. Нажимаю Next -> Next -> Next -> Finish.
Выбираю меню File -> New -> Import Module… и указываю путь sdk/java из распакованного SDK архива:
В окне «Android» должен появиться модуль openCVLibrary343:
При этом еще откроется файл import_summary.txt. В нем предлагается вручную загрузить необходимые для проекта файлы. Закройте его. В этом проекте ничего догружать не нужно. Возможно это понадобится в других проектах.
В окне «Android» можно увидеть 3 файла с именем build.gradle, один из них принадлежит модулю openCVLibrary343:
Открываю этот файл и обновляю в нем параметры compileSdkVersion, buildToolsVersion, minSdkVersion и targetSdkVersion, чтобы они совпадали с соответствующими параметрами из файла build.gradle (Module:app).
После того, как модуль OpenCV был добавлен, его нужно присоединить в качестве зависимости к модулю приложения. Выбираю меню File -> Project Structure… В открывшемся окне выбираю app -> Dependencies -> + -> Module dependency -> OpenCVLibrary343 -> OK.
Последнее, что осталось сделать — добавить двоичные библиотеки OpenCV в проект, чтобы при сборке они были упакованы в .apk приложения. Для этого копирую папку sdk/native/libs из OpenCV SDK в папку проекта opencv_project/app/src/main. Переименовываю скопированную в проект папку libs в jniLibs.
В общем инсталляция OpenCV закончена. Сейчас можно проверить, что ничего в проекте не повреждено и по прежнему запускается «Hello World». Дополнительные установки и подключения для конкретных задач рассмотрены в примерах ниже.
Захват видео с камеры
Заменяю код в исходных файлах activity_main.xml и Main_Activity.java . Запускаю программу. Получаю вот такой результат:
«It seems that you r device does not support camera (or it is locked). Application will be locked.»
«Кажется, Ваше устройство не поддерживает камеру (или она заблокирована). Приложение будет закрыто.»
Для устранения этой ошибки выполняю следующее:
Первое. Ввожу в файл AndroidManifest.xml перед тегом application следующую строку:
Второе. В Android устройстве последовательно нажимаю выделенные красным прямоугольником кнопки
Кнопка напротив «Camera» должна быть активной при запуске проекта приложения, которое работает с камерой.
Третье. Вызываю AVD Manager кнопкой в правом верхнем углу Android Studio
открывается окно редактирования эмуляторов (у меня их 2), редактирую тот, что активный
В открывшемся окне нажимаю кнопку ShowAdvancedSettings и в блоке Camera выбираю Webcam0 для Front и Back.
Запускаю приложение и получаю ожидаемый результат:
Файлы приложения «Capture video from the camera»
activity_main.xml
Main_Activity.java
Отслеживание лица, используя каскад Хаара
Заимствую пример из интернет. Создаю новый проект, заменяю код в файле Main_Activity.java.
Код незначительно отличается от примера из интернет. Изменения вызваны обновленной версией OpenCV.
Через контекстное меню создаю директорию raw в папке res.
Копирую в эту папку файл lbpcascade_frontalface.xml из папки …\etc\lbpcascades установленного opencv-3.4.3-android-sdk:
В программу можно загружать и подключать разные каскады — в зависимости от ожидаемого результата (детектирование лица, глаз, кисти руки и т.п.). Часть каскадов находится в папке …\etc\… , другие можно поискать в интернет.
Запускаю программу. Получаю вот такой результат:
Очевидно, инсталляция еще не до конца выполнена, хотя предыдущая программа все же запускалась.
На сайте по ссылке описано, как можно решить эту проблему при работе с Android Studio в различных ОС (у меня Windows 10). Для инсталляции OpenCV Manager в эмуляторе выполняю следующее:
Копирую APK файл из установленного у меня на компьютере пакета opencv-3.4.3-android-sdk в директорию …android\sdk\platform-tools:
Через кнопку поисковика запускаю окно командной строки Windows: cmd
В окне командной строки последовательно ввожу команды, которые обеспечивают выход на соответствующую директорию и инсталляцию apk файла:
Перебирал несколько файлов для установки, пока не добился успешного результата (Succces) с файлом OpenCV_3.4.3_Manager_3.43_x86.apk. Другие подгруженные apk файлы из директории …android\sdk\platform-tools можно удалить.
Запускаю приложение после выполненных настроек и получаю ожидаемый результат (квадраты отслеживают положение лиц):
В случае использования другого эмулятора инсталляцию OpenCV Manager необходимо повторить, иначе снова будет появляться сообщение об ошибке «Package not found …»
Источник