Android Studio 中的 OpenCV

Posted

技术标签:

【中文标题】Android Studio 中的 OpenCV【英文标题】:OpenCV in Android Studio 【发布时间】:2015-02-08 23:02:33 【问题描述】:

我想在我的 android Studio 应用中使用 OpenCV 库。我按照找到here 的说明进行操作,但出现错误

未找到名称为“默认”的配置

有什么问题?

我使用带有 gradle 2.2.1 的 Android Studio 1.0。

【问题讨论】:

现在我们可以使用 Android Studio 导入模块,步骤会简单得多。你能试试这个***.com/a/27356635/1180117 谢谢,它有效。把它写成答案,然后我可以接受。 @BartoszBialecki @Kiran ,我已经按照它进行了第 4 步,我在我的 sdk 目录下找不到 native 目录。我错过了什么吗? @RomanticElectron 你必须从 OpenCV 库的 sdk 中添加 natvie 目录,而不是 Android sdk。 @BartoszBialecki 谢谢 【参考方案1】:

在 Android Studio 中使用 Android OpenCV sdk 的以下步骤。这是这个(1) SO 答案的简化版本。

    从OpenCV.org下载适用于 Android 的最新 OpenCV sdk 并解压缩 zip 文件。 将 OpenCV 导入 Android Studio,从文件 -> 新建 -> 导入模块,选择解压后的 opencv 存档中的 sdk/java 文件夹。 更新 build.gradle 在导入的 OpenCV 模块下更新 4 个字段以匹配您的项目 build.gradle a) compileSdkVersion b) buildToolsVersion c) minSdkVersion 和 d) targetSdkVersion。 Application -> Module Settings 添加模块依赖,然后选择Dependencies 选项卡。点击底部的+图标,选择Module Dependency并选择导入的OpenCV模块。 对于 Android Studio v1.2.2,访问模块设置: 在项目视图中,右键单击依赖模块 -> 打开模块设置 sdk/native下的libs文件夹复制到app/src/main下的Android Studio。 在 Android Studio 中,将复制的 libs 目录重命名为 jniLibs,我们就完成了。

第 (6) 步是因为 Android Studio 需要在 app/src/main/jniLibs 中而不是较旧的 libs 文件夹中的本机库。刚接触 Android OpenCV 的朋友不要错过以下步骤

包括static System.loadLibrary("opencv_java"); (注意:对于OpenCV 版本3,在这一步你应该加载库opencv_java3。) 对于第 (5) 步,如果您忽略任何平台库(如 x86),请确保您的设备/模拟器不在该平台上。

OpenCV 是用 C/C++ 编写的。 Java 包装器是

    Android OpenCV SDK - OpenCV.org 维护 Android Java 包装器。我推荐这个。 OpenCV Java - OpenCV.org 维护自动生成的桌面 Java 包装器。 JavaCV - 由独立开发人员维护的流行 Java 包装器。不是安卓特定的。此库可能与 OpenCV 较新版本不同步。

【讨论】:

我在第二步之后出现错误,我应该删除javadocs 目录吗?它也要求我安装android sdk 14 虽然我的目标是支持android sdk 15 的设备 @RomanticElectron 希望你已经从链接sourceforge.net/projects/opencvlibrary/files/opencv-android/… 下载了 OpenCV4Android 2.4.10 而不是 Java 桌面版本? 好的,我知道了,我以为您在谈论我系统上的sdk 安装目录,而您在谈论Android Open CV SDK 附带的目录。好的,已完成步骤6。我在哪里包括static System.loadLibrary("opencv_java"); ? @RomanticElectron 你在哪里包括 static System.loadLibrary("opencv_java"); ?您说“谢谢,我知道了”,但两者之间似乎没有任何信息。然后你说不需要。你能再解释一下吗?谢谢。 对于在步骤 2 中导入模块后出现android-14 错误的任何人,您需要在 您的项目中 中手动编辑 openCV 目录中的 build.gradle,如图所示第三步。【参考方案2】:

将 OpenCV v3.1.0 集成到 Android Studio v1.4.1 中,包含更多详细信息的说明和 this-is-what-you-should-get 类型的屏幕截图。

大部分功劳归功于 Kiran、Kool、1" 和 SteveLiles 在 opencv.org 上的解释。我添加这个答案是因为我相信 Android Studio 的界面现在足够稳定,可以在这种类型上使用集成的东西。我也必须为我们的项目编写这些说明。

