进入官网(https://opencv.org/releases/)选择"Android"版本下载,我下载了3.4.16版本
解压后的文件目录:
sdk 目录提供了Android的API与Java 库
sdk/java 目录包含了一个 Eclipse 项目,该项目提供 OpenCV 的Java API,且可以导入到开发环境里。
sdk/native 目录包含了OpenCV C++ 头文件(用于JNI),与Android的 .so动态库 .a静态库。
sdk/etc 目录包含了Haar 与 LBP cascades 级联。
apk 目录包含了用户安装在指定的Android设备的安装文件,该文件使opencv 库可以管理opencv API(对应于各内核版本的OpenCV应用安装包)
samples :目录中存放着若干opencv应用例子,可为我们进行android下的opencv开发提供参考
apply plugin: 'com.android.library’一定要改成library
去掉applicationld “com.xx.xx”
在 app/src/main 目录下 创建一个jniLibs 目录,然后把sdk/native/libs 下所有文件 拷贝到jniLibs下
至此Android Studio下OpenCV环境配置完成
将彩色图像转化为灰度图像
调用cvtColor方法,参数选择cv2.COLOR_BGR2GRAY
private void Togray(){
//灰度处理
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.onetemp);
Mat src = new Mat();
Mat dst = new Mat();
Utils.bitmapToMat(bitmap,src);
Imgproc.cvtColor(src,dst,Imgproc.COLOR_BGR2GRAY);
Utils.matToBitmap(dst,bitmap);
iv.setImageBitmap(bitmap);
src.release();
dst.release();
}
效果展示:
腐蚀操作会去除图像中,多余的白色噪点,增强黑色的部分(增强识别)
OpenCV中提供给了erode()函数来完成腐蚀操作
private void Tocorrosion(){
//腐蚀
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.onetemp);
Mat src = new Mat();
Mat dst = new Mat();
Mat element = Imgproc.getStructuringElement(MORPH_RECT, new Size(10,10));;
Utils.bitmapToMat(bitmap,src);
// src:源图像
// dst:输出图像
// element:这是我们将用来执行操作的内核。如果我们不指定,默认是一个简单的3x3矩阵。否则,我们可以指定它的形状。为此,我们需要使用函数cv :: getStructuringElement:
Imgproc.erode(src, dst, element);
Utils.matToBitmap(dst,bitmap);
iv.setImageBitmap(bitmap);
src.release();
dst.release();
}
效果展示:
膨胀操作会把白色线条加粗,白色的线条勾勒的物体会变成白色一块区域(增强识别)
OpenCV中提供给了dilate()函数来完成膨胀操作
private void Todilate(){
//膨胀
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.onetemp);
// src:源图像
// dst:输出图像
// element:这是我们将用来执行操作的内核。如果我们不指定,默认是一个简单的3x3矩阵。否则,我们可以指定它的形状。为此,我们需要使用函数cv :: getStructuringElement:
Mat src = new Mat();
Mat dst = new Mat();
Mat element = Imgproc.getStructuringElement(MORPH_RECT, new Size(10,10));;
Utils.bitmapToMat(bitmap,src);
Imgproc.dilate(src, dst, element);
Utils.matToBitmap(dst,bitmap);
iv.setImageBitmap(bitmap);
src.release();
dst.release();
}
效果展示:
OpenCV中提供给了medianBlur()函数来完成中值滤波操作
private void TomedianBlur(){
//中值滤波
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.onetemp);
Mat src = new Mat();
Mat ret = new Mat();
Utils.bitmapToMat(bitmap, src);
// InputArray src: 输入图像,图像为1、3、4通道的图像,当模板尺寸为3或5时,图像深度只能为CV_8U、CV_16U、CV_32F中的一个,如而对于较大孔径尺寸的图片,图像深度只能是CV_8U。
// OutputArray dst: 输出图像,尺寸和类型与输入图像一致,可以使用Mat::Clone以原图像为模板来初始化输出图像dst
// int ksize: 滤波模板的尺寸大小,必须是大于1的奇数,如3、5、7……
Imgproc.medianBlur(src, ret, 77);
Utils.matToBitmap(ret, bitmap);
iv.setImageBitmap(bitmap);
src.release();
ret.release();
}
效果展示:
OpenCV中提供给了GaussianBlur()函数来完成高斯模糊操作
private void ToGaussian(){
//高斯模糊
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.onetemp);
Mat src = new Mat();
Mat ret = new Mat();
Utils.bitmapToMat(bitmap, src);
// src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
// dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
// ksize,高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数(并不能理解)。或者,它们可以是零的,它们都是由sigma计算而来。
// sigmaX,表示高斯核函数在X方向的的标准偏差。
// sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
Imgproc.GaussianBlur(src,ret,new Size(77,77),5, 5);
Utils.matToBitmap(ret, bitmap);
iv.setImageBitmap(bitmap);
src.release();
ret.release();
}
效果展示:
OpenCV中提供给了Canny()函数来完成图像边缘检测操作
private void CannyScan(){
//边缘检测
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.onetemp);
Mat src = new Mat();
Utils.bitmapToMat(bitmap, src);
Mat gray = new Mat();
Imgproc.cvtColor(src,gray,Imgproc.COLOR_BGR2GRAY);//灰度处理
Mat ret = src.clone();
// image 输入图像,必须是CV_8U的单通道或者三通道图像。
// edges 输出图像,与输入图像具有相同尺寸的单通道图像,且数据类型为CV_8U。
// threshold1 第一个滞后阈值。
// threshold2 第二个滞后阈值。
Imgproc.Canny(src, ret, 75, 200);
Utils.matToBitmap(ret, bitmap);
iv.setImageBitmap(bitmap);
src.release();
gray.release();
ret.release();
}
效果展示:
参考文档:
https://blog.csdn.net/weixin_43815930/article/details/90516455
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/tutorials.html