1.1 Mat对象的概念
Mat是opencv中用来存储图像信息的内存对象,当通过Imgcodecs.imread()方法从文件读入图像文件是,IMread方法会返回Mat对象实例,或者通过Utils.bitmapToMat()方法有bitmap转换而来。
1.2 Mat读取图像基本信息
Mat对象除了存储图像的像素数据以外,还包括图像的其他属性,具体为宽、高、类型、维度、大小、深度等。具体获取API如下:
Mat src = Imgcodecs.imread(file.getPath());
int width = src.cols();//宽
int height = src.rows();//高
int dims = src.dims();//维度
int channels = src.channels();//通道数
int depth = src.depth();//深度
int type = src.type();//类型信息
Imgcodecs是OpenCV图像输入和输出模块 imread方法就输入图像的方法源码如下:
//javadoc: imread(filename)
public static Mat imread(String filename)
{
Mat retVal =new Mat(imread_1(filename));
return retVal;
}
imread_1(filename)则是一个native方法,暂时不做深究。
这里重点关注通道数、图像深度与图像类型、Op en C V 加载的Mat 类型图
像对象。
1.2.1 通道数
常见的通道数目有1 、3 , 4 ,分别对应于单通道、三通道、四通道,其中四通道
中通常会有透明通道的数据。
1.2.2 图像深度
图像深度表示每个通道灰度值所占的大小, 图像深度与类
型密切相关。Open CV 中常见的几种图像深度具体如下表所示。
图像深度Java 中对应的数据类型图像深度Java 中对应的数据类型
其中, U 表示无符号整型、S 表示符号整型、F 表示浮点数, 这些类型在CvType 中可以自己查看。
1.3 Mat对象的新建
创建Mat 对象的方法有很多种,其中最常见的有如下几种。
1 )通过create 方法实现Mat 对象的创建,相关的代码如下:
Mat ml = new Mat();
ml.create(new Size(3, 3), CvType.CV_ 8UC3);
Mat m2 = new Mat();
m2.create(3, 3, CvType.CV_8UC3); 图2 -2
上述代码表示创建两个Mat 对象ml 与m2 ,其中m l 与m2 的大小都是3 × 3 、类型是三通道8 位的无符号字符型。
2 )通过ones 、eye 、zeros 方法实现初始化创建,相关代码如下:
Mat m3 = Mat.eye(3, 3,CvType.CV 8UC3);
Mat m4 = Mat.eye(new Size(3, 3),CvType.CV 8UC3);
Mat m5 = Mat.zeros(new Size(3, 3) , CvType.CV 8UC3);
Mat m6 = Mat.ones(new Size(3, 3), CvType.CV_8UC3);
上述代码创建了m3 , m4 、m5 , m6 四个Mat 对象,基于这种初始化方式来得到Mat对象是OpenCV 借鉴了Matlab 中eye 、zeros 、ones 三个函数实现的。
3 )此外还可以先定义Mat ,然后通过setTo 的方法实现初始化,相关代码如下:
Mat m7 =new Mat(3, 3, CvType.CV 8UC3);
m7.setTo(new Scalar(255, 255, 255));
此方法与第一种方法有点类似,唯一不同的是,第一种方法通过create 初始化的时候并没有指定颜色值。在OpenCV 中,颜色向量通常用Scalar 表示, 这里Sca lar ( 255 ,255’ 255 )表示白色。
4 )通过Mat 的copyTo ()与clone 方法实现对象的创建, Mat 中的克隆与拷贝方法会复制一份完全相同的数据以创建一个新Mat 对,克隆相关代码如下:
Mat m8 =new Mat(500, 500, CvType.CV 8UC3);
m8.setTo(new Scalar(l27, 127, 127));
Mat cmat =image.clone();
拷贝的相关代码如下:
Mat m8 =new Mat(500, 500, CvType.CV 8UC3);
m8.setTo(new Scalar(l27, 127, 127));
Mat result = new Mat();
m8.copyTo(result);
1.4 Mat对象保存
创建好的Mat 对象经过一系列的操作之后,就可以通过OpenCV4Android 的imwrite函数直接将对象保存为图像,相关的演示代码如下:
// 创建Mat 对象并保存
Ma t image = new Mat(SOO, 500, CvType.CV_8UC3);
image.setTo(new Scalar(l27 , 127, 127));
ImageSelectUtils.sav eimage (image );
其中, 500 表示图像的宽度与高度,最后一个参数声明图像是RGB 彩色三通道图像、
每个通道都是8 位,第二行代码是指定图像的每个像素点、每个通道的灰度值为127 。
第三行代码是使用imwrite 将图像保存到手机中的指定目录下, save Image 方法的相关代
码如下:
File fileDir = new File(Environment.getExternalStor agePublicDirectory(
Env ironment.DIRECTORY P 工CTURES), “mybook”);
if ( ! fileDir. exists ( ) ) {
fileDir.mkdirs ();
String name= String. v alueOf(System.currentTimeMillis()) +" book.jpg”;
File tempFile =new File (file Dir.getAbsoluteFile()+File.separator, name);
Imgcodecs.imwrite (tempFile . getAbsolutePath(), image);
上面的前几行代码是创建目录与文件路径,最后一行代码通过imwrite 来实现文件
的保存, 保存图像的格式取决于文件路径为图像指定的扩展名类型。