经验丰富的 A.S.开发人员会发现这有些迂腐。此答案针对的是 Android Studio 经验有限的人。

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

    称它为“cvtest1” 外形尺寸:API 19,Android 4.4 (KitKat)

    空白活动名为MainActivity

    你应该有一个 cvtest1 目录来存储这个项目。 (Android studio的标题栏会显示你打开项目时cvtest1在哪里)

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

    下载适用于 Android v3.1.0 的 OpenCV 包并将其解压缩到某个临时目录中的某个位置。 (确保它是专门针对 Android 的包,而不仅仅是用于 Java 的 OpenCV 包。)我将在 unzip-dir 下将此目录称为“unzip-dir”应该有一个 sdk/native/libs 目录,其子目录以 arm...、mips... 和 等开头x86...(每种类型的“架构”Android 运行一个)

    从 Android Studio 将 OpenCV 作为模块导入到您的项目中: 菜单:/File/New/Import_Module

    源目录:unzip-dir/sdk/java 模块名称:Android Studio 会自动使用 openCVLibrary310 填充此字段(确切的名称可能无关紧要,但我们会使用它)。

    点击下一步。您会看到一个屏幕,其中包含三个复选框以及有关 jar、库和导入选项的问题。这三个都应该检查。点击完成。

    Android Studio 开始导入模块,您会看到一个 import-summary.txt 文件,其中列出了未导入的内容(主要是 javadoc 文件)和其他信息。

    但您也会收到一条错误消息,提示 未能找到带有哈希字符串“android-14”的目标...。发生这种情况是因为您下载的 OpenCV zip 文件中的 build.gradle 文件说要使用 android API 版本 14 进行编译, 默认情况下,Android Studio v1.4.1 没有。

    打开项目结构对话框(Menu:/File/Project_Structure)。选择“app”模块,单击Dependencies 选项卡并添加:openCVLibrary310 作为模块依赖项。当您选择 Add/Module_Dependency 时,它应该出现在您可以添加的模块列表中。 它现在将显示为依赖项,但您会在事件日志中收到更多 cannot-find-android-14 错误。

    查看您的应用模块的 build.gradle 文件。一个 Android 项目中有多个 build.gradle 文件。您想要的位于 cvtest1/app 目录中,从项目视图来看,它看起来像 build.gradle (Module: app)。注意这四个字段的值:

    compileSDKVersion(我说 23) buildToolsVersion(我说的是 23.0.2) minSdkVersion(我的说 19) targetSdkVersion(我说 23)

    您的项目现在有一个 cvtest1/OpenCVLibrary310 目录,但从项目视图中看不到:

使用其他工具,例如任何文件管理器,然后转到此目录。您还可以将项目视图从 Android 切换到 Project Files,您可以找到该目录,如下图所示:

里面还有另一个 build.gradle 文件(在上面的屏幕截图中突出显示)。使用步骤 6 中的四个值更新此文件。

    重新同步您的项目,然后清理/重建它。 (菜单:/Build/Clean_Project)它应该清理和构建没有错误 您应该会在 0:Messages 屏幕中看到许多对 :openCVLibrary310 的引用。

    此时模块应该在项目层次结构中显示为 openCVLibrary310,就像 app 一样。 (请注意,在那个小下拉菜单中,我从 Project View 切换回 Android View )。您还应该在“Gradle Scripts”下看到一个额外的 build.gradle 文件,但我发现 Android Studio 界面有点小故障,有时它不会立即执行此操作。因此,请尝试重新同步、清理,甚至重新启动 Android Studio。

    您应该会看到 openCVLibrary310 模块以及 java 下的所有 OpenCV 函数,如下图所示:

    unzip-dir/sdk/native/libs 目录(及其下的所有内容)复制到您的 Android 项目中,到 cvtest1/OpenCVLibrary310/src/main/,然后重命名您的副本 从 libsjniLibs。您现在应该有一个 cvtest1/OpenCVLibrary310/src/main/jniLibs 目录。重新同步你的项目,这个目录现在应该 出现在 openCVLibrary310 下的项目视图中。

    转到 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 监视器中看到这样的行: (我不知道为什么有错误信息的那一行)

    现在尝试实际使用一些 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);
    

    运行您的应用程序。您的模拟器应该创建一个黑白“边缘”图像。您可以使用 Android 设备监视器 检索输出或编写一个活动来显示它。

陷阱

