Android Studio中的OpenCV

我想在我的Android Studio中使用OpenCV库。 我遵循这里find的指示,但我得到错误

未find名称为“default”的configuration

什么可能是错的?

我使用Android Studio 1.0和Gradle 2.2.1。

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

  1. 从OpenCV.org 下载最新的OpenCV sdk for Android并解压缩zip文件。
  2. 导入OpenCV到Android Studio ,从文件 – >新build – >导入模块 ,在解压缩的opencv归档中selectsdk / java文件夹。
  3. 更新导入的OpenCV模块下的build.gradle更新4个字段以匹配您的项目build.gradle a)compileSdkVersion b)buildToolsVersion c)minSdkVersion和d)targetSdkVersion。
  4. 应用程序 – >模块设置 添加模块依赖项 ,然后select依赖关系选项卡。 点击底部的+图标,selectModule Dependency ,select导入的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,不要错过下面的步骤

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

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

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

将OpenCV v3.1.0集成到Android Studio v1.4.1中 ,提供了更多详细信息的说明以及您应该了解的types的屏幕截图。

大部分的功劳归功于Kiran,Kool,1,和SteveLiles在opencv.org上的解释。我添加了这个答案,因为我相信Android Studio的界面现在已经足够稳定,可以处理这种types的集成另外我还要为我们的项目编写这些指令。

有经验的AS开发人员会发现一些迂腐。 这个答案针对的是Android Studio经验有限的人。

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

    • 称之为“ cvtest1
    • forms因素: API 19,Android 4.4(KitKat)
    • 名为MainActivity的 空白活动

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

  2. 确认您的应用程序正常运行。 尝试改变“Hello World”文本来确认构build/testing循环对您是否正常。 (我正在使用API​​ 19设备的模拟器进行testing)。

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

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

    • 源目录: {unzip-dir} / sdk / java
    • 模块名称:Android工作室自动使用openCVLibrary310填充这个字段(确切的名字可能并不重要,但我们将继续这样做)。
    • 点击下一步 。 你会得到一个三个checkbox和关于jar子,库和导入选项的问题。 所有三个应该检查。 点击完成。

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

      但是你也得到一个错误信息,说没有find哈希string“android-14”的目标…。 发生这种情况是因为您下载的OpenCV zip文件中的build.gradle文件说要使用android API版本14进行编译,默认情况下,您不能使用Android Studio v1.4.1进行编译。 在这里输入图像描述

  5. 打开项目结构对话框( 菜单:/文件/项目结构)。 select“app”模块,点击Dependencies选项卡,并添加:openCVLibrary310作为Module Dependency。 当你selectAdd / Module_Dependency时,它应该出现在你可以添加的模块列表中。 它现在将显示为依赖项,但在事件日志中会出现一些无法find-Android-14的错误。

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

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

在这里输入图像描述

使用其他工具,如任何文件pipe理器,并转到这个目录。 您也可以将项目视图从Android切换到项目文件 ,您可以在此屏幕截图中find此目录: 在这里输入图像描述

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

  1. 重新调整你的项目,然后清理/重build它。 (菜单: /构build/ Clean_Project )它应该清理和构build没有错误,你应该看到许多引用0:消息屏幕openCVLibrary310

    在这里输入图像描述

    在这一点上,模块应该像app一样在openCVLibrary310中出现在项目层次结构中。 (请注意,在那个从Project View切换回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目录。 Resynch你的项目和这个目录现在应该出现在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."); } 

    然后运行你的程序。 您应该在Android监视器中看到类似这样的行: 在这里输入图像描述 (我不知道为什么那条线的错误信息在那里)

  4. 现在尝试实际使用一些openCV代码。 在下面的示例中,我将一个.jpg文件复制到android模拟器上的cvtest1应用程序的caching目录中。 下面的代码加载这个图像,运行Canny边缘检测algorithm,然后将结果写回同一目录中的.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. 运行你的应用程序 您的模拟器应该创build一个黑白的“边缘”图像。 您可以使用Android设备监视器来检索输出或编写一个活动来显示它。

难题

  • 如果你将目标平台降低到KitKat以下,一些OpenCV库将不再起作用,特别是与org.opencv.android.Camera2Renderer和其他相关类有关的类。 你可以通过简单地删除appc的OpenCV .java文件来解决这个问题。
  • 如果你把目标平台升到棒棒糖或以上,我的加载文件的例子可能不起作用,因为绝对文件path的使用是不被接受的。 所以你可能不得不改变这个例子从图库或其他地方加载一个文件。 有很多例子在stream转。

对于所有觉得自己想要逃避所有步骤和屏幕截图的(伟大!)以上答案的人来说,这适用于android studio 2.2.1

  1. 创build一个新的项目,按照你的意思命名,并采用默认的(minSdkVersion 15是好的)。
  2. 从这里下载zip文件: https : //sourceforge.net/projects/opencvlibrary/files/opencv-android/ (我下载了3.1.0版本)。 编辑:3.2.0也适用
  3. 解压缩zip文件,最好的地方是在你的工作区文件夹,但它并不重要。
  4. Android Studio里面,点击File->New-> Import Module并导航到\path_to_your_unzipped_file\OpenCV-android-sdk\sdk\java ,点击OK,然后接受所有的默认对话框。
  5. 在您的app模块的gradle文件中,将其添加到依赖性块:

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

显示任何人在创buildjniLibs CPP时遇到问题..只是添加ndk ..

您也可以将这个库添加到build.gradle

 dependencies{ compile 'org.opencv:opencv-android:2.4.8' }