Android Studio中的OpenCV


140

我想在Android Studio的应用程序中使用OpenCV库。我遵循此处找到的说明但出现错误

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

有什么事吗

我将Android Studio 1.0与gradle 2.2.1一起使用。


1
现在,我们可以使用Android Studio导入模块,并且步骤可以更加简单。你能试试这个stackoverflow.com/a/27356635/1180117
Kiran 2014年

谢谢,它有效。将其写为答案,然后我可以接受。
Bartosz Bialecki 2014年

@BartoszBialecki @Kiran,我已经按照步骤4进行操作了,我在native目录下找不到sdk 目录,我丢失了什么吗?
Romantic Electron

1
@RomanticElectron,您必须从OpenCV库的sdk(而不是Android sdk)添加natvie目录。
Bartosz Bialecki 2015年

@BartoszBialecki感谢
Romantic Electron

Answers:


312

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

  1. OpenCV.org 下载最新的Android版OpenCV sdk 并解压缩zip文件。
  2. 将OpenCV导入到Android Studio中,从File-> New- > Import Module,在解压缩的opencv存档中选择sdk / java文件夹。
  3. 更新导入的OpenCV模块下的build.gradle以更新4个字段以匹配您的项目build.gradle a)compileSdkVersion b)buildToolsVersion c)minSdkVersion和d)targetSdkVersion。
  4. 通过Application-> Module Settings 添加模块依赖关系,然后选择Dependencies选项卡。单击底部的+图标,选择“ 模块依赖关系”,然后选择导入的OpenCV模块。
    • 对于Android Studio v1.2.2,要访问“模块设置”:在项目视图中,右键单击相关模块-> 打开模块设置
  5. sdk / native下的libs文件夹复制app / src / main下的Android Studio 。
  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),请确保您的设备/仿真器不在该平台上。

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

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

1
我在执行第二步后遇到错误,是否要删除javadocs目录?。android sdk 14虽然我将目标设备支持,但它也要求我安装android sdk 15
Romantic Electron

1
@RomanticElectron希望您已从链接sourceforge.net/projects/opencvlibrary/files/opencv-android/下载了OpenCV4Android 2.4.10,而不是该Java桌面版本?
基兰2015年

2
好的,我明白了,我以为您在谈论sdk系统上的安装目录,而在谈论Android Open CV SDK.Ok已完成步骤6的情况下。我应包括在哪里static{ System.loadLibrary("opencv_java"); }
Romantic Electron

5
@RomanticElectron,您在哪里包含静态{System.loadLibrary(“ opencv_java”); }?您说“谢谢我”,但两者之间似乎没有任何消息。然后,您说不需要。您能再解释一下吗?谢谢。
puntofisso 2015年

8
对于具有任何人android-14在第2步导入模块后错误,你需要手动编辑build.gradle在OpenCV的目录在您的项目如步骤3
paradite

144

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

大部分信用归于opencv.org上的Kiran,Kool,1“和SteveLiles。另外,我还是必须为我们的项目写这些说明。

经验丰富的AS开发人员会发现一些这种学问。此答案针对的是在Android Studio中经验有限的人。

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

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

      您应该具有一个cvtest1目录,该项目存储在该目录中。(Android Studio的标题栏显示打开项目时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作为模块导入到您的项目中:菜单:/ 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没有该版本。 在此处输入图片说明

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

  6. build.gradle文件中查找您的应用模块。一个Android项目中有多个build.gradle文件。所需的一个位于cvtest1 / app目录中,从项目视图中看起来像build.gradle(模块: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一样。(请注意,在该小下拉菜单中,我从Project View切换回了Android View)。您还应该在“ Gradle Scripts”下看到一个附加的build.gradle文件,但是我发现Android Studio界面有点故障,有时它不能立即执行此操作。因此,请尝试重新同步,清理甚至重新启动Android Studio。

    您应该在java下看到带有所有OpenCV函数的openCVLibrary310模块,如以下屏幕截图所示:

    在此处输入图片说明

  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.");
    }

    然后运行您的应用程序。您应该在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);
  5. 运行您的应用程序。您的模拟器应创建一个黑白的“边缘”图像。您可以使用Android设备监视器来检索输出,也可以编写活动来显示输出。

陷阱

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

2
2月16日编辑:jniLibs现在位于openCVLibrary310目录中,而不是主应用程序目录中。两种方法都可以,但是对我来说,将它们保留在opencv部分似乎更干净。加上更多屏幕截图和“ Gotchas”部分。
ssimm '16

我认为缺少一些导入语句,否则效果很好!+1
艾伦·诺加德(AllanNørgaard)2016年

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我写这些错误时逐步解决了这些错误。
Devendra Singh

2
@DevendraSingh我遇到了与您相同的错误,但我意识到我错过了第9步
。– aasu

2
如果我们想在Android Studio上用C ++为opencv编码怎么办?
user8663682

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
    }

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

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

1
不错,很简单,thnx ;-)也适用于版本3.2.0。
blacharnia

2
谢谢,这确实是更简单的解决方案。我的一点。无法编译新的OpenCV模块。这里的答案帮助我解决了这个问题stackoverflow.com/a/40302788/408780
蒂玛

只是添加到@blacharnia所说的内容,只需确保在通讯座依赖项部分中使用“ compile project(':openCVLibrary320')”,而不是310
Abraham Philip

也许更一般地说,要添加到上面的注释中,请使用“ compile project(':openCVLibraryXYZ')”,其中XYZ是不带“点”的openCV Android SDK的版本号-现在也适用于3.4.0版->即使用“编译项目(':openCVLibrary340')”
Mick

@Mick谢谢,我根据您的建议编辑了答案。
yshahak

9

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

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

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

    dependencies {
        ...
        implementation project(path: ':opencv')
        ...
    }
  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();

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


在上面您说“用.....替换应用程序ID” org.opencv”,但是在“ with”之后没有任何内容。你能澄清一下吗?您的意思是说“删除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


0

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

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

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

一个警告是我必须使用硬件调试设备,因为手臂仿真器对我来说运行太慢(正如AVD Manager所说的那样),并且,如自述文件README所述,此版本不包括x86或x86_64支持。

它似乎可以构建并建议测试:

static {
    OpenCVLoader.initDebug();
}

吐出一堆看起来对我来说正确的输出。


这是来自android studio中的一个新项目。我没有导入任何东西,也没有下载任何东西,等等。只需添加gradle依赖项并进行同步即可。
Naumdev

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.