安卓工作室中的OpenCV

163
我想在我的Android Studio应用中使用OpenCV库。我按照这里的说明进行操作,但出现错误:

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

可能出了什么问题?

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


1
现在我们可以使用Android Studio导入模块,步骤会更简单。你可以尝试这个链接:https://dev59.com/_mMm5IYBdhLWcg3wO9Aq#27356635 - kiranpradeep
谢谢,它起作用了。写成答案,然后我就可以接受它了。 - Bartosz Bialecki
@BartoszBialecki @Kiran,我已经按照步骤4进行了操作,但在sdk目录下找不到native目录。我是否漏掉了什么? - Romantic Electron
1
@RomanticElectron,你需要添加OpenCV库的SDK本地目录,而不是Android SDK。 - Bartosz Bialecki
@BartoszBialecki 谢谢 - Romantic Electron
您可以在此处找到一个带有OpenCV本地支持(gradle-experimental:0.3.0)的可工作Android Studio项目:https://github.com/leadrien/opencv_native_androidstudio。 - leadrien
14个回答

331
以下是在Android Studio中使用Android OpenCV SDK的步骤。这是该SO答案的简化版本。
  1. 下载最新的Android OpenCV SDK,从OpenCV.org并解压缩zip文件。
  2. 将OpenCV导入到Android Studio中,从文件 -> 新建 -> 导入模块,选择未解压缩的opencv存档中的sdk/java文件夹。
  3. 更新已导入OpenCV模块下的build.gradle文件,以便更新4个字段以匹配您的项目build.gradle文件:a) compileSdkVersion b) buildToolsVersion c) minSdkVersion和d) targetSdkVersion。
  4. 通过添加模块依赖项,在应用程序 -> 模块设置中,选择依赖项选项卡。点击底部的+图标,选择模块依赖项,然后选择已导入的OpenCV模块。
    • 对于Android Studio v1.2.2,要访问模块设置: 在项目视图中,右键单击相关模块 -> 打开模块设置
  5. sdk/native下的libs文件夹复制到Android Studio中的app/src/main
  6. 在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包装器有:

  1. Android OpenCV SDK - 由OpenCV.org维护的Android Java包装器,我建议使用这个。
  2. OpenCV Java - 由OpenCV.org自动生成的桌面Java包装器。
  3. JavaCV - 独立开发者(s)维护的流行Java包装器,非Android特定。此库可能与OpenCV新版本不同步。

2
好的,我明白了。我以为你在谈论我系统上的sdk安装目录,而你实际是在谈论随Android Open CV SDK一起的目录。好的,我完成了第6步。我应该把static{ System.loadLibrary("opencv_java"); }放在哪里? - Romantic Electron
7
@RomanticElectron,您在哪里加入静态代码块{ System.loadLibrary("opencv_java"); }?您说“谢谢我已经搞定了”,但之间似乎没有任何信息。然后您又说它不是必需的。您能再解释一下吗?谢谢。 - puntofisso
9
对于在第二步导入模块后遇到“android-14”错误的任何人,您需要手动编辑openCV目录中在您的项目中显示的build.gradle,如步骤3所示。 - paradite
2
静态代码块 < static{ System.loadLibrary("opencv_java"); } > 应该放在哪里? - Libathos
3
我不明白这一步骤 include static{ System.loadLibrary("opencv_java"); } 应该在哪里添加? - Hasani
显示剩余24条评论

