什么是Mat
Mat是opencv中用来存储图片信息的内存对象。简单的说Mat就是一个矩阵,矩阵的行列体现图像的像素,矩阵中元素存放对应像素点数据。Mat和矩阵区别在于,矩阵元素是一个数,Mat元素是一个数组,数组中元素个数也就是图像的通道数(彩色图片通常是三通道或者四通道,灰度图片通常是一通道)。
常用的Mat API
导入一张图片
Mat src = Imgcodecs.imread(路径);
Mat src = Imgcodecs.imread(路径,图片类型);
图片类型(例子Imgcodecs.IMREAD_GRAYSCALE 加载图像为灰度图像)
图片属性
int width = src.cols();//宽
int height = src.rows();//高
int dims = src.dims();//维度,如 3 * 4 的矩阵为 2 维, 3 *4 * 5 的为3维
int channels = src.channels();//通道数
int depth = src.depth();//深度
int type = src.type();//类型
src为存放图片的Mat
创建Mat
Mat src= new Mat(new Size(3, 3),
CvType.CV_8SC1);//创建一个3*3有符号整型一通道Mat
byte[] data = {-1,-2,-1,0,0,0,1,2,1};//定义数据
src.put(0,0, data);//把数据填入Mat中
这里其实就是创建了一个Sobel算子。
当天创建Mat方法还有很多,需要大家自己去尝试对比。
Mat m1 = Mat.eye(行,列,类型);//创建一个对角矩阵
Mat m2 = Mat.zeros(行,列,类型);//创建一个全零矩阵
Mat m3 = Mat.ones(行,列,类型);//创建一个第一通道全一矩阵其他通道全零
//等
Mat拷贝与克隆
Mat m4 = new Mat(100,100,CvType.CV_8UC3);
m4.setTo(new Scalar(127,127,127));
Mat m5 = new Mat();
m4.copyTo(m5);
Mat m4 = new Mat(100,100,CvType.CV_8UC3);
m4.setTo(new Scalar(127,127,127));
Mat m5 = m4.clone();
Mat保存
//创建一张图片
Mat image = new Mat(100,100,CvType.CV_8UC3);
image.setTo(new Scalar(127,127,127));
//保存
File fileDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"image");
if(!fileDir.exists()){
fileDir.mkdirs();
}//设置存储的文件夹名字
File tempFile = new File(fileDir.getAbsoluteFile()+File.separator,"image1.jpg");//设置文件名字
Imgcodecs.imwrite(tempFile.getAbsolutePath(),image);//保存
注意图片读写需要添加权限
在AndroidManifest.xml中的manifest中添加
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>