【问题标题】:How to integrate OpenCV into Qt Creator Android project如何将 OpenCV 集成到 Qt Creator Android 项目中
【发布时间】:2015-02-18 04:03:14
【问题描述】:

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

【问题讨论】:

    标签: android c++ qt opencv


    【解决方案1】:

    编辑:对于 OpenCV 4.x,请参阅下面的答案。我的答案仅在 OpenCV 2.4 上进行了测试。

    原答案:


    首先,我下载了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 hours ago

    【讨论】:

    • 非常感谢您的详细说明!在 OpenCV 3.x 中,opencv_java 已重命名为 opencv_java3。此外,虽然我没有研究可能影响此的具体更改,但不再需要修改 QtActivity.java 的最终解决方法,实际上尝试这样做会导致编译错误。添加ANDROID_PACKAGE_SOURCE_DIR 行并将libopencv_java3.so 复制到正确的目录就足够了。 (使用 Android 5.5.1 和 Qt 3.0.0 测试)
    • 从>= 3.0.0开始,OpenCV-android-sdk似乎不再包含上面的一些库:libopencv_ocl.so, libopencv_androidcamera.so ... 你知道为什么不再包括在内?
    • 我无法以这种方式设置 OpenCV,你能看看这个问题 - stackoverflow.com/questions/42608492/… 吗?
    • @InfinityChaos 尝试使用 opencv 2.4
    • 使用 OpenCV 3.2 为我工作。要解决与胡萝卜素有关的构建问题,请使用以下命令完成 LIBS+ 部分:-lopencv_videostab\ -ltegra_hal\
    【解决方案2】:

    对于 OpenCV 4,sashoalm's approach 在我改编之前对我不起作用:

    1. 下载Android-Pack并将其解压缩到某个地方。我们将创建一个 qmake 变量 OPENCV_ANDROID 稍后指向该目录。
    2. 将以下 sn-p 添加到您的 *.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。如果您碰巧为另一种架构构建(显然 32 位仍然是 Qt@Android 的默认设置),您必须更改路径的 .../libs/arm64-v8a 部分(出现 3 次)并且相同以匹配您的实际目标架构( sn-p第二行的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=..." 添加到“附加参数”字段。您可以在 android-kit 的 Build 部分中启用 Project-Mode 后找到它。展开 Build Steps 下的 qmake-字段

    【讨论】:

      【解决方案3】:

      从 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()) 因此,openCV 共享库必须从 clang 的源代码编译,才能与 Qt Android 工具包一起使用。

      这个参考Compiling OpenCV on Android from C++ (Without OpenCVManager) 真的很有帮助。对于我在 Windows 10 下使用的简单程序,我也会在此处留下参考,以使用 NDK 18 (clang) 为 Qt Android 编译 opencv:

      • 已下载openCV source code
      • 已下载openCV contrib source for selected openCV version
      • 使用cmake for windows
      • 在解压后的opencv源码文件夹中,新建了一个build文件夹。
      • Qt 安装的 MinGW 一般可以用于构建,所以我使用 Qt 菜单中的 Qt 5.11.x (MinGW 5.3.0 32 bit) 命令行工具。
      • 从命令行,在新的构建文件夹中,我可以生成 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 添加标志。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-24
        • 2020-05-26
        • 1970-01-01
        • 2012-02-17
        • 2012-10-04
        • 1970-01-01
        相关资源
        最近更新 更多