基于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应该长这样
然后把左边的选项卡切换到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(主要参考资料)