1. 首先打开Android Studio,新建一个工程,选择Empty Activity, 其他的名字,路径等根据需要自行配置;
  2. 点击菜单栏的File→New→Import new Module ,如下图所示:

    会弹出如下界面:

3.找到你在openCV官网下载的安卓SDK并解压,把解压后的文件夹(我这里是D:\Android\OpenCV-android-sdk\sdk\java )目录下的东西导入 ,这里会让你输入Module的名字,随便什么都行,为了方便还是取名opencv430(430是版本号),而不是网上那一堆垃圾教程说的什么会自动填入名字(自动填入的就是java,一堆垃圾说填入opencvlibrary),这里是手动填入

android SmartOpenCV使用 opencv android studio_opencv


输入好名字点击NEXT;

  1. 接下来你会看到如图所示的界面:
  2. android SmartOpenCV使用 opencv android studio_opencv_02

  3. 三个√全部打上,点击FINISH;
  4. 然后以Android木查看,你会发现OpenCV的安卓SDK就导入进来了,如下图所示:
  5. android SmartOpenCV使用 opencv android studio_android studio_03

  6. 这里的小绿点表示这是个原始包,还不是Module或者library.
    接下来就是配置gradle和复制对应的文件,这才是不要manager的关键,而不是一堆垃圾教程给你说的改个jniLibs就完成了
  7. 首先申明一点,对于老司机gradle怎么写怎么配,接下来的东西完全没必要看,剩下的内容针对纯新手,包括我自己。你可能告诉我你照这那一堆垃圾教程也没有manager也跑通了,那你也可以不用看了,以下操作我会精确到每一步,用来记录自己被一堆垃圾教程坑了三天配不好OpenCV without manager的方法
  8. 首先把项目改成Android目录形式,就是上方那个图,然后找到Gradle Scripts,打开两个grdle,如下图所示:
  9. android SmartOpenCV使用 opencv android studio_Android_04

  10. 然后再把你解压出来的Android-OpenCV-SDK的SDK下面的gradle文件拖入AS,现在你的代码文件应该有三个,如下图所示:
  11. android SmartOpenCV使用 opencv android studio_android studio_05

  12. 你问我为什么要三个?因为要照着改,不能一股脑的复制,就是这么简单,下面的操作为了简便,我会以app的gradle和430的gradle来指定改那个gradle,而sdk\下面的gradle就是用来指导我们gradle该怎么写的,你一定不要改
  13. 首先切换到app:gradle选项卡,然后对着gradle430的选项卡右键,选择split vertically如下图所示,当然你也可以选择垂直看个人喜好:
  14. android SmartOpenCV使用 opencv android studio_OpenCV_06

  15. 随后你的AS界面应该变成了这样:
  16. android SmartOpenCV使用 opencv android studio_android studio_07

  17. 接下来就是一比一的对照修改!!!
  18. 首先,把430的第一句apply plugin ‘com.android.appcation’ 修改为:
    apply plugin ‘com.android.library’ ,一堆坑爹教程根本不会告诉你这里要改成 library,然后你再后面 project struture里一直找不到module(nothing to show),然后你就一脸问号。
  19. 其次,把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 24
        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'
        }
    }
}
  1. 然后你可以点一下sync ,免得他在上面不好看,也可以一会配置完了再点,如下图所示:
  2. android SmartOpenCV使用 opencv android studio_OpenCV_08

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

  5. 首先两个def 和prinln 可复制可不复制,看个人喜好,接着往下看android里面的东西,看到cmake,就知道这里要一比一复制了
  6. android SmartOpenCV使用 opencv android studio_opencv_10

  7. 这一段复制到右边的430gradle中(defaultconfig 里面)
    另外看到的
  8. android SmartOpenCV使用 opencv android studio_Android_11

  9. 这一段也复制进去

然后下面的

android SmartOpenCV使用 opencv android studio_OpenCV_12


只要jniLibs,复制到430中,看到

android SmartOpenCV使用 opencv android studio_Android_13


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

15.然后看到最下面的

android SmartOpenCV使用 opencv android studio_android_14


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

android SmartOpenCV使用 opencv android studio_opencv_15


你的gradle(430)文件应该是这样

apply plugin: 'com.android.library'

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"

    defaultConfig {

        minSdkVersion 24
        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-optimize.txt'), 'proguard-rules.pro'
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['native/libs']
        }
    }

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

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

android SmartOpenCV使用 opencv android studio_Android_16


这个就表示可以进行模块导入了。此时找到工具栏的project struture按钮如下图:

android SmartOpenCV使用 opencv android studio_OpenCV_17


点击它依次选选择Dependencies,app,+,module Dependency

android SmartOpenCV使用 opencv android studio_opencv_18


弹出如下界面,打钩,确定

android SmartOpenCV使用 opencv android studio_opencv_19


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

17.改完了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.byd.facerecognize"
        minSdkVersion 24
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        externalNativeBuild {
            cmake {
                cppFlags "-frtti -fexceptions"
                abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
                arguments "-DANDROID_STL=c++_shared"
                targets "opencv_jni_shared"
            }
        }

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    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,如下图:

android SmartOpenCV使用 opencv android studio_android_20


此时你的文件夹应该长这样,圈出来的地方就是新增的

android SmartOpenCV使用 opencv android studio_android_21


然后这时候再取点击sync.sync完成后,去点击工具栏的锤子,如图所示:

android SmartOpenCV使用 opencv android studio_android_22


在编译时,看到如下这句:

android SmartOpenCV使用 opencv android studio_android_23


就表明正在编译关于so,c++的东西,具体是什么我也不知道,但是一定要出现,并且successful.

至此,完成以后。你就可以使用opencv里面所有的方法和函数了,由于其他原因,这里就不移植官方demo并展示了(硬件,权限,等等不允许)。

PS:

由于每次这样导入很麻烦,因此在附上一个将OpenCV打包jar包的方法:

<1>.首先点击右边的gradle,如图所示:

android SmartOpenCV使用 opencv android studio_OpenCV_24


<2>.依次选择430,other,如图所示

android SmartOpenCV使用 opencv android studio_android studio_25


<3>.找到create full jar debug (或者release),如图:

android SmartOpenCV使用 opencv android studio_android studio_26


双击任意一个运行,运行完成后,改为project视图,在opencv430-bulid-intermediates-full_jar-debug下找到full_jar文件,如图所示

android SmartOpenCV使用 opencv android studio_android_27


<4>.把full_jar复制到app项目的libs下,如图所示:

android SmartOpenCV使用 opencv android studio_opencv_28


右键full.jar,add as a library,如图

android SmartOpenCV使用 opencv android studio_Android_29


点击ok

然后你就可以使用opencv中的Java接口,不用每次都Import Module了,如图

android SmartOpenCV使用 opencv android studio_android studio_30


android SmartOpenCV使用 opencv android studio_android studio_31


至此配置就全部结束了。之所以在网上写了那么多相关配置方法后,还选择写这样一篇文章,主要还是记录下自己的踩坑过程。

当然了,网上那些教程也没有必要写的那么详细,也没有必要教你,只是自己配置个环境配了三天,各种文章翻烂了也没配置好,才会在文章中使用一些过激言论,决定自己写

也许你看了我的文章也会有问题,可以在下面留言,我会尽力解答。也有可能你还是配置不好Android的OpenCV环境,也许我给你解答了你还是配置不好,那么就需要你自己有点工程能力,去排查错误了。

没有一篇文章是万能的,只有靠自己的工程能力,去一点点排查错误,才能成功。这件事最终带来的喜悦一定远远超过一顿猪脚饭