首页 文章

Android Studio中的OpenCV

提问于
浏览
119

我想在Android Studio的应用程序中使用OpenCV库 . 我按照发现here的说明但是我收到了错误

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

有什么不对?

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

6 回答

  • 34

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

    • Download 最新的OpenCV sdk for Android从OpenCV.org并解压缩该zip文件 .

    • Import OpenCV to Android Studio ,从文件 - >新建 - >导入模块,在解压缩的opencv存档中选择sdk / java文件夹 .

    • Update build.gradle 在导入的OpenCV模块下更新4个字段以匹配您的项目build.gradle a)compileSdkVersion b)buildToolsVersion c)minSdkVersion和d)targetSdkVersion .

    • Add module dependency 按应用程序 - >模块设置,然后选择依赖关系选项卡 . 单击底部的图标,选择Module Dependency,然后选择导入的OpenCV模块 .

    • 对于Android Studio v1.2.2,要访问模块设置:在项目视图中,右键单击从属模块 - >打开模块设置

    在app / src / main下的Android Studio下的sdk / native下的

    • Copy libs 文件夹 .

    • 在Android Studio中, rename the copied libs directory to 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包装器是

    • Android OpenCV SDK - OpenCV.org维护了Android Java包装器 . 我建议这个 .

    • OpenCV Java - OpenCV.org维护自动生成的桌面Java包装器 .

    • JavaCV - 由独立开发人员维护的流行Java包装器 . 不是Android特定的 . 此库可能与OpenCV较新版本不同步 .

  • 0

    Integrating OpenCV v3.1.0 into Android Studio v1.4.1 ,包含其他详细信息的说明以及这是您应该获取的类型截图 .

    大部分功劳归功于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的 Headers 栏显示了打开项目时cvtest1的位置)

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

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

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

    • 源目录: / sdk / java

    • 模块名称:Android studio会自动使用openCVLibrary310填写此字段(确切的名称可能不会与此一起使用) .

    • 点击下一步 . 您将获得一个包含三个复选框的屏幕以及有关jar,库和导入选项的问题 . 应检查所有三个 . 单击Finish .

    Android Studio开始导入模块,您将看到一个import-summary.txt文件,其中包含未导入的内容列表(主要是javadoc文件)和其他信息 .
    enter image description here

    但是你也会收到一条错误消息,说找不到使用哈希字符串'android-14'的目标....这是因为你下载的OpenCV zip文件中的build.gradle文件说使用android API版本14进行编译,默认情况下你不会使用Android Studio v1.4.1 .
    enter image description here

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

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

    • compileSDKVersion(我说23)

    • buildToolsVersion(我说23.0.2)

    • minSdkVersion(我说19)

    • targetSdkVersion(我说23)

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

    enter image description here

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

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

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

    enter image description here

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

    你应该在这个截图中看到带有java下所有OpenCV函数的openCVLibrary310模块:

    enter image description here

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

    enter image description here

    • 转到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
    (我不知道为什么那行包含错误消息)

    • 现在尝试实际使用一些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);
    
    • 运行您的应用程序 . 您的模拟器应创建黑白“边缘”图像 . 您可以使用Android设备监视器检索输出或编写活动以显示它 .

    Gotchas

    • 如果将目标平台降低到KitKat以下,某些OpenCV库将不再起作用,特别是与org.opencv.android.Camera2Renderer和其他相关类相关的类 . 您可以通过简单地删除apprpriate OpenCV .java文件来解决这个问题 .

    • 如果将目标平台提升到Lollipop或更高版本,我加载文件的示例可能无效,因为使用绝对文件路径是不受欢迎的 . 因此,您可能需要更改示例以从库或其他位置加载文件 . 周围有很多例子 .

  • -3

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

    • 创建一个新项目,根据需要命名并采用默认值(minSdkVersion 15很好) .

    • 从这里下载zip文件:https://sourceforge.net/projects/opencvlibrary/files/opencv-android/(我下载了3.1.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
        }
    
  • 134

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

  • 280

    Opencv integration with android studio

    那些想要拥有相同的YouTube视频的人,尝试使用最新版本的opencv(3.4.0),我的运气不足以显示版本(2.4.9)(opencv releases) .

  • 0

    您还可以将此库添加到build.gradle中

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

相关问题