Android学习笔记之——基于Android的opencv开发(Android studio3.6+opencv4.3.0开发环境搭建)

(前言,在配置过程中遇到了不少的bug,本文把bug也列出来。)

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

  • 第一种形式, 需要在开发环境中导入 OpenCV 的 jre包, 还需要安装 Android OpenCV Manager,  有的书上例子也是用这种方式写的。  Android OpenCV Manager是用来管理OpenCV 库的, 减少APP内存占用, 支持特定硬件优化, 定期更新库等, 具体看它的介绍(http://docs.OpenCV.org/2.4/platforms/android/service/doc/index.html)。
  • 第二种形式, 需要使用C++的OpenCV库,  以jni的形式来调用。底层NDK的方式开发可以使用这种。

目录

下载opencv

在Android studio上配置opencv

demo测试

参考资料


下载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(主要参考资料)

猜你喜欢

转载自blog.csdn.net/gwplovekimi/article/details/106276557