我想在Android Studio的应用程序中使用OpenCV库。我遵循此处找到的说明,但出现错误
找不到名称为“默认”的配置
有什么事吗
我将Android Studio 1.0与gradle 2.2.1一起使用。
native
目录下找不到sdk
目录,我丢失了什么吗?
我想在Android Studio的应用程序中使用OpenCV库。我遵循此处找到的说明,但出现错误
找不到名称为“默认”的配置
有什么事吗
我将Android Studio 1.0与gradle 2.2.1一起使用。
native
目录下找不到sdk
目录,我丢失了什么吗?
Answers:
在Android Studio中使用Android OpenCV sdk的以下步骤。这是this(1)SO答案的简化版本。
步骤(6)是因为Android Studio需要本地库app/src/main/jniLibs
而不是较旧的libs
文件夹。对于Android OpenCV的新手,请不要错过以下步骤
static{ System.loadLibrary("opencv_java"); }
(注意:对于OpenCV版本3,在此步骤中,您应该加载该库opencv_java3
。)用C / C ++编写的OpenCV。Java包装器是
javadocs
目录?。android sdk 14
虽然我将目标设备支持,但它也要求我安装android sdk 15
sdk
系统上的安装目录,而在谈论Android Open CV SDK
.Ok已完成步骤6的情况下。我应包括在哪里static{ System.loadLibrary("opencv_java"); }
?
android-14
在第2步导入模块后错误,你需要手动编辑build.gradle
在OpenCV的目录在您的项目如步骤3
将OpenCV v3.1.0集成到Android Studio v1.4.1中,带有更多详细信息的说明以及应该获得的类型屏幕截图。
大部分信用归于opencv.org上的Kiran,Kool,1“和SteveLiles。另外,我还是必须为我们的项目写这些说明。
经验丰富的AS开发人员会发现一些这种学问。此答案针对的是在Android Studio中经验有限的人。
使用项目向导创建一个新的Android Studio项目(菜单:/ File / New Project):
空白活动名为MainActivity
您应该具有一个cvtest1目录,该项目存储在该目录中。(Android Studio的标题栏显示打开项目时cvtest1的位置)
验证您的应用程序正常运行。尝试更改类似“ Hello World”文本的内容,以确认构建/测试周期适合您。(我正在使用API 19设备的仿真器进行测试)。
下载适用于Android v3.1.0的OpenCV软件包,并将其解压缩到某个临时目录中。(确保它是专用于Android的软件包,而不仅仅是OpenCV for Java软件包。)我将这个目录称为“ unzip-dir ”,在unzip-dir下,您应该有一个sdk / native / libs目录,其子目录以诸如arm ...,mips ...和x86之类的东西(针对每种类型的“体系结构” Android都运行一种)
从Android Studio中将OpenCV作为模块导入到您的项目中:菜单:/ File / New / Import_Module:
点击下一步。您将看到一个包含三个复选框的屏幕,以及有关jar,库和导入选项的问题。应检查所有三个。单击完成。
Android Studio开始导入该模块,并显示一个import-summary.txt文件,其中包含未导入内容的列表(主要是javadoc文件)和其他信息。
但是您还会收到一条错误消息,提示无法找到哈希字符串为'android-14'...的目标。发生这种情况的原因是,您下载的OpenCV zip文件中的build.gradle文件表示可以使用android API版本14进行编译,默认情况下,Android Studio v1.4.1没有该版本。
打开项目结构对话框(菜单:/ File / Project_Structure)。选择“ app”模块,单击“ Dependencies”选项卡,然后将:openCVLibrary310添加为Module Dependency。当选择Add / Module_Dependency时,它应该出现在您可以添加的模块列表中。现在它将显示为依赖项,但事件日志中会出现更多无法找到的android-14错误。
在build.gradle文件中查找您的应用模块。一个Android项目中有多个build.gradle文件。所需的一个位于cvtest1 / app目录中,从项目视图中看起来像build.gradle(模块:app)。请注意这四个字段的值:
您的项目现在具有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。
您应该在java下看到带有所有OpenCV函数的openCVLibrary310模块,如以下屏幕截图所示:
将{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.");
}
现在尝试实际使用一些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设备监视器来检索输出,也可以编写活动来显示输出。
该陷阱:
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
我写这些错误时逐步解决了这些错误。
对于每个认为自己想逃避以上答案(很好!)上的所有步骤和屏幕截图的每个人,这对我来说都适用android studio 2.2.1
:
Android Studio
,单击File->New-> Import Module
并导航到\path_to_your_unzipped_file\OpenCV-android-sdk\sdk\java
并单击确定,然后接受所有默认对话框。在 模块的gradle
文件中app
,将其添加到依赖关系块:
dependencies {
compile project(':openCVLibraryXYZ')
//rest of code
}
XYZ是您下载的确切版本,例如,在我的情况下:
dependencies {
compile project(':openCVLibrary320')
//rest of code
}
Android Studio 3.4 + OpenCV 4.1
从此处下载最新的OpenCV zip文件(当前最新版本为4.1.0),并将其解压缩到您的工作区或另一个文件夹中。
正常创建新的Android Studio项目。单击File->New->Import Module
,导航到/path_to_unzipped_files/OpenCV-android-sdk/sdk/java
,将Module name设置为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();
如果初始化成功,您将true
在Toast消息中看到,否则将看到false
。
application ID "org.opencv"
字符串替换为两个字符串:minSdkVersion 21
和targetSdkVersion 28
(根据app / build.gradle文件中的值)
显示创建jniLibs cpp时遇到问题的任何人..只需添加ndk ..
这对我有用,就像添加gradle依赖一样容易:
https://bintray.com/seesaa/maven/opencv#
https://github.com/seesaa/opencv-android
一个警告是我必须使用硬件调试设备,因为手臂仿真器对我来说运行太慢(正如AVD Manager所说的那样),并且,如自述文件README所述,此版本不包括x86或x86_64支持。
它似乎可以构建并建议测试:
static {
OpenCVLoader.initDebug();
}
吐出一堆看起来对我来说正确的输出。