如果您将目标平台降低到 KitKat 以下,某些 OpenCV 库将不再起作用,特别是与 org.opencv.android.Camera2Renderer 相关的类和其他相关类。您可以通过简单地删除适当的 OpenCV .java 文件来解决这个问题。 如果您将目标平台提升到 Lollipop 或更高版本,我的加载文件示例可能无法正常工作,因为不赞成使用绝对文件路径。因此,您可能必须更改示例以从图库或其他地方加载文件。周围有很多例子。

【讨论】:

2 月 16 日编辑:jniLibs 现在位于 openCVLibrary310 目录中,而不是主应用程序目录中。两者都可以,但对我来说将它们保留在 opencv 部分似乎更干净。加上更多截图和“陷阱”部分。 我认为缺少一些导入语句,否则非常好! +1 我按照你的回答失败了。 1我收到了错误 OpenCV error: Cannot load info library for OpenCV 2 java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/www.deven.com.opencv-2/base.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]] couldn't find "libopencv_java3.so 这些错误是关于我一步一步写的。 @DevendraSingh 我得到了和你一样的错误,但我意识到我错过了第 9 步。 如果我们想在 android studio 上为 opencv 编写 c++ 代码怎么办?【参考方案3】:

对于所有想要逃离(太棒了!)以上答案的所有步骤和屏幕截图的人来说,这对我有用android studio 2.2.1

    创建一个新项目,根据需要命名并使用默认值(minSdkVersion 15 即可)。

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

    解压 zip 文件,最好的地方是在你的工作区文件夹中,但这并不重要。

    Android Studio 中,点击File->New-> Import Module 并导航到\path_to_your_unzipped_file\OpenCV-android-sdk\sdk\java 并点击确定,然后接受所有默认对话框。

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

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

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

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

【讨论】:

又好又简单,谢谢 ;-) 也适用于 3.2.0 版。 谢谢,这确实是更简单的解决方案。我一分。无法编译新的 OpenCV 模块。这里的答案帮助我解决了这个问题***.com/a/40302788/408780 只是为了补充@blacharnia 所说的内容,只需确保在 cradle 依赖项部分使用 'compile project(':openCVLibrary320')' 而不是 310 也许更一般地说,要添加到上述 cmets,请使用“compile project(':openCVLibraryXYZ')”,其中 XYZ 是不带“点”的 openCV Android SDK 的版本号 - 现在也可以使用对于版本 3.4.0 -> 即使用“编译项目(':openCVLibrary340')” @Mick 谢谢,我根据你的建议编辑了答案。【参考方案4】:

Android Studio 3.4 + OpenCV 4.1

    从here 下载最新的 OpenCV zip 文件(当前最新版本为 4.1.0)并将其解压缩到您的工作区或其他文件夹中。

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

    启用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 文件同步。

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

    dependencies 
        ...
        implementation project(path: ':opencv')
        ...
    
    

    再次选择Android 文件查看模式。右键单击app 模块并转到New->Folder->JNI Folder。选择更改文件夹位置并设置src/main/jniLibs/

    再次选择Project文件查看模式,将所有文件夹从/path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libs复制到app/src/main/jniLibs

    再次在Android 文件查看模式下右键单击app 模块并选择Link C++ Project with Gradle。选择构建系统ndk-buildOpenCV.mk 文件/path_to_unzipped_files/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk 的路径。

    path_to_unzipped_files 不能包含空格,否则会报错!

要检查 OpenCV 初始化,请在 MainActivity onCreate() 方法中添加 Toast 消息:

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

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

【讨论】:

上面你说“用.....替换应用程序ID“org.opencv”但是“with”后面没有任何内容。你能澄清一下吗?您的意思是说“删除applicationId条目并添加两个条目如下:” @Dale 是的,你应该用两个字符串替换 application ID "org.opencv" 字符串:minSdkVersion 21targetSdkVersion 28(根据 app/build.gradle 文件中的值) 我按照您描述的所有步骤进行操作。但是出现错误 E/art: dlopen("/data/app/com.example.objectsegmentation-1/lib/arm64/libopencv_java4.so", RTLD_LAZY) failed: dlopen failed: library "libc++_shared.so" not found 【参考方案5】:

在你的 build.gradle 中

repositories 
  jcenter()


implementation 'com.quickbirdstudios:opencv:4.1.0'

More information

【讨论】:

【参考方案6】:

这对我有用,就像添加 gradle 依赖一样简单:

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

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

