Android和Java通性之OpenCV(图像处理综合)
OpenCV大部分代码是用C写的,包括算法,只有部分是用Java写的,也是一个跨平台的计算机视觉库。
在这篇博客主要是看Java实现的那部分,如果要实现比较特殊的,或者自己实现算法,就得用JNI Java调用C来实现。
当然大部分Java实现的算法也是通过调用C实现的,但是大部分C没有做Java封装。
Android OpenCV项目结构:
以下是Android OpenCV图像处理和操作的综合代码:
原图:
/**
*ROI区域定义方法一:imageROI
*/
Rect rect = new Rect(30, 120, 340, 350); // 设置矩形ROI的位置
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(340, 350, Bitmap.Config.ARGB_8888);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Mat imgRectROI= new Mat(baseMat, rect);
Utils.matToBitmap(imgRectROI, processBitmap,true);
processView.setImageBitmap(processBitmap);
baseMat.release();
baseBitmap.recycle();
结果图:
/**
*ROI区域定义方法二:addWeighted
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Bitmap baseIcon= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(baseBitmap.getWidth(), baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Utils.bitmapToMat(baseIcon,processMat,true);
Mat myProcessMat =new Mat(baseBitmap.getWidth(), baseBitmap.getHeight(), CvType.CV_8UC4);
System.out.println("图片融合开始!");
//图片融合
if (baseMat.rows() == processMat.rows() && baseMat.cols() == processMat.cols() && baseMat.type() == processMat.type()) {
Core.addWeighted(baseMat, 0.3, processMat, 0.3, 0, myProcessMat);
System.out.println("图片融合成功!");
}
Utils.matToBitmap(myProcessMat, processBitmap,true);
processView1.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
myProcessMat.release();
baseBitmap.recycle();
baseIcon.recycle();
结果图:
/**
* 分离通道
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
List<Mat> mymv = new ArrayList<Mat>();
Core.split(baseMat,mymv);
//for(int i=0;i<mymv.size();i++){
processMat=mymv.get(0);
// }
Utils.matToBitmap(processMat, processBitmap,true);
processView2.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
结果图:
/**
* 合并split()方法分离出来的通道
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
List<Mat> mv = new ArrayList<Mat>();
Core.split(baseMat,mv);
Core.merge(mv, processMat);// 合并split()方法分离出来的彩色通道数据
Utils.matToBitmap(processMat, processBitmap,true);
processView3.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
结果图:
/**
* 灰度处理
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Imgproc.cvtColor(baseMat, processMat,Imgproc.COLOR_BGR2RGB,4);
Utils.matToBitmap(processMat, processBitmap,true);
processView4.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
结果图:
/**
*均值滤波
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Imgproc.blur(baseMat, processMat, new Size(15, 15), new Point(-1, -1), Core.BORDER_DEFAULT);
Utils.matToBitmap(processMat, processBitmap,true);
processView5.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
结果图:
/**
*方框滤波
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Imgproc.boxFilter(baseMat, processMat,-1, new Size(15, 15), new Point(-1, -1));
Utils.matToBitmap(processMat, processBitmap,true);
processView6.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
结果图:
/**
*高斯滤波
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Imgproc.GaussianBlur(baseMat, processMat, new Size(15, 15),0,0);
Utils.matToBitmap(processMat, processBitmap,true);
processView7.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
结果图:
/**
*中值滤波
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Imgproc.medianBlur(baseMat, processMat,3);
Utils.matToBitmap(processMat, processBitmap,true);
processView8.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
结果图:
/**
*双边滤波
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Imgproc.cvtColor(baseMat,baseMat,Imgproc.COLOR_BGR2RGB);
Imgproc.bilateralFilter(baseMat, processMat,25, 25 * 2, 25 / 2);
Utils.matToBitmap(processMat, processBitmap,true);
processView9.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
结果图:
/**
*腐蚀
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
//设置内核形状和内核大小
kernel=Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT,new Size(11,11),new Point(5,5));
Imgproc.erode(baseMat,processMat,kernel);
Utils.matToBitmap(processMat, processBitmap,true);
processView10.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
kernel.release();
结果图:
/**
*膨胀
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
//设置内核形状和内核大小
kernel=Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT,new Size(11,11),new Point(5,5));
Imgproc.dilate(baseMat,processMat,kernel);
Utils.matToBitmap(processMat, processBitmap,true);
processView11.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
kernel.release();
结果图:
/**
* 开运算
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
//设置内核形状和内核大小
kernel=Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT,new Size(11,11),new Point(5,5));
Imgproc.morphologyEx(baseMat,processMat,Imgproc.MORPH_OPEN,kernel);
Utils.matToBitmap(processMat, processBitmap,true);
processView12.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
kernel.release();
结果图:
/**
* 闭运算
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
//设置内核形状和内核大小
kernel=Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT,new Size(11,11),new Point(5,5));
Imgproc.morphologyEx(baseMat,processMat,Imgproc.MORPH_CLOSE,kernel);
Utils.matToBitmap(processMat, processBitmap,true);
processView13.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
kernel.release();
结果图:
/**
* 形象学梯度
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.RGB_565);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
//设置内核形状和内核大小
kernel=Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT,new Size(11,11),new Point(5,5));
Imgproc.morphologyEx(baseMat,processMat,Imgproc.MORPH_GRADIENT,kernel);
Utils.matToBitmap(processMat, processBitmap,true);
processView14.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
kernel.release();
结果图:
/**
* 顶帽
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.RGB_565);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
//设置内核形状和内核大小
kernel=Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT,new Size(11,11),new Point(5,5));
Imgproc.morphologyEx(baseMat,processMat,Imgproc.MORPH_TOPHAT,kernel);
Utils.matToBitmap(processMat, processBitmap,true);
processView15.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
kernel.release();
结果图:
/**
* 黑帽
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.RGB_565);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
//设置内核形状和内核大小
kernel=Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT,new Size(11,11),new Point(5,5));
Imgproc.morphologyEx(baseMat,processMat,Imgproc.MORPH_BLACKHAT,kernel);
Utils.matToBitmap(processMat, processBitmap,true);
processView16.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
kernel.release();
结果图:
/**
* Canny边缘检测
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Imgproc.Canny(baseMat,processMat,150,250);
Utils.matToBitmap(processMat, processBitmap,true);
processView17.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
结果图:
/**
* Sobel边缘检测
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.RGB_565);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Mat grad_x=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Mat grad_y=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Mat abs_grad_x=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Mat abs_grad_y=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Imgproc.Sobel(baseMat,grad_x,CvType.CV_16S, 1, 0, 0);
Core.convertScaleAbs(grad_x, abs_grad_x);
Imgproc.Sobel(baseMat,grad_y,CvType.CV_16S, 0, 1, 0);
Core.convertScaleAbs(grad_y, abs_grad_y);
Core.addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, processMat );
Utils.matToBitmap(processMat, processBitmap,true);
processView18.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
grad_x.release();
grad_y.release();
abs_grad_x.release();
abs_grad_y.release();
结果图:
/**
* Scharr边缘检测
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.RGB_565);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Mat grad_x1=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Mat grad_y1=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Mat abs_grad_x1=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Mat abs_grad_y1=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Imgproc.Scharr(baseMat,grad_x1,CvType.CV_16S, 1, 0, 0);
Core.convertScaleAbs(grad_x1, abs_grad_x1);
Imgproc.Scharr(baseMat,grad_y1,CvType.CV_16S, 0, 1, 0);
Core.convertScaleAbs(grad_y1, abs_grad_y1);
Core.addWeighted( abs_grad_x1, 0.5, abs_grad_y1, 0.5, 0, processMat );
Utils.matToBitmap(abs_grad_y1, processBitmap,true);
processView19.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
grad_x1.release();
grad_y1.release();
abs_grad_x1.release();
abs_grad_y1.release();
结果图:
/**
* Laplace边缘检测
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.RGB_565);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Mat laplacianmat=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Imgproc.Laplacian(baseMat,laplacianmat,CvType.CV_16S, 3, 1, 0);
Core.convertScaleAbs(laplacianmat, processMat);
Utils.matToBitmap(processMat, processBitmap,true);
processView20.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
结果图:
以下是类的完整代码,导入项目中可以直接运行:
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.imgproc.Imgproc;
import java.util.ArrayList;
import java.util.List;
public class BaseImageProcessActivity extends AppCompatActivity {
private ImageView baseprocessView=null;
private ImageView processView =null;
private ImageView processView1=null;
private ImageView processView2 =null;
private ImageView processView3 =null;
private ImageView processView4=null;
private ImageView processView5=null;
private ImageView processView6 =null;
private ImageView processView7 =null;
private ImageView processView8 =null;
private ImageView processView9 =null;
private ImageView processView10 =null;
private ImageView processView11 =null;
private ImageView processView12 =null;
private ImageView processView13 =null;
private ImageView processView14 =null;
private ImageView processView15 =null;
private ImageView processView16 =null;
private ImageView processView17 =null;
private ImageView processView18 =null;
private ImageView processView19 =null;
private ImageView processView20 =null;
Bitmap baseBitmap=null;
Mat baseMat=null;
Bitmap processBitmap =null;
Mat processMat =null;
Mat kernel=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.base_image_process);
baseprocessView=(ImageView)findViewById(R.id.baseprocessView);
processView =(ImageView)findViewById(R.id.processView);
processView1=(ImageView)findViewById(R.id.processView1);
processView2 =(ImageView)findViewById(R.id.processView2);
processView3 =(ImageView)findViewById(R.id.processView3);
processView4=(ImageView)findViewById(R.id.processView4);
processView5=(ImageView)findViewById(R.id.processView5);
processView6 =(ImageView)findViewById(R.id.processView6);
processView7 =(ImageView)findViewById(R.id.processView7);
processView8 =(ImageView)findViewById(R.id.processView8);
processView9 =(ImageView)findViewById(R.id.processView9);
processView10 =(ImageView)findViewById(R.id.processView10);
processView11 =(ImageView)findViewById(R.id.processView11);
processView12 =(ImageView)findViewById(R.id.processView12);
processView13 =(ImageView)findViewById(R.id.processView13);
processView14 =(ImageView)findViewById(R.id.processView14);
processView15 =(ImageView)findViewById(R.id.processView15);
processView16 =(ImageView)findViewById(R.id.processView16);
processView17 =(ImageView)findViewById(R.id.processView17);
processView18 =(ImageView)findViewById(R.id.processView18);
processView19 =(ImageView)findViewById(R.id.processView19);
processView20 =(ImageView)findViewById(R.id.processView20);
/**
* 原图
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseprocessView.setImageBitmap(baseBitmap);
/**
*ROI区域定义方法一:imageROI
*/
Rect rect = new Rect(30, 120, 340, 350); // 设置矩形ROI的位置
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(340, 350, Bitmap.Config.ARGB_8888);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Mat imgRectROI= new Mat(baseMat, rect);
Utils.matToBitmap(imgRectROI, processBitmap,true);
processView.setImageBitmap(processBitmap);
baseMat.release();
baseBitmap.recycle();
/**
*ROI区域定义方法二:addWeighted
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Bitmap baseIcon= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(baseBitmap.getWidth(), baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Utils.bitmapToMat(baseIcon,processMat,true);
Mat myProcessMat =new Mat(baseBitmap.getWidth(), baseBitmap.getHeight(), CvType.CV_8UC4);
System.out.println("图片融合开始!");
//图片融合
if (baseMat.rows() == processMat.rows() && baseMat.cols() == processMat.cols() && baseMat.type() == processMat.type()) {
Core.addWeighted(baseMat, 0.3, processMat, 0.3, 0, myProcessMat);
System.out.println("图片融合成功!");
}
Utils.matToBitmap(myProcessMat, processBitmap,true);
processView1.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
myProcessMat.release();
baseBitmap.recycle();
baseIcon.recycle();
/**
* 分离通道
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
List<Mat> mymv = new ArrayList<Mat>();
Core.split(baseMat,mymv);
//for(int i=0;i<mymv.size();i++){
processMat=mymv.get(0);
// }
Utils.matToBitmap(processMat, processBitmap,true);
processView2.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
/**
* 合并split()方法分离出来的通道
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
List<Mat> mv = new ArrayList<Mat>();
Core.split(baseMat,mv);
Core.merge(mv, processMat);// 合并split()方法分离出来的彩色通道数据
Utils.matToBitmap(processMat, processBitmap,true);
processView3.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
/**
* 灰度处理
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Imgproc.cvtColor(baseMat, processMat,Imgproc.COLOR_BGR2RGB,4);
Utils.matToBitmap(processMat, processBitmap,true);
processView4.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
/**
*均值滤波
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Imgproc.blur(baseMat, processMat, new Size(15, 15), new Point(-1, -1), Core.BORDER_DEFAULT);
Utils.matToBitmap(processMat, processBitmap,true);
processView5.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
/**
*方框滤波
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Imgproc.boxFilter(baseMat, processMat,-1, new Size(15, 15), new Point(-1, -1));
Utils.matToBitmap(processMat, processBitmap,true);
processView6.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
/**
*高斯滤波
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Imgproc.GaussianBlur(baseMat, processMat, new Size(15, 15),0,0);
Utils.matToBitmap(processMat, processBitmap,true);
processView7.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
/**
*中值滤波
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Imgproc.medianBlur(baseMat, processMat,3);
Utils.matToBitmap(processMat, processBitmap,true);
processView8.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
/**
*双边滤波
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Imgproc.cvtColor(baseMat,baseMat,Imgproc.COLOR_BGR2RGB);
Imgproc.bilateralFilter(baseMat, processMat,25, 25 * 2, 25 / 2);
Utils.matToBitmap(processMat, processBitmap,true);
processView9.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
/**
*腐蚀
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
//设置内核形状和内核大小
kernel=Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT,new Size(11,11),new Point(5,5));
Imgproc.erode(baseMat,processMat,kernel);
Utils.matToBitmap(processMat, processBitmap,true);
processView10.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
kernel.release();
/**
*膨胀
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
//设置内核形状和内核大小
kernel=Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT,new Size(11,11),new Point(5,5));
Imgproc.dilate(baseMat,processMat,kernel);
Utils.matToBitmap(processMat, processBitmap,true);
processView11.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
kernel.release();
/**
* 开运算
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
//设置内核形状和内核大小
kernel=Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT,new Size(11,11),new Point(5,5));
Imgproc.morphologyEx(baseMat,processMat,Imgproc.MORPH_OPEN,kernel);
Utils.matToBitmap(processMat, processBitmap,true);
processView12.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
kernel.release();
/**
* 闭运算
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
//设置内核形状和内核大小
kernel=Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT,new Size(11,11),new Point(5,5));
Imgproc.morphologyEx(baseMat,processMat,Imgproc.MORPH_CLOSE,kernel);
Utils.matToBitmap(processMat, processBitmap,true);
processView13.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
kernel.release();
/**
* 形象学梯度
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.RGB_565);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
//设置内核形状和内核大小
kernel=Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT,new Size(11,11),new Point(5,5));
Imgproc.morphologyEx(baseMat,processMat,Imgproc.MORPH_GRADIENT,kernel);
Utils.matToBitmap(processMat, processBitmap,true);
processView14.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
kernel.release();
/**
* 顶帽
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.RGB_565);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
//设置内核形状和内核大小
kernel=Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT,new Size(11,11),new Point(5,5));
Imgproc.morphologyEx(baseMat,processMat,Imgproc.MORPH_TOPHAT,kernel);
Utils.matToBitmap(processMat, processBitmap,true);
processView15.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
kernel.release();
/**
* 黑帽
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.RGB_565);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
//设置内核形状和内核大小
kernel=Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT,new Size(11,11),new Point(5,5));
Imgproc.morphologyEx(baseMat,processMat,Imgproc.MORPH_BLACKHAT,kernel);
Utils.matToBitmap(processMat, processBitmap,true);
processView16.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
kernel.release();
/**
* Canny边缘检测
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.ARGB_8888);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Imgproc.Canny(baseMat,processMat,150,250);
Utils.matToBitmap(processMat, processBitmap,true);
processView17.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
/**
* Sobel边缘检测
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.RGB_565);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Mat grad_x=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Mat grad_y=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Mat abs_grad_x=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Mat abs_grad_y=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Imgproc.Sobel(baseMat,grad_x,CvType.CV_16S, 1, 0, 0);
Core.convertScaleAbs(grad_x, abs_grad_x);
Imgproc.Sobel(baseMat,grad_y,CvType.CV_16S, 0, 1, 0);
Core.convertScaleAbs(grad_y, abs_grad_y);
Core.addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, processMat );
//Imgproc.Canny(baseMat,processMat,150,250);
Utils.matToBitmap(processMat, processBitmap,true);
processView18.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
grad_x.release();
grad_y.release();
abs_grad_x.release();
abs_grad_y.release();
/**
* Scharr边缘检测
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.RGB_565);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Mat grad_x1=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Mat grad_y1=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Mat abs_grad_x1=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Mat abs_grad_y1=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Imgproc.Scharr(baseMat,grad_x1,CvType.CV_16S, 1, 0, 0);
Core.convertScaleAbs(grad_x1, abs_grad_x1);
Imgproc.Scharr(baseMat,grad_y1,CvType.CV_16S, 0, 1, 0);
Core.convertScaleAbs(grad_y1, abs_grad_y1);
Core.addWeighted( abs_grad_x1, 0.5, abs_grad_y1, 0.5, 0, processMat );
Utils.matToBitmap(abs_grad_y1, processBitmap,true);
processView19.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
grad_x1.release();
grad_y1.release();
abs_grad_x1.release();
abs_grad_y1.release();
/**
* Laplace边缘检测
*/
baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC4);
processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.RGB_565);
processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC4);
Utils.bitmapToMat(baseBitmap,baseMat,true);
Mat laplacianmat=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC1|CvType.CV_8UC3|CvType.CV_8UC4);
Imgproc.Laplacian(baseMat,laplacianmat,CvType.CV_16S, 3, 1, 0);
Core.convertScaleAbs(laplacianmat, processMat);
Utils.matToBitmap(processMat, processBitmap,true);
processView20.setImageBitmap(processBitmap);
baseMat.release();
processMat.release();
baseBitmap.recycle();
}
}
base_image_process.xml的代码:
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/baseprocessView" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/baseprocessView" android:layout_centerHorizontal="true" android:text="【原图】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView" android:layout_centerHorizontal="true" android:text="【图像处理:imageROI】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView1" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView1" android:layout_centerHorizontal="true" android:text="【图像处理:addWeighted】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView2" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView2" android:layout_centerHorizontal="true" android:text="【图像处理:分离通道】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView3" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView3" android:layout_centerHorizontal="true" android:text="【图像处理:合并通道】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView4" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView4" android:layout_centerHorizontal="true" android:text="【图像处理:灰度处理】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView5" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView5" android:layout_centerHorizontal="true" android:text="【图像处理:均值滤波】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView6" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView6" android:layout_centerHorizontal="true" android:text="【图像处理:方框滤波】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView7" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView7" android:layout_centerHorizontal="true" android:text="【图像处理:高斯滤波】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView8" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView8" android:layout_centerHorizontal="true" android:text="【图像处理:中值滤波】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView9" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView9" android:layout_centerHorizontal="true" android:text="【图像处理:双边滤波】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView10" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView10" android:layout_centerHorizontal="true" android:text="【图像处理:腐蚀】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView11" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView11" android:layout_centerHorizontal="true" android:text="【图像处理:膨胀】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView12" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView12" android:layout_centerHorizontal="true" android:text="【图像处理:开运算】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView13" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView13" android:layout_centerHorizontal="true" android:text="【图像处理:闭运算】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView14" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView14" android:layout_centerHorizontal="true" android:text="【图像处理:形象学梯度】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView15" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView15" android:layout_centerHorizontal="true" android:text="【图像处理:顶帽】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView16" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView16" android:layout_centerHorizontal="true" android:text="【图像处理:黑帽】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView17" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView17" android:layout_centerHorizontal="true" android:text="【图像处理:Canny边缘检测】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView18" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView18" android:layout_centerHorizontal="true" android:text="【图像处理:Sobel边缘检测】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView19" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView19" android:layout_centerHorizontal="true" android:text="【图像处理:Scharr边缘检测】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:paddingTop="20dp" > <ImageView android:id="@+id/processView20" android:layout_width="match_parent" android:layout_height="wrap_content" ></ImageView> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/processView20" android:layout_centerHorizontal="true" android:text="【图像处理:Laplace边缘检测】" android:textSize="20sp" android:textColor="@android:color/holo_red_dark" /> </RelativeLayout> </LinearLayout> </ScrollView>