(OpenCV-Mat类)
Mat初识
mat类是一个图像类,也是一个矩阵类,用于创建和操作多维矩阵,为了方便看到效果,这里我们用HightGUI进行图像的显示。 这里大概说下数字图像,我们所看到的图像对计算机来说,只是一堆亮度各异的点。一副尺寸为X x Y的图像可以用X x Y的矩阵表示。矩阵的元素值表示这个位置上像素的亮度,一般来说像素值越大,该点越亮。
1.创建Mat类
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.highgui.HighGui;
/**
* @author lvyq
* @version 1.0
* @description: openCV之Mat演示
* @date 2022/8/26 13:17
*/
public class OpenCV_Mat {
public static void main(String[] args) {
String libraryPath= System.getProperty("user.dir")+"\\lib\\opencv_java460.dll";
System.load(libraryPath);
Mat mat = new Mat(30,30, CvType.CV_8UC3, new Scalar(0,255,0));
HighGui.imshow("mat",mat);
HighGui.waitKey(0);
}
}
2.Mat构造函数方法
Mat提供了一系列的构造方法,可以根据自己需要创建mat对象,例如上文中的
Mat mat = new Mat(30,30, CvType.CV_8UC3, new Scalar(0,255,0));
这行代码表示创建一个行数(高)为30,列数(宽)为30,图像元素是 8 位无符号整数类型,且有三个通道。图像的所有像素值被初始化为(0,255,0)。OpenCV 中默认的颜色顺序为 BGR,因此这是一个
==绿的发光==的图像
。如下所示:point_down:
Scalar默认为(0,0,0),执行以下代码
Mat mat = new Mat(30,30, CvType.CV_8UC3);
得到一个黑的发白的图像如下所示:point_down:
3.CvType
打开CvType类可以发现type类型有CV_8UC1,CV_16SC3 ,CV_32FC4等类型,其中8,16,32表示位,U表示无符号整数,S表示有符号整数,F表示浮点数,C表示通道,C1表示一个通道的图像,C3表示3个通道的图像。
如果需要更多的通道,可以采用CV_8UC(ch)
的方式,例如
CV_8UC(2)表示8位无符号整数2通道的图像
其它:
既然将到这里了,就说下四通道,通过源码可以发现存在4通道,在这里第四通道代表的透明度
4.构造函数方法
以下Mat的部分构造方法进行简要<font color =green>说明</font>:point_down:
类 | 用法 | 说明 |
---|---|---|
Mat | 一个通用的矩阵类,同时也是一个图像类,可以用来创建和操作多维矩阵 | |
Mat(int rows, int cols, int type) | 创建行数为 rows,列数为 cols,类型为 type 的图像 | |
Mat(int rows, int cols, int type, ByteBuffer data) | 创建行数为 rows,列数为 cols,类型为 type ,数据为data 的图像(不创建图像数据所需内存,而是直接使用 data 所指内存) | |
Mat(int rows, int cols, int type, ByteBuffer data, long step) | 创建行数为 rows,列数为 cols,类型为 type ,数据为data ,行步长为step的图像(不创建图像数据所需内存,而是直接使用 data 所指内存) | |
Mat(Size size, int type) | 创建大小为 size,类型为 type 的图像(size指定width和height) | |
Mat(int[] sizes, int type) | 创建宽x长y,类型为 type 的图像 (例:int[] sizes = {10,5},表示创建一个x为5y为10的图像) | |
Mat(int rows, int cols, int type, Scalar s) | 创建行数为 rows,列数为 col,类型为 type 的图像,并将所有元素初始化为值 s | |
Mat(Size size, int type, Scalar s) | 创建大小为 size,类型为 type 的图像,并将所有元素初始化为值s | |
Mat(int[] sizes, int type, Scalar s) | 创建宽x长y,类型为 type 的图像 ,并将所有元素初始化为值 s(例:int[] sizes = {10,5},表示创建一个x为5y为10的图像) | |
Mat(Mat m, Range rowRange, Range colRange) | 创建的新图像为 m 的一部分,具体的范围由 rowRange 和colRange 指定,此构造函数也不进行图像数据的复制操作,新图像与 m 共用图像数据 | |
Mat(Mat m, Range rowRange) | 创建的新图像为 m 的一部分,具体的范围由 rowRange定,此构造函数也不进行图像数据的复制操作,新图像与 m 共用图像数据 | |
Mat(Mat m, Rect roi) | 创建的新图像为 m 的一部分,具体的范围 roi 指定,此构造函数也不进行图像数据的复制操作,新图像与 m 共用图像数据 |
代码演示
以下对上文部分方法进行演示,因为需要搭配其它方法才能直观的感受到效果。这里了解下就行
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
/**
* @author lvyq
* @version 1.0
* @description: openCV之Mat演示
* @date 2022/8/26 13:17
*/
public class OpenCV_Mat {
public static void main(String[] args) {
String libraryPath= System.getProperty("user.dir")+"\\lib\\opencv_java460.dll";
System.load(libraryPath);
show3();
}
//Mat(Size size, int type) 演示
public static void show1(){
Size size =new Size(100,400);
Mat mat = new Mat(size, CvType.CV_8UC(3));
HighGui.imshow("mat",mat);
HighGui.waitKey(0);
}
//Mat(int rows, int cols, int type, Scalar s) 演示
public static void show2(){
Mat mat = new Mat(30,30, CvType.CV_8UC3,new Scalar(0,0,0));
HighGui.imshow("mat",mat);
HighGui.waitKey(0);
}
//Mat(Mat m, Rect roi) 演示
public static void show3(){
Mat mat1 = new Mat(300,300, CvType.CV_8UC(3),new Scalar(0,255,0));
Rect rect =new Rect(10,10,10,30);
Mat mat = new Mat(mat1,rect);
HighGui.imshow("mat",mat);
HighGui.waitKey(0);
}
}
具体效果请自行验证,这里不贴效果了
4.create()函数
使用 Mat 类的 create()函数同样可以创建图像。如果 create()函数指定的参数与图像之前的参数相同,则内存地址不变,如果参数发生变化,则会重新申请内存。 执行下方代码验证:point_down:
Mat mat = new Mat(30,30, CvType.CV_8UC3);
System.out.println("初始化>>"+mat);
mat.create(30,30,CvType.CV_8UC3);
System.out.println("图像大小不变>>"+mat);
mat.create(30,40,CvType.CV_8UC3);
System.out.println("图像大小改变>>"+mat);
HighGui.imshow("mat",mat);
HighGui.waitKey(0);
执行结果::point_down:
使用 create()函数无法设置图像像素的初始值
5.创建对象方法
OpenCV中提供 zeros(),ones()和 eyes()方法,使用这些函数需要指定图像的大小和类型,使用方法如下:point_down:
示例