(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: 示例 image.png

参考

openCV-java文档