Android Studio中的OpenCV

Bar*_*cki 136 android opencv gradle android-studio

我想在Android Studio的应用程序中使用OpenCV库.我按照这里的说明,但我得到错误

未找到名称"default"的配置

有什么不对?

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

Kir*_*ran 303

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

  1. OpenCV.org 下载最新的OpenCV sdk for Android 并解压缩该zip文件.
  2. 将OpenCV导入Android Studio,从文件 - >新建 - >导入模块,在解压缩的opencv存档中选择sdk/java文件夹.
  3. 在导入的OpenCV模块下更新build.gradle以更新4个字段以匹配您的项目build.gradle a)compileSdkVersion b)buildToolsVersion c)minSdkVersion和d)targetSdkVersion.
  4. 应用程序 - >模块设置添加模块依赖关系,然后选择依赖关系选项卡.单击底部的+图标,选择Module Dependency,然后选择导入的OpenCV模块.
    • 对于Android Studio v1.2.2,要访问模块设置:在项目视图中,右键单击从属模块 - > 打开模块设置
  5. sdk/native下的libs文件夹复制app/src/main下的Android Studio .
  6. 在Android Studio中,将复制的libs目录重命名为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++.Java包装器是

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

  • 对于在步骤2中导入模块后出现`android-14`错误的任何人,您需要手动编辑项目中openCV目录**中的`build.gradle`,如步骤3所示. (8认同)
  • @RomanticElectron你在哪里包含static {System.loadLibrary("opencv_java"); }?你说"谢谢我已经得到了它",但似乎之间没有任何消息.然后你说它不需要.你能解释一下吗?谢谢. (5认同)
  • 我无法理解这一步 `include static{ System.loadLibrary("opencv_java"); } ` 我应该在哪里添加这个? (3认同)
  • 好的,我明白了,我以为你说的是​​我系统上的 `sdk` 安装目录,而你说的是 `Android Open CV SDK` 附带的目录。好的,完成第 6 步。我在哪里包含 `static{ System .loadLibrary("opencv_java"); }`? (2认同)
  • < static{ System.loadLibrary("opencv_java"); 应该在哪里 } > 被包括在内? (2认同)

ssi*_*imm 141

将OpenCV v3.1.0集成到Android Studio v1.4.1中,带有更多详细信息的说明以及这是您应该获取的类型截图.

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

经验丰富的AS开发人员会发现一些这种迂腐.此答案针对Android Studio中经验有限的人员.

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

    • 称之为" cvtest1 "
    • 外形: API 19,Android 4.4(KitKat)
    • 空白活动名为MainActivity

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

  2. 验证您的应用是否正常运行.尝试更改类似"Hello World"文本的内容,以确认构建/测试周期适合您.(我正在使用API​​ 19设备的模拟器进行测试).

  3. 下载适用于Android v3.1.0的OpenCV软件包,并将其解压缩到某个临时目录中.(确保它是专门用于Android的软件包,而不仅仅是OpenCV for Java软件包.)我将这个目录称为" unzip-dir "在unzip-dir下面你应该有一个sdk/native/libs目录,其子目录以像arm ...,mips ......和x86 ......(每个类型的"架构"Android运行一个)

  4. 从Android Studio将OpenCV作为模块导入项目:Menu:/ File/New/Import_Module:

    • 源目录: {unzip-dir}/sdk/java
    • 模块名称:Android studio会自动使用openCVLibrary310填写此字段(确切的名称可能无关紧要,但我们将继续使用此功能).
    • 点击下一步.您将获得一个包含三个复选框的屏幕以及有关jar,库和导入选项的问题.应检查所有三个.单击" 完成".

      Android Studio开始导入模块,您将看到一个import-summary.txt文件,其中包含未导入的内容列表(主要是javadoc文件)和其他信息. 在此输入图像描述

      但你也可以得到一个错误信息说没有找到目标与哈希字符串"机器人-14" .......发生这种情况是因为您下载的OpenCV zip文件中的build.gradle文件说使用Android API版本14进行编译,默认情况下您没有使用Android Studio v1.4.1. 在此输入图像描述

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

  6. 查看app模块的build.gradle文件.Android项目中有多个build.gradle文件.你想要的是在cvtest1/app目录中,从项目视图看起来就像build.gradle(Module:app).请注意以下四个字段的值:

    • compileSDKVersion(我说23)
    • buildToolsVersion(我说23.0.2)
    • minSdkVersion(我说19)
    • targetSdkVersion(我说23)
  7. 您的项目现在有一个cvtest1/OpenCVLibrary310目录,但从项目视图中看不到它:

