基于Android的opencv开发(Android studio3.6+opencv4.3.0开发

文章正文
发布时间:2024-05-29 02:16

基于Android的opencv开发有两种。 第一种用java形式的OpenCV库,  第二种用C++形式的OpenCV库,  这两种库都在OpenCV官方提供的SDK中。

第一种形式, 需要在开发环境中导入 OpenCV 的 jre包, 还需要安装 Android OpenCV Manager,  有的书上例子也是用这种方式写的。  Android OpenCV Manager是用来管理OpenCV 库的, 减少APP内存占用, 支持特定硬件优化, 定期更新库等, 具体看它的介绍()。

第二种形式, 需要使用C++的OpenCV库,  以jni的形式来调用。底层NDK的方式开发可以使用这种。

 

目录

 

下载opencv

到opencv官网(https://opencv.org/releases/)去下载opencv(https://sourceforge.net/projects/opencvlibrary/files/4.3.0/opencv-4.3.0-android-sdk.zip/download)

这里直接下载Opencv4.3.0 android版本(https://sourceforge.net/projects/opencvlibrary/files/4.3.0/opencv-4.3.0-android-sdk.zip/download)

下载后解压可以看到以下几个文件

apk:opencv已经编译好的Android可执行程序,拷贝到手机上即可运行。

samples:生成这些apk的Android代码工程。

sdk:里面是opencv的Java的接口和JNI接口等

sample:opencv提供的一些简单例子。
sdk:目录即是我们开发opencv所需要的类库;

 

在Android studio上配置opencv

1.打开Android studio新建一个新的Android空工程。

2.在Android Studio的菜单选择File-->New-->Import Module。

3.选择opencv android pack解压出来的sdk目录下的java文件夹,点击下一步,出现三个复选框,都选上,点击Finish。

等待导入

4.菜单栏选择File-->Project Structure。

5.按照如下图步骤操作,选择Dependencies-->+-->3 Module dependency,点击ok退出,然后再点击ok退出。

然而并不能选择。。。。

改为3.4.10试试

 

先配置AS的SDK Tools

我们选择CMake和NDK

CMake是一个跨平台的编译工具,能够输出各种各样的makefile文件,这个在之后OpenCV编译阶段需要用到

NDK是Android平台下的一个开发工具包,使用NDK可以快速地开发C、C++的以.so为后缀的动态库,并自动将.so动态库与应用打包成.apk文件,这也是后面需要用到的

选择好后,点击Apply应用,即可开始下载

全都不行。。。。。(不得不吐槽一下。网上很多教程,特别是CSDN上,博客里面写着图,一张图都没有。。。)

理论上已经成功导入了吖~~~~

也确实是成功导入了

打开下面两个文件(这里的小绿点表示这是个原始包,还不是Module或者library

然后再把你解压出来的Android-OpenCV-SDK的SDK下面的gradle文件拖入AS,现在你的代码文件应该有三个,如下图所示:

sdk\下面的gradle就是用来指导我们gradle该怎么写的,一定不要改

首先分屏如下

然后将430的第一句

apply plugin: 'com.android.application' 改为 apply plugin: 'com.android.library'

这就是为什么上面一直import不了module。网上的坑爹教程根本不说有这步!!!!!!!!!!!!!!必须要把application改为library才可以当作库来调用。

其次,把**android标签开始的内容直到最后一行,复制到430的gradle中,把最后的dependencies删除(这里是删除430的gradle里面的,千万别去删app里面的),把defalutconfig里面的applicationId一行也删除(430里面的,再次强调不是app)**然后你的430的gradle应该长这样
 

apply plugin: 'com.android.library' android { compileSdkVersion 29 buildToolsVersion "29.0.3" defaultConfig { minSdkVersion 16 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }

然后把左边的选项卡切换到sdk下面的gradle标签,同样一比一进行对比改,这里就不能直接复制了,要对比着改,有些东西必须要有,有些东西我也不知道是不是必须的,有些语句我也看不懂,本着宁多勿少的原则,我会把我能跑通的都复制进去并写在下面的操作中,现在你的页面应该是这样:

将下面这段到的430gradle中(defaultconfig 里面)

externalNativeBuild { cmake { arguments "-DANDROID_STL=c++_shared" targets "opencv_jni_shared" } }

下面这一段也要复制进去

buildTypes { debug { packagingOptions { doNotStrip '**/*.so' // controlled by OpenCV CMake scripts } } release { packagingOptions { doNotStrip '**/*.so' // controlled by OpenCV CMake scripts } minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } }

然后这里的

sourceSets { main { jniLibs.srcDirs = ['native/libs'] java.srcDirs = ['java/src'] aidl.srcDirs = ['java/src'] res.srcDirs = ['java/res'] manifest.srcFile 'java/AndroidManifest.xml' } }

只要jniLibs,复制到430中,看到这里应该明白要把native复制进去,所以把sdk下的native文件夹复制到opencv中src目录下的main文件夹下,这里 也可以复制到其他位置按需修改(记得把项目切换到project模式)

然后看到最下面的

externalNativeBuild { cmake { path (project.projectDir.toString() + '/libcxx_helper/CMakeLists.txt') } }

就知道要把sdk下面的libcxx_helper复制到430文件夹下,复制进去后你的430文件夹应该是这样:

gradle(430)文件应该是这样

apply plugin: 'com.android.library' android { compileSdkVersion 29 buildToolsVersion "29.0.3" defaultConfig { minSdkVersion 16 targetSdkVersion 29 versionCode 1 versionName "1.0" externalNativeBuild { cmake { arguments "-DANDROID_STL=c++_shared" targets "opencv_jni_shared" } } testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { debug { packagingOptions { doNotStrip '**/*.so' // controlled by OpenCV CMake scripts } } release { packagingOptions { doNotStrip '**/*.so' // controlled by OpenCV CMake scripts } minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } sourceSets { main { jniLibs.srcDirs = ['native/libs'] } } externalNativeBuild { cmake { path (project.projectDir.toString() + '/libcxx_helper/CMakeLists.txt') } } }

然后点击sync.同步一下。successful以后,切换回android目录,发现430下面多了三个柱子如下图:

这个就表示可以进行模块导入了。此时找到project struture。点击它依次选选择Dependencies,app,+,module Dependency

如果你没有改成 library,也没有sync,那么这里就是nothing to show,而那些坑爹教程教你Import Moudle以后就去添加依赖,最终你只能得到noting to show,ok之后选择apply,自动在gradle 里添加implementation project(path: ‘:opencv430’)

改完了430的gradle,再来改app的gradle.首先是在defalultconfig添加CMAKE语句

externalNativeBuild { cmake { cppFlags "-frtti -fexceptions" abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' arguments "-DANDROID_STL=c++_shared" targets "opencv_jni_shared" } }

然后在android括号里添加sourcsets

sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } }

app的gradle最终是这样的

apply plugin: 'com.android.application' android { compileSdkVersion 29 buildToolsVersion "29.0.3" defaultConfig { applicationId "com.example.androidopencvtest" minSdkVersion 16 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" externalNativeBuild { cmake { cppFlags "-frtti -fexceptions" abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' arguments "-DANDROID_STL=c++_shared" targets "opencv_jni_shared" } } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } sourceSets { main { jniLibs.srcDirs = ['src/main/jniLibs'] } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' implementation project(path: ':opencv430') }

这是先不要着急点 sync,先把项目切换到 project目录,在app-src-main把opencv安卓sdk文件下的 sdk\native\libs里的东西复制进去,可根据需要酌情删减,复制的时候顺道改名为jniLibs,如下图:

进行编译

然后提醒安装NDK

应该这就是代表配置成功了吗

 

demo测试

首先在java文件中导入opencv头文件

没有报错,证明opencv应该是可以用的了

 

参考资料

https://blog.csdn.net/u011511601/article/details/80538356

https://blog.csdn.net/KayChanGEEK/article/details/86493632

https://www.pianshen.com/article/4713262635/

https://blog.csdn.net/qq_39321542/article/details/106080136(主要参考资料)

首页
评论
分享
Top