安卓调用Opencv库的步骤和注意点

吐槽

最近这周帮一个大四的学长弄他的毕业设计,他的课题是基于安卓环境下的图片合成问题,本来这个蛮简单的,但是他这个两个图片的合成算法是调用opencv的,,,然后就把我各种煎熬,然后按照网上的各种博客来装opencv库,出现了各种问题,然后就一个一个去解决,,,唉头大。希望我的总结可以给别人带来帮助。

Opencv库

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#、Ch、Ruby的支持。
//以上都是百度百科,我去了解了一下这个还蛮厉害的,图片识别,人脸识别,动作追踪等等视觉方面的都很完善,好多都是开源的,java,c++都可以调用。

Opencv在安卓环境下的配置

网上说有好几种方法,我下面就只讲一种的配置过程,亲测可以用的
第一步:在官网下载opencv for android的sdk
官网:https://opencv.org/releases.html
这里写图片描述
下载好,然后放在文件夹里面
第二步:将opencv导入安卓项目里面
Android Studio中创建一个Android项目,创建好之后,选择File->New->Import Module
这里写图片描述
然后把opencv文件夹里面的选择SDK/JAVA
这里写图片描述
这样就导入进去了
第三步:添加依赖
在File/Project structure
这里写图片描述
添加这个依赖后,恭喜你这个还没弄完,可以在代码里面调用opencv库的代码了,但是会出现下面的问题
这里写图片描述
这个查了一下好像是没装安装OpenCV Manager这个东西,然后下了我们要解决这个问题
第四步:解决没安装OpenCV Manager这个问题
在自己app的文件夹里面app/src/mian下面创建一个jniLibs的文件夹
然后将下载下了的opencv库文件夹里面的opencv-android\OpenCV-android-sdk\sdk\native\libs
libs这个文件夹东西全部复制到jniLibs文件夹里面
结果如下:
这里写图片描述
然后在项目的build.gradle里面添加东西
这里写图片描述
添加的代码

 compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
task nativeLibsToJar(type: Jar,description:'create a jar archive of the native libs'){
        destinationDir file("$buildDir/native-libs")
        baseName 'native-libs'
        from fileTree(dir: 'libs',include: '**/*.so')
        into 'lib/'
    }
    tasks.withType(JavaCompile){
        compileTask -> compileTask.dependsOn(nativeLibsToJar)
    }

第五步:处理opencv库和安卓版本问题
app 的 build.gradle 然后打开OpenCVLibrary340的build.gradle 有些地方需要一致
这个是app的gradle
这里写图片描述
这个是opencv库的build.gradle
这里写图片描述
就是把他们改成一样的
第六步:在调用opencv库的那个活动里面添加如下代码

/***
            * opencv库 加载并初始化回调的函数
     */
    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            super.onManagerConnected(status);
            switch (status){
                case BaseLoaderCallback.SUCCESS:
                    Log.d("233","加载成功");
                    break;
                default:
                    super.onManagerConnected(status);
                    Log.d("233","加载失败");
                    break;
            }
        }
    };

    @Override
    protected void onResume() {
        super.onResume();
        if (!OpenCVLoader.initDebug()){
           Log.d("233","可以");
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10,this,mLoaderCallback);
        }else {
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }

    }

就是看下opencv库成功运行没

总结

弄了好久,终于弄完了,还有一点很重要
把opencv库的算法代码重新开个线程,因为很耗时
这个教训可是我拿好久时间换来的哇哇哇,唉,希望我的博客对别人有帮助

猜你喜欢

转载自blog.csdn.net/sakurakider/article/details/80470358