(前言,在配置过程中遇到了不少的bug,本文把bug也列出来。)
基于Android的opencv开发有两种。 第一种用java形式的OpenCV库, 第二种用C++形式的OpenCV库, 这两种库都在OpenCV官方提供的SDK中。
目录
下载opencv
在Android studio上配置opencv
demo测试
参考资料
到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)
下载后解压可以看到以下几个文件
sample:opencv提供的一些简单例子。
sdk:目录即是我们开发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
应该这就是代表配置成功了吗
首先在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(主要参考资料)