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答案的简化版本。
- 从OpenCV.org 下载最新的OpenCV sdk for Android并解压缩zip文件。
- 导入OpenCV到Android Studio ,从文件 – >新build – >导入模块 ,在解压缩的opencv归档中selectsdk / java文件夹。
- 更新导入的OpenCV模块下的build.gradle更新4个字段以匹配您的项目build.gradle a)compileSdkVersion b)buildToolsVersion c)minSdkVersion和d)targetSdkVersion。
- 按应用程序 – >模块设置 添加模块依赖项 ,然后select依赖关系选项卡。 点击底部的+图标,selectModule Dependency ,select导入的OpenCV模块。
- 对于Android Studio v1.2.2,要访问模块设置:在项目视图中,右键单击依赖模块 – > 打开模块设置
- 将 sdk / native下的libs文件夹复制到app / src / main下的Android Studio中。
- 在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包装是
- Android OpenCV SDK – OpenCV.org维护Android Java包装。 我build议这个。
- OpenCV Java – OpenCV.org维护自动生成的桌面Java包装。
- 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经验有限的人。
-
使用项目向导(Menu:/ File / New Project)创build一个新的Android Studio项目:
- 称之为“ cvtest1 ”
- forms因素: API 19,Android 4.4(KitKat)
-
名为MainActivity的 空白活动
你应该有一个cvtest1目录存储这个项目。 (Android工作室的标题栏显示了你打开项目时cvtest1的位置)
-
确认您的应用程序正常运行。 尝试改变“Hello World”文本来确认构build/testing循环对您是否正常。 (我正在使用API 19设备的模拟器进行testing)。
-
下载适用于Android v3.1.0的OpenCV包,并将其解压到某个临时目录中。 (确保它是专用于Android的软件包,而不仅仅是OpenCV for Java软件包。)我将把这个目录称为“ unzip-dir ”在unzip-dir下面,你应该有一个sdk / native / libs目录,其子目录以像arm …, mips …和x86 …(每种types的“架构”Android运行的一个)
-
从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进行编译。
-
打开项目结构对话框( 菜单:/文件/项目结构)。 select“app”模块,点击Dependencies选项卡,并添加:openCVLibrary310作为Module Dependency。 当你selectAdd / Module_Dependency时,它应该出现在你可以添加的模块列表中。 它现在将显示为依赖项,但在事件日志中会出现一些无法find-Android-14的错误。
-
查看您的应用程序模块的build.gradle文件。 Android项目中有多个build.gradle文件。 你想要的是在cvtest1 / app目录中,从项目视图看起来像build.gradle(模块:应用程序) 。 请注意这四个字段的值:
- compileSDKVersion(我的23说)
- buildToolsVersion(我的说23.0.2)
- minSdkVersion(我说19)
- targetSdkVersion(我的23说)
-
您的项目现在有一个cvtest1 / OpenCVLibrary310目录,但从项目视图中不可见:
使用其他工具,如任何文件pipe理器,并转到这个目录。 您也可以将项目视图从Android切换到项目文件 ,您可以在此屏幕截图中find此目录:
里面有另一个build.gradle文件(在上面的屏幕截图中突出显示)。 使用步骤6中的四个值更新此文件。
-
重新调整你的项目,然后清理/重build它。 (菜单: /构build/ Clean_Project )它应该清理和构build没有错误,你应该看到许多引用:在0:消息屏幕openCVLibrary310 。
在这一点上,模块应该像app一样在openCVLibrary310中出现在项目层次结构中。 (请注意,在那个从Project View切换回Android视图的小下拉菜单中)。 你还应该在“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目录。 Resynch你的项目和这个目录现在应该出现在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应用程序的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);
-
运行你的应用程序 您的模拟器应该创build一个黑白的“边缘”图像。 您可以使用Android设备监视器来检索输出或编写一个活动来显示它。
难题 :
- 如果你将目标平台降低到KitKat以下,一些OpenCV库将不再起作用,特别是与org.opencv.android.Camera2Renderer和其他相关类有关的类。 你可以通过简单地删除appc的OpenCV .java文件来解决这个问题。
- 如果你把目标平台升到棒棒糖或以上,我的加载文件的例子可能不起作用,因为绝对文件path的使用是不被接受的。 所以你可能不得不改变这个例子从图库或其他地方加载一个文件。 有很多例子在stream转。
对于所有觉得自己想要逃避所有步骤和屏幕截图的(伟大!)以上答案的人来说,这适用于android studio 2.2.1
:
- 创build一个新的项目,按照你的意思命名,并采用默认的(minSdkVersion 15是好的)。
- 从这里下载zip文件: https : //sourceforge.net/projects/opencvlibrary/files/opencv-android/ (我下载了3.1.0版本)。 编辑:3.2.0也适用
- 解压缩zip文件,最好的地方是在你的工作区文件夹,但它并不重要。
- 在
Android Studio
里面,点击File->New-> Import Module
并导航到\path_to_your_unzipped_file\OpenCV-android-sdk\sdk\java
,点击OK,然后接受所有的默认对话框。 -
在您的
app
模块的gradle
文件中,将其添加到依赖性块:dependencies { compile project(':openCVLibrary320') //rest of code }
显示任何人在创buildjniLibs CPP时遇到问题..只是添加ndk ..
您也可以将这个库添加到build.gradle
dependencies{ compile 'org.opencv:opencv-android:2.4.8' }
- 如何为不同的gradle buildTypes提供不同的Android应用程序图标?
- getApplication()与getApplicationContext()
- ListView上的setEmptyView不在android应用程序中显示其视图
- Android BroadcastReceiver,设备重启后自动运行服务
- 从父Activity调用Fragment方法
- 谷歌播放alpha和betatesting仪function
- 相同的线程错误的WebView方法
- 引起:java.lang.UnsupportedOperationException:无法转换为维:type = 0x1
- 如何在不强制数字input的情况下默认使用EditText上的数字键盘?