Android Studio 中的 OpenCV

我想在我的 Android Studio 应用程序中使用 OpenCV 库。我按照指示找到了 给你,但我得到了错误

未找到名称为“ default”的配置

能有什么问题呢?

我使用 Android Studio 1.0和2.2.1级别。

228996 次浏览

下面是在 Android Studio 中使用 Android OpenCV sdk 的步骤。

  1. OpenCV.org下载 best OpenCV sdk for Android 并解压压缩压缩文件。
  2. 导入 OpenCV 到 Android Studio ,从 文件-> 新建-> 导入模块中,在解压缩的 OpenCV 归档文件中选择 Sdk/java文件夹。
  3. 在导入的 OpenCV 模块下更新 build.gradle ,以更新4个字段以匹配项目 build.gradle a)编译的 SdkVersion b) buildToolsVersion c) minSdkVersion 和 d) targetSdkVersion。
  4. 通过 应用程式-> 模组设定添加模块依赖项 ,并选择 依赖性选项卡。单击底部的 +图标,选择 模组依赖性并选择导入的 OpenCV 模块。
    • 对于 Android Studio v1.2.2,访问模块设置: 在项目视图中,右键单击依赖模块 - > < em > 开启模组设定
  5. Sdk/本地下的 Libs 文件夹复制到 App/src/main下的 Android Studio。
  6. 在 Android Studio 中,将复制的 < em > libs 目录重命名为 < em > jniLibs 和我们完成了。

步骤(6)是因为 Android 工作室期望本机库在 app/src/main/jniLibs而不是旧的 libs文件夹。对于那些刚接触 Android OpenCV 的人,不要错过以下步骤

  • Include static{ System.loadLibrary("opencv_java"); }(注意: 在此步骤中,对于 OpenCV 版本3,您应该改为加载库 opencv_java3。)
  • 对于步骤(5) ,如果忽略任何平台库(如 x86) ,请确保设备/模拟器不在该平台上。

OpenCV 是用 C/C + + 编写的

  1. Android OpenCVSDK -OpenCV.org 维护 Android Java 包装器。
  2. OpenCVJava -OpenCV.org 维护自动生成的桌面 Java 包装器。
  3. JavaCV -由独立开发人员维护的流行 Java 包装器。不是 Android 特有的。这个库 也许吧与 OpenCV 的新版本不同步。

将 OpenCV v3.1.0集成到 Android Studio v1.4.1 ,带有附加细节的说明和 this-is-what-you-should-get 类型屏幕截图。

大部分的功劳归功于 Kiran,Kool,1”,以及来自 opencv.org 的 SteveLiles 的解释。我添加这个答案是因为我相信 Android Studio 的界面现在已经足够稳定,可以处理这种类型的集成。而且我还得为我们的项目写这些说明书。

有经验的 A.S. 开发人员会发现其中有些是迂腐的。这个答案针对的是在 Android Studio 中经验有限的人。

  1. 使用项目向导(菜单:/File/New Project)创建一个新的 Android Studio 项目:

    • 叫它 Cvtest1
    • 形状因素: API 19,Android 4.4(KitKat)
    • 空白活动

      您应该有一个存储此项目的 Cvtest1目录。(Android 工作室的标题栏显示了打开项目时 cvtest1的位置)

  2. 验证应用程序是否正确运行。尝试更改诸如“ Hello World”文本之类的内容,以确认构建/测试周期对您来说是可以的。(我正在使用 API 19设备的模拟器进行测试)。

  3. 下载用于 Android v3.1.0的 OpenCV 包,并将其解压缩到某个临时目录中。(确保它是专门针对 Android 的软件包,而不仅仅是 OpenCV for Java 软件包。)我将这个目录命名为“ 解开拉链”,在 解开拉链下面应该有一个 Sdk/原生/libs目录,其子目录以诸如 胳膊... 、 米普斯... 和 X86... (每种类型的“架构”都有一个)开头

  4. 从 Android Studio 将 OpenCV 作为模块导入到您的项目中: 菜单:

    • 源目录: { unzip-dir }/sdk/java
    • 模块名称: Android 工作室会自动使用 OpenCVLibrary310填写这个字段(确切的名称可能不重要,但我们将使用这个名称)。
    • 点击 下一个。屏幕上有三个复选框,以及关于 jar、库和导入选项的问题。三个都要检查。点击 < em > Finish。

      Android Studio 开始导入这个模块,然后会显示一个 导入-摘要文件,其中包含未导入的内容(大部分是 javadoc 文件)和其他信息。 enter image description here

      但是您也会得到一个错误消息,说 无法找到目标的哈希字符串“ android-14”..。。这是因为您下载的 OpenCV zip 文件中的 build.gradle 文件要求使用 android API 版本14进行编译, 在 Android Studio v1.4.1中,默认情况下没有这些功能。 enter image description here

  5. 打开项目结构对话框(菜单:/文件/项目 _ 结构)。选择“ app”模块,单击 依赖性选项卡并添加 翻译: openCVLibrary310作为模块依赖项。当您选择 添加/Module _ Dependency时,它应该出现在您可以添加的模块列表中。 现在它将显示为一个依赖项,但是您将在事件日志中获得更多的 找不到机器人14号错误。

  6. 建造,分级文件中查找应用程序模块。在 Android 项目中有多个 build.gradle 文件。您需要的目录位于 Cvtest1/app目录中,从项目视图来看,它看起来像 Gradle (模块: app)。请注意以下四个字段的值:

    • DevelopeSDKVersion (我的版本是23)
    • BuildToolsVersion (我的版本是23.0.2)
    • MinSdkVersion (我的是19)
    • TargetSdkVersion (我的版本是23)
  7. 您的项目现在有一个 Cvtest1/OpenCVLibrary310目录,但是从项目视图中看不到它:

