Подтвердить что ты не робот

Как интегрировать OpenCV в проект Android Qt Creator

Я использую Qt Creator для компиляции приложения для Android. Мне нужно было интегрировать OpenCV в него, и мне потребовалось полдня, чтобы настроить его правильно, поэтому я хочу документировать шаги, которые я сделал здесь, на случай, если кто-то еще это сделает.

4b9b3361

Ответ 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 не работал для меня, пока я не адаптировал его:

  1. Загрузите Android-пакет и разархивируйте его где-нибудь. Мы создадим переменную qmake OPENCV_ANDROID, которая будет указывать на этот каталог позже.
  2. Добавьте следующий фрагмент в *.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 во второй строке фрагмента).

  3. Скажите 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.