好好学习,天天向上
android学习OpenCV首先接触的就是Mat对象,这节主要介绍Mat对象
Mat是OpenCV中用来存储图像信息的内存对象,可以理解为一个包含所有强度值的像素点矩阵,另外包含其他信息(宽,高,类型,纬度,大小,深度等)有点类似android中的Bitmap。
Mat对象的创建
直接读取图片:
Mat src = Imgcodecs.imread("img/tooth1.png");
复制Mat:
Mat src = img.clone();
或src1.copyTo(src);
使用create根据行和列初始化Mat:
Mat src = new Mat();
src.create(3,3, CvType.CV_8UC3);
src.create(new Size(3,3), CvType.CV_8UC3);
通过ones、eye、zeros创建
Mat src = Mat.eye(3,3,CVType.CV_8UC3);
Mat src = Mat.eye(new Size(3,3), CvType.CV_8UC3);
Mat src = Mat.eye(new Size(3,3), CvType.CV_8UC3);
Mat src = Mat.eye(new Size(3,3), CvType.CV_8UC3);
通过setTo方法实现初始化
Mat src = new Mat();
src.setTo(new Scalar(255,255,255));
Mat与Bitmap转换(注意图像对象通道)
Mat src = Imgcodecs.imread("img/tooth1.png");
int width = src.cols();
int hdight = src.rows();
Bitmap bm = Bitmap.createBitmap(width,height,Bitmap.config.ARGB_8888);
Mat dst = new Mat();
Imgproc.cvtColor(src,dst,Imgproc.COLOR_BGR2RGBA);
Utils.matToBitmap(dst,bm);
//还有与之对应的Utils.bitmapToMat方法
图像的基本信息
Android中选择一张图的时候,可以用如下代码
Mat src = Imgcodecs.imread(path);
这种方式默认的加载的三通道顺序为BGR(注意不是RGB)彩色图片
但是我们也可能加载其他类型,就需要通过参数来控制
Mat src = Imgcodecs.imread(path,Imgcodecs.IMREAD_COLOR);
Imgcodecs常用的三种
IMREAD_UNCHANGED = -1 不改变图像类型,可能包含透明通道
IMREAD_GRAYSCALE = 0 加载灰色图像
IMREAD_COLOR = 1 加载彩图图像
图像信息里重点关注 通道数 图像深度 图像类型
通道 常见的通道有1、3、4 其中4包含透明通道
图像深度 表示同个通道灰度值所占大小
图像类型 U、S、F 其中U表示无符号整形,S表示符号整形,F表示浮点数
如CV_8UC3,具体含义为“3通道8位无符号数”。 其中UC表示无符号char
另外还需要补充一些RGB、YUV和HSV颜色空间模型的知识
Mat对象的保存
创建好的Mat对象经过一系列的操作后就可以通过imwrite直接将对象保存为图像
Mat img = new Mat(500,500,CvType.CV_8UC3);
img.setTo(new Scalar(127,127,127));
saveImage(img);
其中500是宽高,最后一个参数type是表示 RGB彩色8位三通道
第二行代码是每个像素点每个通道灰度值为127
save方法的实现就是创建路径保存图像
File tempFile = new File(path,name);
Imgcodecs.imwrite(absolutePath,img);
Mat的销毁
Mat对象使用完必须销毁,否则将造成内存问题,销毁很简单
mat.release();