enter image description here

使用其他工具,例如任何文件管理器,然后转到此目录。您还可以将项目视图从 仿生人切换到 工程项目档案,您可以找到这个目录,如下图所示: enter image description here

里面还有另一个 建造,分级文件(在上面的截图中高亮显示)。使用步骤6中的四个值更新该文件。

  1. 重新同步您的项目,然后清理/重建它。(菜单: /Build/Clean _ Project)它应该清理和构建没有错误 你应该在 0: 讯息屏幕上看到很多对 翻译: openCVLibrary310的引用。

    enter image description here

    此时,模块应该以 OpenCVLibrary310的形式出现在项目层次结构中,就像 应用程序一样。(注意,在那个小下拉菜单中,我从 项目视图切换回 Android 视图)。你也应该看到一个额外的 建造,分级文件下的“ Gradle 脚本”,但我发现 Android 工作室的界面有点小故障,有时它不这样做的权利。所以尝试重新同步,清理,甚至重新启动 Android Studio。

    你应该看到 openCVLibrary310模块和 java 下的所有 OpenCV 函数,如下图所示:

    enter image description here

  2. { unzip-dir }/sdk/national/libs目录(及其下的所有内容)复制到 Android 项目中的 Cvtest1/OpenCVLibrary310/src/main/,然后重命名副本 从 LibsJniLibs。您现在应该有一个 Cvtest1/OpenCVLibrary310/src/main/jniLibs目录。现在应该重新同步您的项目和此目录 出现在 OpenCVLibrary310下的项目视图中。

    enter image description here

  3. 转到 MainActivity.java的 onCreate 方法并附加以下代码:

    if (!OpenCVLoader.initDebug()) {
    Log.e(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), not working.");
    } else {
    Log.d(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), working.");
    }
    

    然后运行你的应用程序,你应该在 Android 监视器中看到这样的行: enter image description here (我不知道为什么那一行有错误消息)

  4. 现在尝试使用一些 openCV 代码。在下面的示例中,我复制了一个。Jpg 文件到 android 仿真器上 cvtest1应用程序的缓存目录。下面的代码加载此图像,运行精明的边缘检测算法,然后将结果写回到。同一目录中的 png 文件。

    将此代码放在上一步代码的下面,并将其修改为与您自己的文件/目录相匹配。

    String inputFileName="simm_01";
    String inputExtension = "jpg";
    String inputDir = getCacheDir().getAbsolutePath();  // use the cache directory for i/o
    String outputDir = getCacheDir().getAbsolutePath();
    String outputExtension = "png";
    String inputFilePath = inputDir + File.separator + inputFileName + "." + inputExtension;
    
    
    
    
    Log.d (this.getClass().getSimpleName(), "loading " + inputFilePath + "...");
    Mat image = Imgcodecs.imread(inputFilePath);
    Log.d (this.getClass().getSimpleName(), "width of " + inputFileName + ": " + image.width());
    // if width is 0 then it did not read your image.
    
    
    
    
    // for the canny edge detection algorithm, play with these to see different results
    int threshold1 = 70;
    int threshold2 = 100;
    
    
    Mat im_canny = new Mat();  // you have to initialize output image before giving it to the Canny method
    Imgproc.Canny(image, im_canny, threshold1, threshold2);
    String cannyFilename = outputDir + File.separator + inputFileName + "_canny-" + threshold1 + "-" + threshold2 + "." + outputExtension;
    Log.d (this.getClass().getSimpleName(), "Writing " + cannyFilename);
    Imgcodecs.imwrite(cannyFilename, im_canny);
    
  5. Run your application. Your emulator should create a black and white "edge" image. You can use the Android Device Monitor to retrieve the output or write an activity to show it.

