• 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);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    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,因此这是一个绿的发光的图像。如下所示👇
    在这里插入图片描述
    Scalar默认为(0,0,0),执行以下代码
    Mat mat = new Mat(30,30, CvType.CV_8UC3);
    得到一个黑的发白的图像如下所示👇
    在这里插入图片描述

    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的部分构造方法进行简要说明👇

    用法 说明
    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);
    
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    具体效果请自行验证,这里不贴效果了

    4.create()函数

    使用 Mat 类的 create()函数同样可以创建图像。如果 create()函数指定的参数与图像之前的参数相同,则内存地址不变,如果参数发生变化,则会重新申请内存。
    执行下方代码验证👇

            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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    执行结果:👇
    在这里插入图片描述
    使用 create()函数无法设置图像像素的初始值

    5.创建对象方法

    OpenCV中提供 zeros(),ones()和 eyes()方法,使用这些函数需要指定图像的大小和类型,使用方法如下👇
    示例

    执行代码结果
    Mat.eye(3, 3, CvType.CV_8UC1)[ 1, 0, 0;
    0, 1, 0;
    0, 0, 1]
    Mat.zeros(3, 3, CvType.CV_8UC1)[ 0, 0, 0;
    0, 0, 0;
    0, 0, 0]
    Mat.ones(3, 3, CvType.CV_8UC1)[ 1, 1, 1;
    1, 1, 1;
    1, 1, 1]

    参考

    openCV-java文档

  • 相关阅读:
    mysql忘记密码
    【C++】C/C++内存管理
    03-npm安装包详解,解决npm下载慢的问题,引入nrm等
    基于HASM模型的土壤高精度建模matlab仿真
    GBase 8c V3.0.0数据类型——几何类型转换函数
    openstack——2、搭建虚拟机(配置认证服务、镜像服务)
    (学习日记)2022.8.5
    SpringBoot底层原理----配置优先级/Bean管理/springboot原理
    【rust】rsut基础:模块的使用一、mod 关键字、mod.rs 文件的含义等
    安卓应用开发——Android Studio中关于使用Androidstudio的注意事项
  • 原文地址:https://blog.csdn.net/qq_27185879/article/details/126541303