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 …»
Источник
Поиск людей на фотографиях на Android с помощью OpenCV
Недавеча столкнулся с одной интересной задачкой для мобильного “коня” на Android’e- необходимо определить контуры людей на фотографиях (если таковы там были, естественно). После поиска в интернете, было решено использовать open source проект OpenCV, который может работать на платформе Android.
О нем уже было много написано, но данный сабж мной найден не был и был собран из нескольких источников и личных наблюдений.
Настройка
Небольшое описание как включить библиотеку в проект на Android Studio (с применением gradle):
Для начала работы необходимо скачать последнюю версию библиотеки с сайта и скопировать содержимое папки OpenCV-2.4.8-android-sdk/sdk/java из архива в папку libs/OpenCV вашего проекта (при необходимости — создать).
Далее подключаем данный модуль в файлы gradle:
В корневой папке проекта редактируем settings.gradle и добавляем наш модуль:
В файле build gradle нашего приложения (не в корневой файл, а app/build.gradle ) добавляем строчку compile project(‘:app:libs:OpenCV’) в секцию dependencies , дабы получилось:
И создаем файл build.gradle в папке OpenCV с кодом:
Ну, собственно говоря, все, OpenCV Android SDK подключена и мы можем переходить к реализации.
Установка библиотек на устройство
На первом этапе знакомства с OpenCV, меня смутила некоторая особенность работы под Android- это необходимость устанавливать отдельно приложение OpenCV Manager, непосредственно с которым и будет взаимодействовать ваше творение. Довольно таки странное решение, ибо надо будет объяснить конечному пользователю факт того, что дабы воспользоваться вашим приложением ему надо будет установить в маркете еще одну программку(благо пользователя перенаправит непосредственно ваше приложение, что не даст человеку заблудиться, но все-равно может его отпугнуть).
Существует и другой путь подключения- статическая инициализация, но разработчики утверждают, что она существует только для девелоперских целей и, как мне кажется, может быть убрана в новых версиях (It is designed mostly for development purposes. This approach is deprecated for the production code, release package is recommended to communicate with OpenCV Manager via the async initialization described above.).
Но в контексте данной статьи, нам это только на руку т.к. не требуется возиться с подлючением NDK и сборкой\подключением сишных библиотек в проект. Так что продолжим.
Для установки OpenCV Manager на эмулятор воспользуемся утилитой adb из нашего Android SDK. Для этого запустите виртуальное устройство, дождитесь его загрузки и выполните команду:
/PATH_TO_ANDROID_SDK/platform-tools/adb install /PATH_TO_OPENCV/OpenCV-2.4.8-android-sdk/apk/OpenCV_2.4.8_Manager_2.16_armv7a-neon.apk (выбрав подходящий под ABI apk).
Работа с изображениями
Вся инициализация OpenCV в приложении заключается в реализации callback интерфейса BaseLoaderCallback, где есть один метод onManagerConnected, в котором можем и уже можем начинать работу с OpenCV, и вызове статического метода OpenCVLoader.initAsync, с передачей в него необходимых параметров(включая callback). Если Ваше приложение не найдет OpenCV Manager, то попросит пользователя его установить. Подключение:
Теперь смело можем работать с нашей библиотекой.
В данном примере мы создаем Bitmap из url фотографии, далее переводим ее в объект OpenCV Mat (матрица изображения), конвертируем из цветной в градацию серого (это требуется для анализатора) и вызовем статический метод объекта HOGDescriptor.detectMultiScale (в который предварительно добавляем стандартный детектор человеческих контуров из метода HOGDescriptor.getDefaultPeopleDetector ). После вызова, в переменной locations будут содержаться объекты прямоугольных областей нахождения людей (x, y, width, height), а в weights — релевантность поиска (но, как показала практика, она не совсем отвечает действительности при таких изображениях).
Для простоты я залил фотографии на facebook и объединил методы закачки и обработки фотографий в один. Сам код метода:
На выходе получаем bitmap с наложенными на него областями предположительного нахождения людей, весом данного результата поиска и некой дополнительной информацией. Скорость обработки одной фотографии(до тысячи пикселей в ширину и высоту) на Samsung Galaxy S3 составляет около 1-6 секунд. Ниже — результаты поиска со временем выполнения.
На первой фотографии анализатор не нашел ни одного человека, как бы нам не хотелось(
Image-1.jpg width:488 height:420 executionTime:1.085
Далее результат получше, но тоже не то
Image-2.jpg width:575 height:400 executionTime:1.226
Да и третий подкачал
Image-3.jpg width:618 height:920 executionTime:6.459
Уже что-то
Image-4.jpg width:590 height:505 executionTime:3.084
Перейдя к более «живым» фото, результат получился для меня слегка неожиданным
Image-5.jpg width:604 height:453 executionTime:1.913
Памятник частично был распознан
Image-6.jpg width:960 height:643 executionTime:4.106
А вот и первая фотография, которая действительно показывает, для чего библиотека «заточена»
Image-7.jpg width:960 height:643 executionTime:2.638
На четком контрасте не получил нужный эффект
Image-8.jpg width:960 height:857 executionTime:3.293
Здесь ничего не определил
Image-9.jpg width:960 height:642 executionTime:2.264
Фотография с людьми на дальнем плане
Image-10.jpg width:960 height:643 executionTime:2.188
Крупный план, но безуспешно
Image-11.jpg width:960 height:639 executionTime:2.273
Вместо четырех- немного больше
Image-12.jpg width:960 height:640 executionTime:2.669
Как видно из полученных результатов, библиотека более предназначена для определения фото\видео с камер наблюдения, где можно выделить объект и подтвердить его следующими кадрами, а для фотографий, с заранее неизвестными планами, дает достаточно большую ошибку распознавания(можно фильтровать по весу, но тогда рискуем потерять много образов). Скорость анализа изображения пока не позволяет использовать OpenCV для большого количества фотографий, да и при работе в режиме реального времени, на данных мощностях и алгоритмах, может не успевать за потоком кадров.
Для моих целей библиотека не подошла, но может быть мое мини исследование будет вам полезно.
Источник