The Gotchas:

  • If you lower your target platform below KitKat some of the OpenCV libraries will no longer function, specifically the classes related to org.opencv.android.Camera2Renderer and other related classes. You can probably get around this by simply removing the apprpriate OpenCV .java files.
  • If you raise your target platform to Lollipop or above my example of loading a file might not work because use of absolute file paths is frowned upon. So you might have to change the example to load a file from the gallery or somewhere else. There are numerous examples floating around.

对于每个人谁觉得他们想逃跑的所有步骤和屏幕截图上(伟大的!)在上面的答案中,我用 android studio 2.2.1做到了这一点:

  1. 创建一个新项目,根据需要将其命名并使用默认值(minSdkVersion15就可以了)。

  2. 从这里下载 zip 文件: https://sourceforge.net/projects/opencvlibrary/files/opencv-android/(我下载了3.2.0版本,但可能有更新的版本)。

  3. 解压缩压缩文件,最好的地方是在您的工作空间文件夹,但它并不真正的问题。

  4. Android Studio内部,单击 File->New-> Import Module并导航到 \path_to_your_unzipped_file\OpenCV-android-sdk\sdk\java并点击 OK,然后接受所有默认对话框。

  5. app模块的 gradle文件中,将其添加到依赖块:

     dependencies {
    compile project(':openCVLibraryXYZ')
    //rest of code
    }
    

其中 XYZ 是您下载的确切版本,例如在我的案例中:

    dependencies {
compile project(':openCVLibrary320')
//rest of code
}

任何在创建 jniLibs cpp 时遇到问题的人都可以看到. . 只需添加 ndk. 。

这对我很有效,就像增加一个依赖级别一样简单:

Https://bintray.com/seesaa/maven/opencv#

Https://github.com/seesaa/opencv-android

一个警告是,我必须使用硬件调试设备,因为手臂模拟器运行速度太慢(AVD Manager 说他们会这样做) ,并且,正如在 README 的回购所描述的,这个版本不包括 x86或 x86 _ 64支持。

它似乎在构建和建议的测试:

static {
OpenCVLoader.initDebug();
}

吐出一堆在我看来正确的输出。

Android Studio 3.4 + OpenCV 4.1

  1. 给你下载最新的 OpenCV zip 文件(当前最新版本是4.1.0) ,并将其解压缩到您的工作区或另一个文件夹中。

  2. 正常创建新的 Android Studio 项目。单击 File->New->Import Module,导航到 /path_to_unzipped_files/OpenCV-android-sdk/sdk/java,将模块名称设置为 opencv,单击 Next并取消选中屏幕上的所有选项。

  3. 启用 Project文件视图模式(默认模式为 Android)。在 opencv/build.gradle文件中,将 apply plugin: 'com.android.application'更改为 apply plugin: 'com.android.library',并将 application ID "org.opencv"替换为

    minSdkVersion 21
    targetSdkVersion 28
    

    (根据 app/build.gradle中的值)。同步项目与 Gradle 文件。

  4. 将此字符串添加到 app/build.gradle文件中的依赖块

    dependencies {
    ...
    implementation project(path: ':opencv')
    ...
    }
    
  5. Select again Android file view mode. Right click on app module and goto New->Folder->JNI Folder. Select change folder location and set src/main/jniLibs/.

  6. Select again Project file view mode and copy all folders from /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libs to app/src/main/jniLibs.

  7. Again in Android file view mode right click on app module and choose Link C++ Project with Gradle. Select Build System ndk-build and path to OpenCV.mk file /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk.

    path_to_unzipped_files must not contain any spaces, or you will get error!