147
将OpenCV v3.1.0集成到Android Studio v1.4.1中,提供详细说明和截图展示。大部分感谢要归功于在opencv.org上的Kiran、Kool、1"和SteveLiles为这个解释所做的贡献。我添加这个答案是因为我相信Android Studio的界面现在已经足够稳定,可以用于这种类型的集成工作。此外,我们的项目需要我编写这些说明。有经验的AS开发人员可能会觉得有些东西过于啰嗦。这个答案的目标是针对在Android Studio方面经验有限的人。
  1. 使用项目向导(菜单:/文件/新建项目)创建一个新的Android Studio项目:

    • 将其命名为“cvtest1
    • 格式因素:API 19,Android 4.4(KitKat)
    • 名为MainActivity空白活动

      您应该有一个存储此项目的cvtest1目录。(当您打开项目时,Android Studio的标题栏会显示cvtest1的位置。)

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

  3. 下载Android v3.1.0的OpenCV包并在某个临时目录中解压缩它。(确保它是专门针对Android的软件包,而不仅仅是Java软件包。)我将称此目录为“unzip-dir”。在unzip-dir下,您应该有一个带有以arm...、mips...和x86...开头的子目录的sdk/native/libs目录。(每种类型的Android“体系结构”都有一个)

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

    • 源目录:{unzip-dir}/sdk/java
    • 模块名称:Android Studio会自动填写此字段,名称为openCVLibrary310(确切的名称可能并不重要,但我们将使用此名称)。
    • 单击下一步。您会看到一个带有三个复选框和关于jar、库和导入选项的问题的屏幕。所有三个应该被选中。单击完成

      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

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

  6. 查看您的应用程序模块中的build.gradle文件。Android项目中有多个build.gradle文件。您想要的那个位于cvtest1/app目录中,从

    enter image description here

    请使用其他工具,如任何文件管理器,进入此目录。您还可以将项目视图从Android切换到Project Files,并按照以下截图找到此目录: enter image description here 在其中有另一个build.gradle文件(在上面的截图中突出显示)。 使用步骤6中的四个值更新此文件。
    1. Resynch your project and then clean/rebuild it. (Menu:/Build/Clean_Project) It should clean and build without errors and you should see many references to :openCVLibrary310 in the 0:Messages screen.

      enter image description here

      At this point the module should appear in the project hierarchy as openCVLibrary310, just like app. (Note that in that little drop-down menu I switched back from Project View to Android View ). You should also see an additional build.gradle file under "Gradle Scripts" but I find the Android Studio interface a little bit glitchy and sometimes it does not do this right away. So try resynching, cleaning, even restarting Android Studio.

      You should see the openCVLibrary310 module with all the OpenCV functions under java like in this screenshot:

      enter image description here

    2. Copy the {unzip-dir}/sdk/native/libs directory (and everything under it) to your Android project, to cvtest1/OpenCVLibrary310/src/main/, and then rename your copy from libs to jniLibs. You should now have a cvtest1/OpenCVLibrary310/src/main/jniLibs directory. Resynch your project and this directory should now appear in the project view under openCVLibrary310.

      enter image description here

    3. Go to the onCreate method of MainActivity.java and append this code:

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

      Then run your application. You should see lines like this in the Android Monitor: enter image description here (I don't know why that line with the error message is there)

    4. Now try to actually use some openCV code. In the example below I copied a .jpg file to the cache directory of the cvtest1 application on the android emulator. The code below loads this image, runs the canny edge detection algorithm and then writes the results back to a .png file in the same directory.

      Put this code just below the code from the previous step and alter it to match your own files/directories.

      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.

    需要注意的事项:

    • 如果您将目标平台降至KitKat以下,则某些OpenCV库将不再起作用,特别是与org.opencv.android.Camera2Renderer和其他相关类有关的类。您可以通过简单地删除相应的OpenCV .java文件来解决此问题。
    • 如果您将目标平台提高到Lollipop或更高版本,则我加载文件的示例可能无法正常工作,因为使用绝对文件路径被认为是不好的做法。因此,您可能需要更改示例以从图库或其他位置加载文件。有许多漂浮在网上的示例。

2
16-Feb编辑:jniLibs现在位于opencvLibrary310目录中,而不是主应用程序目录中。 两者都可以,但我认为将它们保留在opencv部分更加清晰。此外,还有更多的屏幕截图和“陷阱”部分。 - ssimm
2
我按照您的答案操作,但是失败了。错误如下: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" 我已经按照您的步骤一步一步地操作了,这些错误是关于什么的? - Devendra Singh
2
@DevendraSingh,我遇到了和你一样的错误,但我意识到自己错过了第9步。 - aasu
很棒的答案。特别是将库添加到应用程序中。唯一缺少的是关于添加Android相机权限的内容。 - Majid Hojati
2
如果我们想在Android Studio上使用C++编写OpenCV代码,该怎么办? - Hasani
显示剩余6条评论

40

对于所有感觉上面答案中的步骤和截图让人望而却步的人,这个方法适用于 android studio 2.2.1

  1. 新建一个项目,随意命名并使用默认设置(最低SDK版本为15即可)。

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

  3. 解压缩zip文件,最好放在您的工作区文件夹中,但这并不重要。

  4. Android Studio中,单击文件->新建->导入模块,然后导航到\path_to_your_unzipped_file\OpenCV-android-sdk\sdk\java,点击确定,然后接受所有默认对话框。

  5. 在您的app模块的gradle文件中,在依赖关系块中添加以下内容:

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

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

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

1
简单易懂,谢谢;-) 也适用于3.2.0版本。 - blacharnia
3
谢谢,的确是更简单的解决方案。我有一个补充。新的OpenCV模块无法编译。这里的答案帮助我解决了这个问题 https://dev59.com/DVoV5IYBdhLWcg3weevH#40302788 - Tima
只是为了补充@blacharnia所说的,确保在gradle依赖项部分中使用“compile project(':openCVLibrary320')”,而不是310。 - Abraham Philip
@yshahak 或者有人能帮我解决这个问题吗?我真的需要做这个。https://stackoverflow.com/questions/61876457/image-segmentation-using-segment-seeds-watershed-in-android - Tecnologia da Net

