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

sas*_*alm 23 c++ qt android opencv

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

sas*_*alm 14

首先,我下载了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
}
Run Code Online (Sandbox Code Playgroud)

之后,项目将编译,但它将无法运行错误

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)
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您需要将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
Run Code Online (Sandbox Code Playgroud)

您可以从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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

请注意,即使文件是,也要传递opencv_java给.System.loadLibrary()libopencv_java.so


编辑:我忘了提一下,但是当我尝试运行OpenCV-2.4.10-android-sdk附带的一个示例时,我已经在手机上安装了OpenCV Manager,所以我不知道是否需要它.无论如何,请记住,如果在我的步骤之后它仍然失败,您可能需要下载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 for armeabi-v7a (GCC 4.9,Qt 5.4.0)".

编辑3:来自Daniel Saner的评论:

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

编辑4:@myk的评论:

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


pas*_*sbi 6

对于 OpenCV 4,sashoalm 的方法在我调整之前对我不起作用:

  1. 下载Android-Pack并将其解压缩到某处。稍后我们将创建一个OPENCV_ANDROID指向该目录的 qmake 变量。
  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")
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这将适用于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=..."到“附加参数”字段。您可以在 android-kit的Build -section 中启用Project-Mode后找到它。展开Build Steps下的qmake -field