opencv中mat对象

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 来实现文件

的保存, 保存图像的格式取决于文件路径为图像指定的扩展名类型。

你可能感兴趣的:(opencv,opencv,mat)