To check OpenCV initialization add Toast message in MainActivity onCreate() method:

Toast.makeText(MainActivity.this, String.valueOf(OpenCVLoader.initDebug()), Toast.LENGTH_LONG).show();

如果初始化成功,您将在 Toast 消息中看到 true,否则您将看到 false

在你的楼里,梯度

repositories {
jcenter()
}


implementation 'com.quickbirdstudios:opencv:4.1.0'

更多信息

Download

https://github.com/opencv/opencv/releases获取最新的针对 Android 发行版的预先构建的 OpenCV 并解压缩它(例如,OpenCV-4.4.0-Android-sdk.zip)。

创建一个空的 Android Studio 项目

Open Android Studio. Start a new project.

enter image description here

保持默认目标设置。

使用“ Empty Activity”模板。将 Activity 命名为 MainActivity,并使用相应的布局 Activity _ main。 插入你的设备并运行该项目。它应该是安装和启动成功之前,我们将下一步。

 Add OpenCV dependency

转到文件-> 新建-> 导入模块

并提供解压缩 _ OpenCV _ package/sdk/java 的路径。自动检测模块的名称。禁用 Android Studio 将在下一个窗口中推荐的所有特性。

enter image description here

enter image description here

配置您的库 build.gradle (openCVLibrary build.gradle)

apply plugin: 'com.android.library'


android {
compileSdkVersion 28
buildToolsVersion "28.0.3"


buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}

在项目中实现库(application build.gradle)

 implementation project(':openCVLibrary330')

我花了很长时间才弄明白它是怎么工作的。 我使用的方法不需要 格拉德尔

免责声明: 我不知道这个方法是好是坏,所以自己用吧。

  1. 下载「 OpenCV4Android」及「 AndroidNDK」(下载 NDK 来找到 libc + + _ shared.so as I say later)
  2. 在某个地方提取“ OpenCV4Android”并导入一个像这样的例子“ Opencv-4.5.1-android-sdk OpenCV-android-sdk 示例教程-1-camerapreview”到 android 工作室。
  3. 导入之后,再次打开“ OpenCV4Android”sdk“ OpenCV-android-sdk sdk java src org opencv”,将这个文件夹和所有子文件夹复制到你的样例项目中,比如这张图片的 1部分:

enter image description here

  1. 现在你需要 JNI 图书馆Libc + + _ shared.so。在示例项目中创建一个文件夹,并将其命名为“ 假唱”(这个名称并不重要,但是您必须稍后对其进行配置)。再次转到“ OpenCV4Android”sdk,并将“ Opencv-4.5.1-android-sdk OpenCV-android-sdk sdk 本机库”的所有文件夹复制到上图所示的示例项目部分(2)中的新“ Libs”文件夹中。同时解压缩 ndk 并转到这个地址“ Android-ndk-ndk-r20b 源代码 cxx-stl llvm-libc + + libs”,并将 Libc + + _ shared.so复制到您的 libs 目录。

请注意,对于这两个库,您必须将至少四个具有相同名称的文件放在不同 CPU 体系结构的文件夹中。

  1. 重要的部分。你必须加载这些库的地方。我把他们放在活动。检查节(3)上面的图像。
    static {
System.loadLibrary("opencv_java4");
}
  1. 最后一步打开“项目结构”并定义你的 Libs 文件夹,如下图:

enter image description here

对于最后一个提示,如果您不想模拟您的应用程序,可以直接使用 APK。

enter image description here

在最新的 openCV 版本4.5.2中,您需要导入整个 sdk 文件夹,而不是 sdk/java,否则当您添加依赖项时,OpenCV 不会显示。详细描述:

不能添加 openCV 模块作为我的应用程序的依赖

我只需要3个步骤就可以在 Android 工作室北极狐上安装 opencv3.4.15:

  • 步骤0: 创建一个新的空项目
  • 步骤1: 从 官方发布页面下载 opencv-3.4.15。将其解压缩到您选择的位置
  • 步骤2: 在 setings.gradle 的底部添加以下3行
def opencvsdk='/path/to/opencv-3.4.1-android-sdk/OpenCV-android-sdk'
include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')

Sync Now

  • 步骤3: 将以下两行添加到 App/build.gradle 依赖项
    implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':opencv')

