如何在 Android Studio 中导入 OpenCV 4.5

问题描述

这个问题偶尔会得到新的支持这一事实让我觉得我不是唯一一个遇到这种情况的人,所以我决定写一个我有用的分步说明,希望其他人将来可能会发现它很有用。一切都基于 this video,但我认为最好在此处编写适当的指南,以防它被删除

如果您正在寻求有关 OpenCV 3.4 的帮助,this 是我在尝试 4.5 版之前关注的内容

解决方法

这是目前在 Android Studio 4.1.3 上使用 OpenCV 4.5.2 对我有用的完整过程。

  1. 在您的项目中,单击 File > New > Import Module... 并选择 OpenCV 下载中的 /sdk 目录。为其指定一个有意义的名称并等待该过程完成:您选择的目录应该已复制到默认 /app 目录所在的项目根目录中;
  2. 打开项目结构(例如通过点击 File > Project Structure...),然后转到 Dependencies(在左侧),点击 app+ 图标在 Declared Dependencies 标签中(不是在 Modules 标签中);
  3. 点击 Module Dependency 并选中您之前导入的 OpenCV SDK 的复选框。您现在应该在列表中看到它和其他依赖项,因此点击 ApplyOK 退出项目结构;
  4. 打开应用模块的 build.gradle 文件,复制 compileSdkVersionminSdkVersiontargetSdkVersion 的值,然后将它们粘贴到应用模块的 build.gradle 文件中OpenCV 模块替换默认模块,以便它们完全匹配。您还可以将 sourceCompatibilitytargetCompatibility 字段更新为 JavaVersion.VERSION_1_8;
  5. 最后,将您的项目与 Gradle 文件同步。

要检查它是否有效,请将此代码段添加到您的代码中,例如在 MainActivity 中:

if (OpenCVLoader.initDebug()) {
    Log.d("myTag","OpenCV loaded")
}
,

opencv 4.5.3 版本的 sdk 目录是“opencv/sources/modules/java/android_sdk”。在对 https://stackoverflow.com/a/65571017/9486652 执行每个步骤后,我遇到了一些错误,我通过评论或删除 'arguments "-DANDROID_STL=@ANDROID_STL@"' 在 opencv 模块的 build.gradle 中找到的行。

    externalNativeBuild {
         cmake {
//          arguments "-DANDROID_STL=@ANDROID_STL@"
            targets "opencv_jni_shared"
        }
    }
,

我成功地在 android studio 中导入了 opencv 4.5.2。这不是那么困难。关键是为CMake提供正确的OpenCV_DIR路径来安装OpenCV。详细教程写在 https://kcwong-joe.medium.com/how-to-import-opencv-4-5-2-in-android-studio-d9114179628f 但我将在此处简要描述该过程。

下载 SDK https://opencv.org/releases/

按文件导入模块 > 新建 > 导入模块...

在setting.gradle中添加OpenCV模块

include "opencv"
project(":opencv").projectDir = file("sdk")

在 application build.gradle 中,在下面添加 OpenCV_DIR cmake 参数 android > defaultConfig > externalNativeBuild > cmake

arguments "-DOpenCV_DIR=" + file('../sdk').absolutePath + "/native/jni","-DANDROID_TOOLCHAIN=clang","-DANDROID_STL=c++_shared"

在应用 build.gradle 中添加 OpenCV 模块依赖

implementation project(':opencv')

在您的应用程序 cmake 中链接 OpenCV 库。

set(ANDROID_OPENCV_COMPONENTS "opencv_java" CACHE STRING "")
message(STATUS "ANDROID_ABI=${ANDROID_ABI}")
find_package(OpenCV REQUIRED COMPONENTS ${ANDROID_OPENCV_COMPONENTS})
......
target_link_libraries(${PROJECT_NAME} ${ANDROID_OPENCV_COMPONENTS})