如何将OpenCV整合到Qt Creator Android项目中

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

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

您可以从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); 

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


编辑:我忘了提及,但是当我试图运行OpenCV-2.4.10-android-sdk中的一个示例时,我已经在手机上安装了OpenCV管理器,所以我不知道是否需要。 无论如何,请记住,如果在我的步骤之后仍然失败,则可能需要下载OpenCV管理器(可在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小时前