Sync Now

搞定! ! !

核实:

将下面的代码行添加到 MainActivity.java

static {
String TAG = "MainActivity";
if (OpenCVLoader.initDebug()){
Log.i(TAG, "opencv installed successfully");
}else{
Log.i(TAG, "opencv not installed");
}
}

来源:

解压缩压缩文件后,转到下面的位置:

Opencv-3.4.1-android-sdk/OpenCV-android-sdk/sdk 并使用任何文本查看器打开 建造,分级文件。在那里,如果你向下滚动,你会发现一些类似于下面的截图

opencv-android-installation

在最新的 OpenCV 版本中,您需要导入整个 sdk文件夹。

实际上,只要遵循 build.gradle文件中的官方指南,导入 OpenCV 是非常容易的。以下是稍作修改的版本:

  1. 将以下内容添加到 settings.gradle(OpenCV 的 sdk目录应该是指定路径的子目录) :
def opencvsdk='<path_to_opencv_android_sdk_rootdir>'
include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')
  1. app/build.gradle中添加依赖项:
dependencies {
...
implementation project(':opencv')
}
  1. 加载 OpenCV 本机库: 使用 System.loadLibrary("opencv_java4")(实际名称取决于 OpenCV 版本)或 OpenCVLoader.initDebug()
  2. (可选)对于本机 C + + 支持(在本机应用程序代码中使用 OpenCV 所必需的) :
  • app/CMakeLists.txt:
find_package(OpenCV <your-opencv-version> REQUIRED java)
...
target_link_libraries(<your-native-lib-name> ${OpenCV_LIBRARIES})
  • app/build.gradle:
defaultConfig {
...
externalNativeBuild {
cmake {
cppFlags "-std=c++11 -frtti -fexceptions"
arguments "-DOpenCV_DIR=" + opencvsdk + "/sdk/native/jni",
"-DANDROID_ARM_NEON=TRUE"
}
}
}

我迟到了。但是我也无法在 android 工作室中加载最新版本(v: 4.5.5)的 opencv sdk,因为每个人都说 文件-> 新建-> 导入模块-> 会转到 < strong > opencv-4.5.5-android-sdk OpenCV-android-sdk sdk java 文件夹,但是当我导入时,在我导入的 opencv 模块中似乎什么都没有,所以经过长时间的研究我能够找到解决方案,所以在这里我分享了。

  1. 从官方网站下载 OpenVsdk: 转到: https://opencv.org/releases/, 点击 < strong > Android 。我已经下载了4.5.5版本。
  2. 在您的项目中,单击 文件 > 新建 > 导入模块... 并选择 OpenCV 下载中的 < strong > opencv-4.5.5-android-sdk/OpenCV-android-sdk/sdk 目录。将其重命名为 opencv _ v455,或者如果你想(自己决定)等待 Gradle 的完成。您选择的目录应该已经复制到默认 < strong >/app 目录所在的项目根目录中。
  3. 通过单击 < strong > 文件 > 项目结构 打开项目结构,然后转到 依赖性(在左侧) ,单击 应用程序并在 已声明的依赖项 选项卡中的 + 图标 (而不是在 模块选项卡中的 + 图标 )。
  4. 现在,单击 模块依赖性 并选中之前导入的 < strong > OpenCV SDK 的复选框。您现在应该在列表中看到它和其他依赖项,所以单击 应用 < strong > OK 退出 项目结构 ;
  5. 打开 应用程序模块的 < strong > build.gradle 文件,复制 < strong > developeSdkVersion < strong > minSdkVersion < strong > targetSdkVersion 的值,然后将它们粘贴到 < strong > OpenCV 模块的 < strong > build.gradle 文件中,替换默认值,使它们完全匹配。您也可以在 应用程序模块的 应用程序0标记中将 源码兼容性 < strong > target 兼容性 字段更新为 < strong > JavaVersion.VERION _ 1 _ 8
  6. 现在点击 < strong > Sync Now 并等待梯度完成。

如果您想检查是否已经成功地添加了 opencv.you 可以在 MainActivity.kt 或 MainActivity.java 中编写以下代码。

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

干杯!

只需在 build gradle 中将 jcenter ()添加到存储库即可

repositories {
jcenter()
google()
mavenCentral()
}

然后添加这个实现

implementation 'com.quickbirdstudios:opencv:4.1.0'