需要注意的是,我必须使用硬件调试设备,因为 arm 仿真器对我来说运行速度太慢(正如 AVD 管理器所说的那样),并且如 repo README 中所述,此版本不包括 x86 或x86_64 支持。

似乎构建和建议的测试:

static 
    OpenCVLoader.initDebug();

吐出一堆对我来说看起来很合适的输出。

【讨论】:

这是来自 android studio 中的一个新项目。我没有导入任何东西,没有下载任何东西等等。只需添加 gradle 依赖并同步即可。【参考方案7】:
Download

从 https://github.com/opencv/opencv/releases 获取最新的预构建 OpenCV for Android 版本并将其解压缩(例如,opencv-4.4.0-android-sdk.zip)。

创建一个空的 Android Studio 项目

Open Android Studio. Start a new project. 

保留默认目标设置。

使用“空活动”模板。将活动命名为 MainActivity,并带有相应的布局 activity_main。 插入您的设备并运行该项目。在我们下一步之前,它应该已经安装并启动成功了。

 Add OpenCV dependency

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

并提供 unpacked_OpenCV_package/sdk/java 的路径。模块名称自动检测。禁用 Android Studio 会在下一个窗口中向您推荐的所有功能。

配置你的库 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'
        
    

将库实现到项目(应用程序 build.gradle)

 implementation project(':openCVLibrary330')

【讨论】:

【参考方案8】:

我花了很长时间才弄清楚它是如何工作的。 我使用的方法不需要Gradle

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

    同时下载“OpenCV4Android”和“AndroidNDK”(下载 NDK 以找到 libc++_shared.so,我稍后会说) 在某处提取“OpenCV4Android”并导入类似“opencv-4.5.1-android-sdk\OpenCV-android-sdk\samples\tutorial-1-camerapreview”的示例之一安卓工作室。 导入后,再次进入“OpenCV4Android”sdk“OpenCV-android-sdk\sdk\java\src\org\opencv”并将这个文件夹和所有子文件夹复制到你的“tutorial-1 -camerapreview" 示例项目,例如此图像的部分 (1):

    现在您需要 JNI 库libc++_shared.so。在您的示例项目中创建一个文件夹并将其命名为“Libs”(此名称并不重要,但您必须稍后对其进行配置)。再次转到“OpenCV4Android”sdk 并将“opencv-4.5.1-android-sdk\OpenCV-android-sdk\sdk\native\libs”的所有文件夹复制到新的“libs ”文件夹中的示例项目作为上图的部分(2)。同样解压ndk,到这个地址“android-ndk\android-ndk-r20b\sources\cxx-stl\llvm-libc++\libs”复制libc++_shared.so 到你的 libs 目录。

请注意,对于这两个库,您必须将至少四个同名文件放在不同 CPU 架构的文件夹中。

    重要部分。您必须在某处加载这些库。我把它们放在活动中。检查上图的部分 (3)。
    static 
            System.loadLibrary("opencv_java4");
    
    最后一步,打开“项目结构”并定义您的 Libs 文件夹,如下图所示:

最后一个提示,如果您不想模拟您的应用程序,请直接制作一个 APK。

【讨论】:

【参考方案9】:

在最新的openCV 4.5.2 版本上,您需要导入整个sdk 文件夹,而不是sdk/java,否则当您添加依赖项时,OpenCV 不会出现。完整的描述在这里:

Cant add openCV module as a dependency to my app

【讨论】:

【参考方案10】:

我只需 3 个步骤即可在 Android Studio 北极狐上安装 opencv 3.4.15:

步骤 0:新建一个空项目 第一步:从official release page下载opencv-3.4.15。将其提取到您选择的位置 第 2 步:将以下 3 行添加到 settings.gradle 的底部
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 步:将以下 2 行添加到您的 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");
    

来源:

解压 zip 文件后,转到以下位置:

opencv-3.4.1-android-sdk/OpenCV-android-sdk/sdk 并使用任何文本查看器打开 build.gradle 文件。如果向下滚动,您会发现类似于下面的屏幕截图的内容

【讨论】:

【参考方案11】:

显示创建 jniLibs cpp 时遇到问题的任何人..只需添加 ndk ..

【讨论】:

以上是关于Android Studio 中的 OpenCV的主要内容,如果未能解决你的问题,请参考以下文章

android studio怎样运行打包后的apk

无法按照 Google“入门”页面中的说明在 Android Studio 中添加地图; Android Studio 报错

android studio 怎么添加module

android studio application怎么创建

android - android studio中的proguard错误

Android studio 报错问题