14

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,单击下一步并在屏幕中取消选择所有选项。

  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文件中的依赖项块中。

  5. dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
    
  6. 再次选择 Android 文件视图模式。右键单击 app 模块,转到 New->Folder->JNI Folder。选择更改文件夹位置并设置为 src/main/jniLibs/

  7. Android 文件视图模式中再次选择 Project,并将所有文件夹从 /path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libs 复制到 app/src/main/jniLibs

  8. 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'替换为......”,但是后面没有任何内容。你能否请澄清一下?你是不是要说“删除applicationId条目并添加以下两个条目:”。 - Dale
@Dale 是的,你应该用两个字符串替换 application ID "org.opencv" 字符串:minSdkVersion 21targetSdkVersion 28(根据 app/build.gradle 文件中的值)。 - Plo_Koon
我按照你描述的所有步骤进行了操作,但是出现了错误。 E/art: dlopen("/data/app/com.example.objectsegmentation-1/lib/arm64/libopencv_java4.so", RTLD_LAZY) 失败:dlopen失败:找不到库"libc++_shared.so"。 - Masthan

5

在你的build.gradle文件中

repositories {
  jcenter()
}

implementation 'com.quickbirdstudios:opencv:4.1.0'

更多信息


我们如何在C++中使用它? - Shoaib

3
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')

2

2
这对我很有帮助,只需要添加一个Gradle依赖即可:

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

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

唯一的注意事项是我必须使用硬件调试设备,因为ARM模拟器对我来说运行得太慢了(正如AVD管理器所说),并且如存储库README中所述,此版本不包括x86或x86_64支持。
它似乎已经构建完成,并通过了建议的测试:
static {
    OpenCVLoader.initDebug();
}

喷出一堆看起来差不多正确的输出。

这是在Android Studio中的一个全新项目。我没有导入任何东西,也没有下载任何东西等。只需添加Gradle依赖项并同步即可。 - Naumdev

1

我有点晚了。但是我也无法在Android Studio中加载最新版本(v:4.5.5)的OpenCV SDK,因为每个人都说要使用 文件-> 新建-> 导入模块,然后进入 opencv-4.5.5-android-sdk\OpenCV-android-sdk\sdk\java 文件夹,但当我导入时,我的导入OpenCV模块似乎没有任何内容,所以经过长时间的研究,我找到了解决方案,现在在这里分享。

  1. 从官方网站下载Opencv SDK: 访问:https://opencv.org/releases/, 点击Android。我已经下载了4.5.5版本。
  2. 在您的项目中,单击File > New > Import Module...,然后选择OpenCV下载文件中的opencv-4.5.5-android-sdk/OpenCV-android-sdk/sdk目录。将其重命名为opencv_v455(或者您想要的其他名称),等待Gradle完成。您选择的目录应该已经复制到了项目根目录中,即默认的/app目录下。
  3. 通过单击File > Project Structure打开项目结构,然后进入Dependencies(位于左侧),单击appDeclared Dependencies选项卡中的+图标(而不是Modules选项卡)。
  4. 现在单击Module Dependency并选中之前导入的OpenCV SDK的复选框。您现在应该可以在其他依赖项列表中看到它,所以单击ApplyOK退出Project Structure
  5. 打开app模块的build.gradle文件,复制compileSdkVersionminSdkVersiontargetSdkVersion的值,然后将它们粘贴到OpenCV模块的build.gradle文件中,以替换默认值,使它们完全匹配。您还可以在app模块中的compileoptions标记中更新sourceCompatibilitytargetCompatibility字段为JavaVersion.VERSION_1_8
  6. 现在单击Sync Now并等待Gradle完成。

如果您想要检查是否已成功添加OpenCV,请在MainActivity.kt或MainActivity.java中编写以下代码。

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

Cheers!!


1

我只需要3个步骤就在Android Studio Arctic Fox上成功安装了OpenCV 3.4.15:

  • 步骤0:创建一个新的空项目
  • 步骤1:从官方发布页面下载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')

点击 立即同步

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

点击 立即同步

完成!!!

验证:

将下面的代码添加到您的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文件。如果您向下滚动,将会发现类似于下面截图的内容。

opencv-android-installation


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接