Я использую Qt Creator для компиляции приложения для Android. Мне нужно было интегрировать OpenCV в него, и мне потребовалось полдня, чтобы настроить его правильно, поэтому я хочу документировать шаги, которые я сделал здесь, на случай, если кто-то еще это сделает.
Как интегрировать OpenCV в проект Android Qt Creator
Ответ 1
Изменить: Для OpenCV 4.x см. ответы ниже. Мой ответ был протестирован только на OpenCV 2.4.
Оригинальный ответ:
Сначала я загрузил OpenCV-2.4.10-android-sdk и поместил в каталог моего проекта. Он содержит статические библиотеки, и вопросы порядка ссылок для статических библиотек для GCC. Так что нужно заказывать их просто так. Вот как в итоге выглядел мой .pro файл ($$ _ PRO_FILE_PWD_ ссылается на каталог проекта):
INCLUDEPATH += "$$_PRO_FILE_PWD_/OpenCV-2.4.10-android-sdk/sdk/native/jni/include"
android {
LIBS += \
-L"$$_PRO_FILE_PWD_/OpenCV-2.4.10-android-sdk/sdk/native/3rdparty/libs/armeabi-v7a"\
-L"$$_PRO_FILE_PWD_/OpenCV-2.4.10-android-sdk/sdk/native/libs/armeabi-v7a"\
-llibtiff\
-llibjpeg\
-llibjasper\
-llibpng\
-lIlmImf\
-ltbb\
-lopencv_core\
-lopencv_androidcamera\
-lopencv_flann\
-lopencv_imgproc\
-lopencv_highgui\
-lopencv_features2d\
-lopencv_calib3d\
-lopencv_ml\
-lopencv_objdetect\
-lopencv_video\
-lopencv_contrib\
-lopencv_photo\
-lopencv_java\
-lopencv_legacy\
-lopencv_ocl\
-lopencv_stitching\
-lopencv_superres\
-lopencv_ts\
-lopencv_videostab
ANDROID_PACKAGE_SOURCE_DIR=$$_PRO_FILE_PWD_/android
}
После этого проект будет скомпилирован, но он не будет работать с ошибкой
E/AndroidRuntime(11873): java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1891]: 176 could not load needed library 'libopencv_java.so' for 'libMyProject.so' (load_library[1093]: Library 'libopencv_java.so' not found)
Чтобы преодолеть это, вам нужно добавить libopencv_java.so в ваш APK, а затем вручную загрузить его из QtActivity.java. Для этого и была строка ANDROID_PACKAGE_SOURCE_DIR=$$_PRO_FILE_PWD_/android
в конце. Теперь вам нужно разместить libopencv_java.so здесь:
project_root/android/libs/armeabi-v7a/libopencv_java.so
project_root/android/src/org/qtproject/qt5/android/bindings/QtActivity.java
Вы можете получить QtActivity.java из каталога целевой сборки Android, в моем случае полный путь был c:\Workspace\build-MyProject-Android_for_armeabi_v7a_GCC_4_9_Qt_5_4_0-Debug\android-build\src\org\qtproject\qt5\android\bindings\QtActivity.java
, и просто скопируйте его.
Затем вы найдете в нем следующие строки:
// now load the application library so it accessible from this class loader
if (libName != null)
System.loadLibrary(libName);
И загрузи libopencv_java.so
перед ними, чтобы они стали:
// This is needed for OpenCV!!!
System.loadLibrary("opencv_java");
// now load the application library so it accessible from this class loader
if (libName != null)
System.loadLibrary(libName);
Обратите внимание, что вы передаете opencv_java
в System.loadLibrary()
, даже если файл libopencv_java.so
.
Изменить: Я забыл упомянуть, но я уже установил OpenCV Manager на свой телефон при попытке запустить один из примеров, поставляемых с OpenCV-2.4.10-android-sdk, поэтому я не знаю, нужно ли это или нет. В любом случае, имейте это в виду, что в случае сбоя даже после моих шагов вам может понадобиться загрузить OpenCV Manager (он доступен в Google Store).
Изменить 2: Я использую adt-bundle-windows-x86-20140702, android-ndk-r10d, OpenCV-2.4.10-android-sdk, Qt Creator 3.3.0, и моя цель сборки - "Android для armeabi-v7a (GCC 4.9, Qt 5.4.0) ".
Изменить 3: Из комментария Даниэля Санера:
В OpenCV 3.x opencv_java был переименован в opencv_java3. Кроме того, хотя я не рассматривал конкретные изменения, которые могли бы повлиять на это, обходной путь для этой библиотеки на последнем этапе, похоже, больше не нужен. Приложение компилируется и запускается без строки ANDROID_PACKAGE_SOURCE_DIR
Изменить 4: @myk комментарий:
Работал для меня с OpenCV 3.2. Чтобы обойти проблемы с каротином, завершите раздел LIBS+: -lopencv_videostab\-ltegra_hal\- myk 2 часа назад
Ответ 2
Для OpenCV 4 подход sashoalm не работал для меня, пока я не адаптировал его:
- Загрузите Android-пакет и разархивируйте его где-нибудь. Мы создадим переменную qmake
OPENCV_ANDROID
, которая будет указывать на этот каталог позже. Добавьте следующий фрагмент в
*.pro
-file:android { contains(ANDROID_TARGET_ARCH,arm64-v8a) { isEmpty(OPENCV_ANDROID) { error("Let OPENCV_ANDROID point to the opencv-android-sdk, recommended: v4.0") } INCLUDEPATH += "$$OPENCV_ANDROID/sdk/native/jni/include" LIBS += \ -L"$$OPENCV_ANDROID/sdk/native/libs/arm64-v8a" \ -L"$$OPENCV_ANDROID/sdk/native/3rdparty/libs/arm64-v8a" \ -llibtiff \ -llibjpeg-turbo \ -llibjasper \ -llibpng \ -lIlmImf \ -ltbb \ -lopencv_java4 \ ANDROID_EXTRA_LIBS = $$OPENCV_ANDROID/sdk/native/libs/arm64-v8a/libopencv_java4.so } else { error("Unsupported architecture: $$ANDROID_TARGET_ARCH") } }
Это будет работать только для
arm64-v8a
. Если вам случается собирать для другой архитектуры (очевидно, 32-битная версия все еще по умолчанию для Qt @Android), вы должны изменить часть путей.../libs/arm64-v8a
(встречается 3 раза), чтобы она соответствовала вашей фактической целевой архитектуре (contains(...)
-part во второй строке фрагмента).- Скажите
qmake
, где найти SDK. Добавьте в qmake-call следующее:"OPENCV_ANDROID=/path/to/OpenCV-android-sdk"
.- например, это выглядит как
qmake example.pro "OPENCV_ANDROID=/home/user/OpenCV-android-sdk"
из командной строки. - когда вы используете QtCreator, добавьте
"OPENCV_ANDROID=..."
в "Дополнительные аргументы" -field. Вы можете найти его после включения Project-Mode в разделе Build android-kit. Разверните qmake -field в разделе Шаги сборки
- например, это выглядит как
Ответ 3
Начиная с Android android-ndk-r18b
с наборами Qt Creator 4.9.x
, я не мог использовать предварительно скомпилированные общие библиотеки [.G42] (.so) с целью Qt Android ABI armeabi-v7a
и ABI arm64-v8a
, так как стандарт Opencv основан на GCC, пока NDK-r18b убрал gcc и использует компилятор clang. (Я получаю
Fatal signal 11 (SIGSEGV), code 1
На initialize calling android_getCpuFeatures()
при запуске приложения)
Таким образом, общие библиотеки openCV должны быть скомпилированы из исходников для clang
, чтобы их можно было использовать с наборами Qt Android.
Эта ссылка Компиляция OpenCV на Android из C++ (без OpenCVManager) очень помогла. Я бы также оставил здесь ссылку на простую процедуру, которую я использовал в Windows 10, чтобы скомпилировать opencv с NDK 18 (clang) для Qt Android:
- Загруженный исходный код openCV
- Загруженный исходный код openCV для выбранной версии openCV
- Используется cmake для Windows
- в разархивированной исходной папке opencv создал новую папку сборки.
- MinGW из установки Qt обычно можно использовать для сборки, поэтому я использовал инструмент командной строки Qt 5.11.x(MinGW 5.3.0 32 bit) из меню Qt.
из командной строки, в новой папке сборки, я могу создать конфигурацию cmake:
C:\opencv-4.1.1\build> "C:\program files\cmake\bin\cmake" .. -G"MinGW Makefiles" -DBUILD_SHARED_LIBS=ON -DANDROID_STL=c++_shared -DANDROID_ABI="armeabi-v7a with NEON" -DANDROID_NATIVE_API_LEVEL=23 -DANDROID_TOOLCHAIN=clang -DCMAKE_TOOLCHAIN_FILE=D:\Qt\android-ndk-r18b\build\cmake\android.toolchain.cmake -DANDROID_NDK=D:\Qt\android-ndk-r18b -DANDROID_SDK=C:\Users\moham\AppData\Local\Android\sdk -DCMAKE_BUILD_TYPE=Debug -DBUILD_ANDROID_PROJECTS=OFF -DWITH_OPENCL=ON -DWITH_TBB=ON -DENABLE_NEON=ON -DBUILD_TESTS=OFF -DBUILD_PERF_TESTS=OFF -DBUILD_FAT_JAVA_LIB=OFF
- Затем
C:\opencv-4.1.1\build>\mingw32-make -jx
иC:\opencv-4.1.1\build>\mingw32-make install
- Полученные библиотеки можно выбрать из папки
opencv-4.1.1\build\install
Ссылка в проекте Qt Android:
android { #opencv OPENCVLIBS = $$PWD/../opencv-4.1.1\build\install/sdk/native INCLUDEPATH = $$OPENCVLIBS/jni/include contains(ANDROID_TARGET_ARCH,armeabi-v7a) { # might need libs to be copied into app library folder and loaded on start-up, in case android ships older libs??! ANDROID_EXTRA_LIBS = \ $$OPENCVLIBS/libs/armeabi-v7a/libopencv_core.so \ $$OPENCVLIBS/libs/armeabi-v7a/libopencv_imgproc.so \ $$OPENCVLIBS/libs/armeabi-v7a/libtbb.so LIBS += -L"$$OPENCVLIBS/libs/armeabi-v7a"\ -lopencv_core -lopencv_imgproc -ltbb } ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android }
Также скопируйте библиотеки в
ANDROID_PACKAGE_SOURCE_DIR
Примечание. Если требуется подробный контроль конфигурации cmake, можно использовать графический интерфейс Windows cmake, хотя это не является обязательным и не проверено. Процедура AmMIN полезна для инструмента cmake, не забудьте добавить флаг для общего Android STL.