先说一下我所用的环境
开发工具:Android stuido
OpenCV版本:3.1
集成:
第一步:先下载OpenCV SDK,OpenCV SDK解压后的文件目录如下:
第二步:将OpenCV通过添加依赖的方式集成到项目
方法:File –> New –> Import Module 然后选择OpenCV目录下sdk中的java进行引入就行。
再将sdk目录下的Libs文件添加到工程(放到main目录下),并且将其重命名,命名为JniLibs
第三步:修改你引入的OpenCV中gradle的配置,要求和你的项目是一致的,具体修改位置如下:
修改完后记得跟新一下项目ReBuild Project(就是重构一下);
第四步:为你的手机或者模拟器安装OpenCV Manager
其实就是OpenCV SDK 解压目录下apk中的apk文件,如下:
将v7a的那个安装到手机上就好,如果在接下来图片处理的操作,或者是在你安装v7a这个apk是出错,那么请你换个apk进行安装具体那个能用因手机而异。
到这里OpenCV 集成到Android的操作已经完成,下面是对图片的一个简单处理(灰度化)。
使用:
第一步:
初始化加载OpenCV,代码如下:
@Override
protected void onResume() {
super.onResume();
//初始化OpenCV
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case BaseLoaderCallback.SUCCESS:
Log.i(TAG, "成功加载");
break;
default:
super.onManagerConnected(status);
Log.i(TAG, "加载失败");
break;
}
}
});
}
- 列表内容
初始化加载的中有三个参数,这里解释一下他们的含义
参数一:你所使用的OpenCV的版本号
参数二:上下文
参数三:加载操作的回调接口
补充:
在集成中的第四步,我们需要安装OpenCV Manager
这里介绍一个不需要安装OpenCV Manager就可使用OpenCV 的方法,方法也很简单,就是将上一步中的代码替换成以下代码就可了,如下:
//OpenCV库是否加载成功的回调接口
mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case BaseLoaderCallback.SUCCESS:
Log.i(TAG, "成功加载");
break;
default:
super.onManagerConnected(status);
Log.i(TAG, "加载失败");
break;
}
}
};
//这种写法可以免安装OpenCV Manager(这也是官方示例代码的写法)
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback);
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
这种写法我也是刚知道,在这里作为补充项介绍给大家。
第二步:
获取Bitmap对象,然后将其灰度化,代码如下:
/**
* 进行图片灰度化
*/
public void getGrayBitmap() {
Mat rgbMat = new Mat();
Mat grayMat = new Mat();
//从资源文件中获取图片
srcBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.bsl);
//获取一个空的Bitmap对象,用于接受接下来灰度化后的Bitmap
grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.RGB_565);
//对Bitmap进行转化,将其转换成mat
Utils.bitmapToMat(srcBitmap, rgbMat);
//对mat进行灰度化处理,灰度化后的mat为grayMat
Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);
//将灰度化后的mat转换为Bitmap
Utils.matToBitmap(grayMat, grayBitmap);
}
第三步:
对灰度化后的Bitmap做进一步的操作,比如让他显示在界面上,效果图如下:
大家不要被图片中tab栏中的其他描述所误导,我其实就只实现了一个灰度化而已,其他功能有待研究。