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


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


怎么了?

我将Android Studio 1.0与gradle 2.2.1结合使用。

评论

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

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

@BartoszBialecki @Kiran,我已经按照步骤4进行操作了,我无法在sdk目录下找到本机目录。我丢失了什么吗?

@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文件夹。

更新导入的OpenCV模块下的build.gradle以更新4个字段以匹配您的项目build.gradle a)compileSdkVersion b)buildToolsVersion c)minSdkVersion和d)targetSdkVersion。

通过“应用程序”->“模块设置”添加模块依赖性,然后选择“依赖性”选项卡。点击底部的+图标,选择Module Dependency,然后选择导入的OpenCV模块。


对于Android Studio v1.2.2,在项目视图中访问Module Settings:
,右键单击相关模块
->打开模块设置



将sdk / native下的libs文件夹复制到app / src / main下的Android Studio。
在Android Studio中,将复制的libs目录重命名为jniLibs,我们完成了。

步骤(6)是因为Android Studio希望在app/src/main/jniLibs中使用本机lib,而不是在较旧的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包装器。不是特定于Android的。该库可能与OpenCV较新版本不同步。


评论


我在执行第二步后遇到错误,请问我删除javadocs目录吗?尽管我将目标定位为支持android sdk 15的设备,但它也要求我安装android sdk 14

–浪漫电子
15年1月14日在5:34

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

–基兰
15年1月21日在6:36

好的,我明白了,我以为您在谈论Android Open CV SDK随附的目录时,我在谈论系统上的sdk安装目录。确定已完成第6步。在哪里包括static {System.loadLibrary(“ opencv_java “); }?

–浪漫电子
15年1月21日在9:09

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

– puntofisso
15年8月18日在16:45

对于在步骤2中导入模块后出现android-14错误的任何人,您都需要在项目的openCV目录中手动编辑build.gradle,如步骤3所示。

–天堂
15年11月21日在16:37

#2 楼

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

大部分功劳归功于Kiran,Kool,1 “,以及SteveLiles在opencv.org上的解释。我添加此答案是因为我相信Android Studio的界面现在已经足够稳定,可以使用这种类型的集成产品。此外,无论如何,我都必须为我们编写这些说明项目。

经验丰富的AS开发人员会发现其中一些有趣的知识,此答案针对的是在Android Studio中经验有限的人。



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


将其命名为“ 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,库和导入选项的问题。应检查所有三个。单击Finish。

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)。请注意这四个字段的值:


compileSDKVersion(我的说是23)
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。

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




将{unzip-dir} / sdk / native / libs目录(及其下的所有内容)复制到您的Android项目,复制到cvtest1 / OpenCVLibrary310 / src / main /,然后重命名您的副本
从库到jniLib。现在,您应该有一个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 Monitor中看到这样的行:

(我不知道为什么那行显示错误消息)


现在尝试实际使用一些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设备监视器
检索输出或编写活动以显示输出。

问题:


如果降低您的KitKat下面的目标平台将不再运行某些OpenCV库,特别是与org.opencv.android.Camera2Renderer相关的类以及其他相关类。您可能可以通过简单地删除适当的OpenCV .java文件来解决此问题。因此,您可能必须更改示例以从图库或其他地方加载文件。周围有很多例子。


评论


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

– ssimm
16-2-16在12:33

我认为缺少一些导入语句,否则效果很好! +1

–艾伦·诺加德(AllanNørgaard)
16 Mar 9 '16 at 15:20

我听了你的回答,但失败了。 1i收到错误OpenCV错误:无法加载OpenCV 2的信息库java.lang.UnsatisfiedLinkError:dalvik.system.PathClassLoader [DexPathList [[zip文件“ /data/app/www.deven.com.opencv-2/base.apk “],nativeLibraryDirectories = [/ vendor / lib,/ system / lib]]]找不到” libopencv_java3.so。关于这些错误,我在编写时逐步进行了哪些操作。

–德文德拉·辛格(Devendra Singh)
16-3-16在7:04



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

–aaaa
16年4月13日在14:05

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

–user8663682
18年1月23日在12:51

#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,然后单击“确定”,然后接受所有默认对话框。


在您的gradle文件中app模块,将其添加到依赖项块:
 dependencies {
     compile project(':openCVLibraryXYZ')
     //rest of code
 }



其中XYZ是您下载的确切版本,例如在我的情况下:
    dependencies {
        compile project(':openCVLibrary320')
        //rest of code
    }


评论


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

–黑花
17 Mar 22 '17 at 18:24

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

–提马
17年3月31日下午14:58

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

–亚伯拉罕·菲利普(Abraham Philip)
17年5月19日在0:15

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

–米克
18年1月16日在19:42

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

– yshahak
18年1月17日在13:59

#4 楼

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,将模块名称设置为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初始化,请添加Toast MainActivity onCreate()方法中的消息:

Toast.makeText(MainActivity.this, String.valueOf(OpenCVLoader.initDebug()), Toast.LENGTH_LONG).show();


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

评论


上面您说过“用.....替换应用程序ID” org.opencv”,但在“ with”之后没有任何内容。你能澄清一下吗?您是说“删除applicationId条目并添加两个条目,如下所示”:

–戴尔
19-09-19在18:51



@Dale是的,您应该使用两个字符串替换应用程序ID“ org.opencv”字符串:minSdkVersion 21和targetSdkVersion 28(根据app / build.gradle文件中的值)

– Plo_Koon
19-09-20在19:51



我遵循了您描述的所有步骤。但是出现错误E / art:dlopen(“ / data / app / com.example.objectsegmentation-1 / lib / arm64 / libopencv_java4.so”,RTLD_LAZY)失败:dlopen失败:找不到库“ libc ++ _ shared.so”

–马森(Masthan)
1月7日6:40



#5 楼

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

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

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

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

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

static {
    OpenCVLoader.initDebug();
}


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

评论


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

– Naumdev
18/12/27在16:23

#6 楼

在您的build.gradle

repositories {
  jcenter()
}

implementation 'com.quickbirdstudios:opencv:4.1.0'


更多信息

#7 楼

Download

从https://github.com/opencv/opencv/releases获取最新的Android预制OpenCV版本并解压缩(例如,opencv-4.4.0-android-sdk.zip)。
创建一个空的Android Studio项目
Open Android Studio. Start a new project. 


保留默认目标设置。
使用“空活动”模板。将活动命名为MainActivity并具有相应的布局activity_main。
插入设备并运行项目。在继续下一步之前,它应该已成功安装并启动。
转到File-> New-> Import module
,并提供指向unpacked_OpenCV_package / sdk / java的路径。模块名称将自动检测。禁用Android Studio在下一个窗口中会建议您的所有功能。


配置库build.gradle(openCVLibrary build.gradle)
 Add OpenCV dependency

实现库到项目(应用程序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'
        }
    }
}


#8 楼

显示创建jniLibs cpp时遇到问题的任何人..只需添加ndk ..