Android Studio 中的 OpenCV
Posted
技术标签:
【中文标题】Android Studio 中的 OpenCV【英文标题】:OpenCV in Android Studio 【发布时间】:2015-02-08 23:02:33 【问题描述】:我想在我的 android Studio 应用中使用 OpenCV 库。我按照找到here 的说明进行操作,但出现错误
未找到名称为“默认”的配置
有什么问题?
我使用带有 gradle 2.2.1 的 Android Studio 1.0。
【问题讨论】:
现在我们可以使用 Android Studio 导入模块,步骤会简单得多。你能试试这个***.com/a/27356635/1180117 谢谢,它有效。把它写成答案,然后我可以接受。 @BartoszBialecki @Kiran ,我已经按照它进行了第 4 步,我在我的sdk
目录下找不到 native
目录。我错过了什么吗?
@RomanticElectron 你必须从 OpenCV 库的 sdk 中添加 natvie 目录,而不是 Android sdk。
@BartoszBialecki 谢谢
【参考方案1】:
在 Android Studio 中使用 Android OpenCV sdk 的以下步骤。这是这个(1) SO 答案的简化版本。
-
从OpenCV.org下载适用于 Android 的最新 OpenCV sdk 并解压缩 zip 文件。
将 OpenCV 导入 Android Studio,从文件 -> 新建 -> 导入模块,选择解压后的 opencv 存档中的 sdk/java 文件夹。
更新 build.gradle 在导入的 OpenCV 模块下更新 4 个字段以匹配您的项目 build.gradle a) compileSdkVersion b) buildToolsVersion c) minSdkVersion 和 d) targetSdkVersion。
Application -> Module Settings 添加模块依赖,然后选择Dependencies 选项卡。点击底部的+图标,选择Module Dependency并选择导入的OpenCV模块。
对于 Android Studio v1.2.2,访问模块设置:
在项目视图中,右键单击依赖模块
-> 打开模块设置
将sdk/native下的libs文件夹复制到app/src/main下的Android Studio。
在 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 包装器是
-
Android OpenCV SDK - OpenCV.org 维护 Android Java 包装器。我推荐这个。
OpenCV Java - OpenCV.org 维护自动生成的桌面 Java 包装器。
JavaCV - 由独立开发人员维护的流行 Java 包装器。不是安卓特定的。此库可能与 OpenCV 较新版本不同步。
【讨论】:
我在第二步之后出现错误,我应该删除javadocs
目录吗?它也要求我安装android sdk 14
虽然我的目标是支持android sdk 15
的设备
@RomanticElectron 希望你已经从链接sourceforge.net/projects/opencvlibrary/files/opencv-android/… 下载了 OpenCV4Android 2.4.10 而不是 Java 桌面版本?
好的,我知道了,我以为您在谈论我系统上的sdk
安装目录,而您在谈论Android Open CV SDK
附带的目录。好的,已完成步骤6。我在哪里包括static System.loadLibrary("opencv_java");
?
@RomanticElectron 你在哪里包括 static System.loadLibrary("opencv_java"); ?您说“谢谢,我知道了”,但两者之间似乎没有任何信息。然后你说不需要。你能再解释一下吗?谢谢。
对于在步骤 2 中导入模块后出现android-14
错误的任何人,您需要在 您的项目中 中手动编辑 openCV 目录中的 build.gradle
,如图所示第三步。【参考方案2】:
将 OpenCV v3.1.0 集成到 Android Studio v1.4.1 中,包含更多详细信息的说明和 this-is-what-you-should-get 类型的屏幕截图。
大部分功劳归功于 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的标题栏会显示你打开项目时cvtest1在哪里)
验证您的应用程序是否正常运行。尝试更改诸如“Hello World”文本之类的内容,以确认构建/测试周期适合您。 (我正在使用 API 19 设备的模拟器进行测试)。
下载适用于 Android v3.1.0 的 OpenCV 包并将其解压缩到某个临时目录中的某个位置。 (确保它是专门针对 Android 的包,而不仅仅是用于 Java 的 OpenCV 包。)我将在 unzip-dir 下将此目录称为“unzip-dir”应该有一个 sdk/native/libs 目录,其子目录以 arm...、mips... 和 等开头x86...(每种类型的“架构”Android 运行一个)
从 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 没有。
打开项目结构对话框(Menu:/File/Project_Structure)。选择“app”模块,单击Dependencies 选项卡并添加:openCVLibrary310 作为模块依赖项。当您选择 Add/Module_Dependency 时,它应该出现在您可以添加的模块列表中。 它现在将显示为依赖项,但您会在事件日志中收到更多 cannot-find-android-14 错误。
查看您的应用模块的 build.gradle 文件。一个 Android 项目中有多个 build.gradle 文件。您想要的位于 cvtest1/app 目录中,从项目视图来看,它看起来像 build.gradle (Module: app)。注意这四个字段的值:
compileSDKVersion(我说 23) buildToolsVersion(我说的是 23.0.2) minSdkVersion(我的说 19) targetSdkVersion(我说 23)您的项目现在有一个 cvtest1/OpenCVLibrary310 目录,但从项目视图中看不到:
使用其他工具,例如任何文件管理器,然后转到此目录。您还可以将项目视图从 Android 切换到 Project Files,您可以找到该目录,如下图所示:
里面还有另一个 build.gradle 文件(在上面的屏幕截图中突出显示)。使用步骤 6 中的四个值更新此文件。
重新同步您的项目,然后清理/重建它。 (菜单:/Build/Clean_Project)它应该清理和构建没有错误 您应该会在 0:Messages 屏幕中看到许多对 :openCVLibrary310 的引用。
此时模块应该在项目层次结构中显示为 openCVLibrary310,就像 app 一样。 (请注意,在那个小下拉菜单中,我从 Project View 切换回 Android View )。您还应该在“Gradle Scripts”下看到一个额外的 build.gradle 文件,但我发现 Android Studio 界面有点小故障,有时它不会立即执行此操作。因此,请尝试重新同步、清理,甚至重新启动 Android Studio。
您应该会看到 openCVLibrary310 模块以及 java 下的所有 OpenCV 函数,如下图所示:
将 unzip-dir/sdk/native/libs 目录(及其下的所有内容)复制到您的 Android 项目中,到 cvtest1/OpenCVLibrary310/src/main/,然后重命名您的副本 从 libs 到 jniLibs。您现在应该有一个 cvtest1/OpenCVLibrary310/src/main/jniLibs 目录。重新同步你的项目,这个目录现在应该 出现在 openCVLibrary310 下的项目视图中。
转到 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 监视器中看到这样的行: (我不知道为什么有错误信息的那一行)
现在尝试实际使用一些 openCV 代码。在下面的示例中,我将一个 .jpg 文件复制到了 android 模拟器上 cvtest1 应用程序的缓存目录中。下面的代码加载此图像,运行精明的边缘检测算法,然后将结果写回同一目录中的 .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 设备监视器 检索输出或编写一个活动来显示它。
陷阱:
如果您将目标平台降低到 KitKat 以下,某些 OpenCV 库将不再起作用,特别是与 org.opencv.android.Camera2Renderer 相关的类和其他相关类。您可以通过简单地删除适当的 OpenCV .java 文件来解决这个问题。 如果您将目标平台提升到 Lollipop 或更高版本,我的加载文件示例可能无法正常工作,因为不赞成使用绝对文件路径。因此,您可能必须更改示例以从图库或其他地方加载文件。周围有很多例子。【讨论】:
2 月 16 日编辑:jniLibs 现在位于 openCVLibrary310 目录中,而不是主应用程序目录中。两者都可以,但对我来说将它们保留在 opencv 部分似乎更干净。加上更多截图和“陷阱”部分。 我认为缺少一些导入语句,否则非常好! +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
这些错误是关于我一步一步写的。
@DevendraSingh 我得到了和你一样的错误,但我意识到我错过了第 9 步。
如果我们想在 android studio 上为 opencv 编写 c++ 代码怎么办?【参考方案3】:
对于所有想要逃离(太棒了!)以上答案的所有步骤和屏幕截图的人来说,这对我有用android studio 2.2.1
:
创建一个新项目,根据需要命名并使用默认值(minSdkVersion 15 即可)。
从这里下载 zip 文件:https://sourceforge.net/projects/opencvlibrary/files/opencv-android/(我下载的是 3.2.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
【讨论】:
又好又简单,谢谢 ;-) 也适用于 3.2.0 版。 谢谢,这确实是更简单的解决方案。我一分。无法编译新的 OpenCV 模块。这里的答案帮助我解决了这个问题***.com/a/40302788/408780 只是为了补充@blacharnia 所说的内容,只需确保在 cradle 依赖项部分使用 'compile project(':openCVLibrary320')' 而不是 310 也许更一般地说,要添加到上述 cmets,请使用“compile project(':openCVLibraryXYZ')”,其中 XYZ 是不带“点”的 openCV Android SDK 的版本号 - 现在也可以使用对于版本 3.4.0 -> 即使用“编译项目(':openCVLibrary340')” @Mick 谢谢,我根据你的建议编辑了答案。【参考方案4】:Android Studio 3.4 + OpenCV 4.1
从here 下载最新的 OpenCV zip 文件(当前最新版本为 4.1.0)并将其解压缩到您的工作区或其他文件夹中。
正常新建Android Studio项目。点击File->New->Import Module
,导航到/path_to_unzipped_files/OpenCV-android-sdk/sdk/java
,将模块名称设置为opencv
,点击Next
并取消选中屏幕中的所有选项。
启用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 文件同步。
将此字符串添加到 app/build.gradle
文件中的依赖项块
dependencies
...
implementation project(path: ':opencv')
...
再次选择Android
文件查看模式。右键单击app
模块并转到New->Folder->JNI Folder
。选择更改文件夹位置并设置src/main/jniLibs/
。
再次选择Project
文件查看模式,将所有文件夹从/path_to_unzipped_files/OpenCV-android-sdk/sdk/native/libs
复制到app/src/main/jniLibs
。
再次在Android
文件查看模式下右键单击app
模块并选择Link C++ Project with Gradle
。选择构建系统ndk-build
和OpenCV.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”但是“with”后面没有任何内容。你能澄清一下吗?您的意思是说“删除applicationId条目并添加两个条目如下:” @Dale 是的,你应该用两个字符串替换application ID "org.opencv"
字符串:minSdkVersion 21
和 targetSdkVersion 28
(根据 app/build.gradle 文件中的值)
我按照您描述的所有步骤进行操作。但是出现错误 E/art: dlopen("/data/app/com.example.objectsegmentation-1/lib/arm64/libopencv_java4.so", RTLD_LAZY) failed: dlopen failed: library "libc++_shared.so" not found 【参考方案5】:
在你的 build.gradle 中
repositories
jcenter()
implementation 'com.quickbirdstudios:opencv:4.1.0'
More information
【讨论】:
【参考方案6】:这对我有用,就像添加 gradle 依赖一样简单:
https://bintray.com/seesaa/maven/opencv#
https://github.com/seesaa/opencv-android
需要注意的是,我必须使用硬件调试设备,因为 arm 仿真器对我来说运行速度太慢(正如 AVD 管理器所说的那样),并且如 repo README 中所述,此版本不包括 x86 或x86_64 支持。
似乎构建和建议的测试:
static
OpenCVLoader.initDebug();
吐出一堆对我来说看起来很合适的输出。
【讨论】:
这是来自 android studio 中的一个新项目。我没有导入任何东西,没有下载任何东西等等。只需添加 gradle 依赖并同步即可。【参考方案7】: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')
【讨论】:
【参考方案8】:我花了很长时间才弄清楚它是如何工作的。 我使用的方法不需要Gradle。
免责声明:我不知道这种方法的好坏。所以自己用吧。
-
同时下载“OpenCV4Android”和“AndroidNDK”(下载 NDK 以找到 libc++_shared.so,我稍后会说)
在某处提取“OpenCV4Android”并导入类似“opencv-4.5.1-android-sdk\OpenCV-android-sdk\samples\tutorial-1-camerapreview”的示例之一安卓工作室。
导入后,再次进入“OpenCV4Android”sdk“OpenCV-android-sdk\sdk\java\src\org\opencv”并将这个文件夹和所有子文件夹复制到你的“tutorial-1 -camerapreview" 示例项目,例如此图像的部分 (1):
-
现在您需要 JNI 库 和 libc++_shared.so。在您的示例项目中创建一个文件夹并将其命名为“Libs”(此名称并不重要,但您必须稍后对其进行配置)。再次转到“OpenCV4Android”sdk 并将“opencv-4.5.1-android-sdk\OpenCV-android-sdk\sdk\native\libs”的所有文件夹复制到新的“libs ”文件夹中的示例项目作为上图的部分(2)。同样解压ndk,到这个地址“android-ndk\android-ndk-r20b\sources\cxx-stl\llvm-libc++\libs”复制libc++_shared.so 到你的 libs 目录。
请注意,对于这两个库,您必须将至少四个同名文件放在不同 CPU 架构的文件夹中。
-
重要部分。您必须在某处加载这些库。我把它们放在活动中。检查上图的部分 (3)。
static
System.loadLibrary("opencv_java4");
-
最后一步,打开“项目结构”并定义您的 Libs 文件夹,如下图所示:
最后一个提示,如果您不想模拟您的应用程序,请直接制作一个 APK。
【讨论】:
【参考方案9】:在最新的openCV 4.5.2 版本上,您需要导入整个sdk 文件夹,而不是sdk/java,否则当您添加依赖项时,OpenCV 不会出现。完整的描述在这里:
Cant add openCV module as a dependency to my app
【讨论】:
【参考方案10】:我只需 3 个步骤即可在 Android Studio 北极狐上安装 opencv 3.4.15:
步骤 0:新建一个空项目 第一步:从official release page下载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')
点击Sync Now
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':opencv')
点击Sync Now
完成!!!
验证:
将以下行添加到您的 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 文件。如果向下滚动,您会发现类似于下面的屏幕截图的内容
【讨论】:
【参考方案11】:显示创建 jniLibs cpp 时遇到问题的任何人..只需添加 ndk ..
【讨论】:
以上是关于Android Studio 中的 OpenCV的主要内容,如果未能解决你的问题,请参考以下文章
无法按照 Google“入门”页面中的说明在 Android Studio 中添加地图; Android Studio 报错
android studio application怎么创建