在上篇中,我们成功配置了OpenCV在Eclipse中的开发环境,并成功运行其中一个demo,但是对于OpenCV Manager的依赖让其用户体验变得很差,那么我们应该如何剔除对OpenCV Manager依赖呢?在此之前,我们应先了解一下OpenCV Manager。
一、OpenCV Manager简介:
OpenCV Manager是一个android服务,用于初始化OpenCV库,使用此服务的作用:
1. 压缩apk大小,所有程序使用同样的二进制代码,而不是各自使用各自的本地库;
2. 所有支持平台上自动进行特定的硬件优化;
3. 自动更新和bug修复;
4. opencv库已被信任,所有调用opencv库的包apk可以直接发布到googleplay上;
用解压工具打开OpenCV Manager,发现里面其实就是大量的.so库文件:
二、剔除OpenCV Manager:
想要不安装OpenCV Manager,且通过JNI方式调用OpenCV,其实有三种方式:
a.使用静态的OpenCV库的方式
b.使用动态的OpenCV库的方式
c.同时使用Java的API和JNI的接口的方式(动态链接OpenCV库)
关于这三种方式更详细的介绍请查看:http://blog.csdn.net/yanzi1225627/article/details/27863615
这里我们以OpenCV Sample - face-detection这个demo为例进行修改,其中需要修改的有两个文件:Android.mk和FdActivity.java:
1.修改makefile:
在jni文件目录下【Android.mk】文件,将原本被屏蔽掉的几行配置进行修改:
上图中OPENCV_CAMERA_MODULES、OPENCV_INSTALL_MODULES和OPENCV_LIB_TYPE这三个参数的作用分别是:
OPENCV_CAMERA_MODULES:为on时,会自动将带camera的so拷贝至工程下的libs目录下面;
OPENCV_INSTALL_MODULES:为on时,自动将依赖的OpenCV的so库拷贝到工程下的libs目录下面,但是只对OPENCV_CAMERA_MODULES有效;
OPENCV_LIB_TYPE:链接库的方式,分为静态和动态两种,静态时为STATIC,动态时为SHARED,常用的是动态链接库的方式;
(注:以上三种方式都无需安装OpenCVManager,区别在于mk文件的不同。)
其他的参数意义:
LOCAL_MODULE:是生成的库的名称;
LOCAL_SRC_FILES:是jni文件夹下的.cpp文件。
2.修改【FdActivity.java】文件:
查看可以发现在此处,通过OpenCVLoader进行了OpenCV Manager的初始化和启动,这是剔除OpenCV Manager的关键所在,所以我们应该屏蔽OpenCVLoader.initAsync该行代码:
完成以上修改之后,我们删除手机设备中的OpenCV Manager.apk,然后在手机上运行修改后的程序,发现启动程序时不会再提示需要安装OpenCV Manager,至此我们成功将demo对OpenCV Manager API的依赖剔除掉。
有没有发现demo中人脸识别的准确度其实很低,并没有那么地精确。