Android Studio使用OpenCV进行图像基本处理

1.环境配置

①进入OpenCV官网下载SDK包

进入官网(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开发提供参考

②导入模块到项目中

1.Android Studio 下载cmake和ndk

在这里插入图片描述

2.选择 File -> New ->Import Module

在这里插入图片描述

3.选择下载的SDK包中的sdk/java

在这里插入图片描述

4.点击Finish

在这里插入图片描述

5.修改导入OpenCV的build.gradle的对应的compileSdkVersion等信息

在这里插入图片描述

6.修改build.gradle将module改为以library形式存在

  • apply plugin: 'com.android.library’一定要改成library

  • 去掉applicationld “com.xx.xx”

7.加入依赖:设置module 的依赖 OpenCV lib

在这里插入图片描述
在这里插入图片描述
点击Apply

8.导入so库

在 app/src/main 目录下 创建一个jniLibs 目录,然后把sdk/native/libs 下所有文件 拷贝到jniLibs下

在这里插入图片描述

至此Android Studio下OpenCV环境配置完成


2.图像基本处理

1.灰度处理

将彩色图像转化为灰度图像

调用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();
}

效果展示:

在这里插入图片描述

2.腐蚀和膨胀

①腐蚀操作

腐蚀操作会去除图像中,多余的白色噪点,增强黑色的部分(增强识别)

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();
}

效果展示:

在这里插入图片描述

3.中值滤波

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();
}

效果展示:

在这里插入图片描述

4.高斯模糊

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();
}

效果展示:

在这里插入图片描述

5.Canny边缘检测

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

作者: 许潇
原文链接

Guess you like

Origin blog.csdn.net/fjnu_se/article/details/121880104