在此输入图像描述

使用其他工具,例如任何文件管理器,然后转到此目录.您还可以将项目视图从Android切换到Project Files,您可以找到此目录,如此屏幕截图所示: 在此输入图像描述

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

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

    在此输入图像描述

    此时,模块应该作为openCVLibrary310出现在项目层次结构中,就像app一样.(注意,在小下拉菜单中我切换回从项目视图Android设备上查看).您还应该在"Gradle Scripts"下看到一个额外的build.gradle文件,但我发现Android Studio界面有点毛躁,有时它不会立即执行此操作.因此,请尝试重新同步,清理甚至重新启动Android Studio.

    您应该在这个截图中看到openCVLibrary310模块,其中包含java下的所有OpenCV函数:

    在此输入图像描述

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

    在此输入图像描述

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

    然后运行您的应用程序 你应该在Android Monitor中看到这样的行: 在此输入图像描述 (我不知道为什么那行包含错误信息)

  4. 现在尝试实际使用一些openCV代码.在下面的示例中,我将.jpg文件复制到android模拟器上的cvtest1应用程序的缓存目录中.下面的代码加载此图像,运行canny边缘检测算法,然后将结果写回同一目录中的.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);
    
    Run Code Online (Sandbox Code Playgroud)
  5. 运行您的应用程序 您的模拟器应创建黑白"边缘"图像.您可以使用Android设备监视器检索输出或编写活动以显示它.

陷阱:

  • 如果将目标平台降低到KitKat以下,一些OpenCV库将不再起作用,特别是与org.opencv.android.Camera2Renderer和其他相关类相关的类.您可以通过简单地删除apprpriate OpenCV .java文件来解决这个问题.
  • 如果将目标平台提升到Lollipop或更高版本,我加载文件的示例可能无效,因为使用绝对文件路径是不受欢迎的.因此,您可能需要更改示例以从库或其他位置加载文件.周围有很多例子.

  • 16-Feb编辑:jniLibs现在位于openCVLibrary310目录中,而不是主app目录.要么工作,但我把它们放在opencv部分似乎更干净.加*更多*截图和"陷阱"部分. (2认同)
  • 我按照你的回答但失败了。**1**我收到错误 `OpenCV 错误:无法加载 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]]] 找不到“libopencv_java3.so`这些错误是什么我一步一步做的书面。 (2认同)
  • @DevendraSingh我得到了同样的错误,但我意识到我错过了第9步. (2认同)
  • 如果我们想在 android studio 上用 c++ 为 opencv 编码怎么办? (2认同)

ysh*_*hak 37

对于那些觉得他们想要逃脱所有步骤和屏幕截图(上面的答案)的人来说,这对我有用android studio 2.2.1:

  1. 创建一个新项目,根据需要命名并采用默认值(minSdkVersion 15就可以了).
  2. 从这里下载zip文件:https://sourceforge.net/projects/opencvlibrary/files/opencv-android/ (我下载了3.1.0版本,但可能有更新的版本).
  3. 解压缩zip文件,最好的位置在工作区文件夹中,但这并不重要.
  4. 在里面Android Studio,单击File->New-> Import Module并导航到\path_to_your_unzipped_file\OpenCV-android-sdk\sdk\java并单击"确定",然后接受所有默认对话框.
  5. 在 模块的gradle文件中app,将其添加到依赖项块:

    dependencies {
        compile project(':openCVLibraryXYZ')
        //rest of code
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

    dependencies {
        compile project(':openCVLibrary320')
        //rest of code
    }
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这确实是更容易的解决方案.有一点来自我.无法编译新的OpenCV模块.这里的答案帮助我解决了这个问题http://stackoverflow.com/a/40302788/408780 (2认同)

Plo*_*oon 5

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,将Module name设置为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
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 再次选择Android文件查看模式。右键单击app模块并转到New->Folder->JNI Folder。选择更改文件夹位置并设置src/main/jniLibs/

  6. 再次选择Project文件查看模式,然后将所有文件夹从复制/path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libsapp/src/main/jniLibs

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

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


Ray*_*non 5

在你的 build.gradle 中

repositories {
  jcenter()
}

implementation 'com.quickbirdstudios:opencv:4.1.0'
Run Code Online (Sandbox Code Playgroud)

更多信息