如何将OpenCV集成到Qt Creator Android项目中

时间:2014-12-19 08:38:44

标签: android c++ qt opencv

我使用Qt Creator编译Android应用程序。我需要将OpenCV集成到其中,我花了半天的时间来正确配置它,所以我想记录我在这里采取的步骤,以防其他人必须这样做。

3 个答案:

答案 0 :(得分:14)

首先,我下载了OpenCV-2.4.10-android-sdk,并将其放入我的项目目录中。它包含静态库and link order matters for static libraries for 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)

要解决此问题,您需要add libopencv_java.so to your 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

您可以从Android目标构建目录中获取QtActivity.java,在我的情况下,完整路径为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's 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's accessible from this class loader
        if (libName != null)
            System.loadLibrary(libName);

请注意,即使文件为opencv_java,您也会将System.loadLibrary()传递给libopencv_java.so


编辑:我忘了提及,但是在尝试运行OpenCV-2.4.10-android-sdk附带的一个示例时,我已经在手机上安装了OpenCV Manager,所以我不知道是否需要它。无论如何,请记住,如果在我的步骤之后它仍然失败,您可能需要下载OpenCV管理器(它可以在Google商店中使用)。

编辑2:我使用的是adt-bundle-windows-x86-20140702,android-ndk-r10d,OpenCV-2.4.10-android-sdk,Qt Creator 3.3.0 ,我的构建目标是" Android for armeabi-v7a(GCC 4.9,Qt 5.4.0)"。

编辑3 来自Daniel Saner's comment

  

在OpenCV 3.x中,opencv_java已重命名为opencv_java3。此外,虽然我没有查看可能影响到的具体更改,但最后一步中有关该库的解决方法似乎不再是必要的。该应用程序编译并运行时没有ANDROID_PACKAGE_SOURCE_DIR行

编辑4 :@ myk的评论:

  

使用OpenCV 3.2为我工作。要解决胡萝卜素的构建问题,请使用以下方法完成LIBS +部分:-lopencv_videostab \ -ltegra_hal \ - myk 2小时前

答案 1 :(得分:3)

对于OpenCV 4,sashoalm's approach在我适应它之前对我不起作用:

  1. 下载Android-Pack并将其解压缩到某个位置。我们将创建一个qmake-variable OPENCV_ANDROID,稍后指向该目录。
  2. 将以下代码段添加到您的*.pro文件中:

    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。如果您碰巧要建立另一种架构(显然Qt @ Android仍然是32位),则必须更改路径的.../libs/arm64-v8a部分(发生3次),并且要更改其大小才能匹配您的实际目标-体系结构(代码段第二行中的contains(...)部分)。

  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=..."添加到“其他参数”字段。您可以在android-kit的 Build 部分启用Project-Mode后找到它。展开 Build Steps
    • 下的 qmake 字段

答案 2 :(得分:0)

从Android android-ndk-r18b开始,使用Qt Creator 4.9.x套件,我无法将openCV-4.1.1预编译的共享库(.so)与Qt Android ABI armeabi-v7a目标结合使用,并且ABI arm64-v8a,因为Opencv标准基于GCC,而NDK-r18b删除了gcc并使用了clang编译器。 (我正在

  

致命信号11(SIGSEGV),代码1

initialize calling android_getCpuFeatures()上,当应用程序启动时) 因此,必须与clang的源代码一起编译openCV共享库,才能与Qt Android工具包一起使用。

此参考文献Compiling OpenCV on Android from C++ (Without OpenCVManager)确实有帮助。对于在Windows 10下使用的简单过程,我也会在这里留下参考,以使用NDK 18(c)为Qt Android编译opencv:

  • 下载了openCV source code
  • 下载了openCV contrib source for selected openCV version
  • 使用过的cmake for windows
  • 在解压缩的opencv源文件夹中,创建了一个新的构建文件夹。
  • Qt安装中的MinGW通常可以用于构建,因此我从Qt菜单中使用了Qt 5.11.x(MinGW 5.3.0 32位)命令行工具。
  • 在新构建文件夹中的命令行中,我可以生成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 -jxC:\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's 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配置进行详细控制,则可以使用cmake Windows gui,但这不是必须的且未经测试。 AmMIN's过程对于cmake工具很有帮助,请记住为共享的Android STL添加标志。