ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java OpenCV之Mat类的概述、常用构造方法、常用函数

2021-12-25 17:35:08  阅读:245  来源: 互联网

标签:src 常用 Java Mat 构造方法 int System CV mat


Java OpenCV之Mat类

概述

       Mat对象是一个用于OpenCV中用于存储图像的数据结构自动分配内存,即根据所读入的图片为其分配相应大小的内存空间,不存在内存泄露问题,是面向对象的数据结构。它分为头部数据部分
使用Mat存储这样一张图片
在这里插入图片描述
代码

public class DemoMat {
    static{
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
    public static void main(String[] args) {
        Mat src= Imgcodecs.imread("aa.jpg");//使用Imgcodecs类的imread读取一张图片
        System.out.println(src);//打印src的头部信息
    }
}

我们直接输出Mat的一个实例,可以看到如下信息。
在这里插入图片描述

头部信息

400×266×CV_8UC3:400像素×266像素×数据类型

isCont:是否联系存储

isSubmat:是否为子矩阵

nativeObj:本地对象地址

dataAddr:存储的图片的地址

数据类型

       上面的CV_8UC3,下划线后的数字表示位数、数字后的第一个符号表示用于储存像素的类型、后面的符号表示通道数。

U:unsigned int ,无符号整型

S:signed int ,有符号整型

F:float,单精度浮点型,float类型本身即有符号

Cx:图像的通道数

各种数据类型所对应的整数
在这里插入图片描述

数据部分

       dataAddr所指向的内存空间即为数据部分,也就是图片所存储的地方。

数据部分一个多维矩阵。
代码

public class DemoMat {
    static{
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
    public static void main(String[] args) {
        Mat src= Imgcodecs.imread("aa.jpg");//读取图片
        byte [] b= new byte[3];//定义存放通道元素的数组(本例采用三通道)
        for (int i=0;i<src.rows();i++){//遍历行、列
            for (int j=0;j<src.cols();j++){
                src.get(i,j,b);//获取每个运算,并存储在b数组中
                System.out.print(Arrays.toString(b));
            }
            System.out.println();
        }java
    }
}

执行结果
在这里插入图片描述
含义

       上面的输出结果是一个三维数组,可以看成一个二维数组的元素是一个维数组,而二维数组的行和列的个数就代表图片的大小(以像素为单位),而其元素一位数组代表所使用的数据类型,如上数据类型为三通道。通道的存储顺序为B、G、R。
       下图代表二维数组的元素一维数组。OpenCV中通道存储是按照B、G、R的顺序存储的。
在这里插入图片描述
下图表示一个张图片的存储结构。
在这里插入图片描述

Mat对象的构造方法

Mat()

创建一个空的mat实例。
代码

Mat mat = new Mat();
System.out.println(mat);

执行结果
在这里插入图片描述

Mat(long addr)

传入地址后复制一个Mat实例。
代码

        Mat src= Imgcodecs.imread("aa.jpg");
        System.out.println(src);
        Mat mat = new Mat(src.nativeObj);//传入地址
        System.out.println(mat);
        System.out.println(mat==src);

执行结果
在这里插入图片描述

Mat(int row,int cols,int type)

传入行、列以及数据类型进行实例化。
代码

//Mat mat=new Mat(5,5,16);
Mat mat=new Mat(5,5, CvType.CV_8UC3);//5行5列CV_8UC3类型
System.out.println(mat);

执行结果
在这里插入图片描述

Mat(Size size,int type)

将构造函数Mat(int row,int cols,int type)中的行和列用Size对象所替代了。
代码

Mat mat=new Mat(new Size(5,5),CvType.CV_8UC3);
System.out.println(mat);

执行结果
在这里插入图片描述

Mat(int rows,int cols,int type,Scalar s)

rows:行

cols:列

type:数据类型

s:颜色
代码

Mat mat=new Mat(50,50,CvType.CV_8UC3,new Scalar(0,0,255));
HighGui.imshow("标题",mat);
HighGui.waitKey(0);

执行结果
在这里插入图片描述

Mat(Size size,int type,Scalar s)

将构造函数Mat(int rows,int cols,int type,Scalar s)的行和列用Size对象代替。

Mat对象常用方法

int depth()

返回通道的数据类型,即返回,CV_8UC3中下划线的前3位。
对应整型。

CV_8U = 0,
CV_8S = 1,
CV_16U = 2,
CV_16S = 3,
CV_32S = 4,
CV_32F = 5,
CV_64F = 6,
CV_16F = 7;

代码

Mat mat01=new Mat(5,5,CvType.CV_8UC3);
Mat mat02=new Mat(5,5,CvType.CV_16U);
System.out.println("CV_8U:"+mat01.depth()+"\n"+"CV_16U:"+mat02.depth());

执行结果
在这里插入图片描述

void copyTo(Mat mat)

复制自己到mat。
代码

Mat src= Imgcodecs.imread("aa.jpg");
Mat s=new Mat();
src.copyTo(s);//复制到s
System.out.println(src);
System.out.println(s);
System.out.println(s==src);//用于验证是否相等

执行结果
在这里插入图片描述

void convertTo(Mat dst,int type)

dst:复制到的Mat实例
type:数据类型
convertTo:可以改变Mat的深度,例如可以把Mat的type从CV_8UC3改为CV_16SC3

convertTo:不可以改变Mat的通道数,例如不可以把Mat的type从CV_8UC3改为CV_8UC1,即使你填入的转换类型通道数不同,输出的通道数还是与输入的通道数相同
代码

Mat src= Imgcodecs.imread("aa.jpg");
Mat mat=new Mat();
src.convertTo(mat,CvType.CV_8U);//不可转换
System.out.println(src);
System.out.println(mat);
src.convertTo(mat,CvType.CV_16FC3);//可转换
System.out.println(src);
System.out.println(mat);

执行结果
在这里插入图片描述

Mat clone()

返回一个复制的Mat对象。

代码

Mat src= Imgcodecs.imread("aa.jpg");
  Mat mat=new Mat();
  mat=src.clone();
System.out.println(src);
System.out.println(mat);

执行结果
在这里插入图片描述

void create(xxx)

在这里插入图片描述
create对象可改变图像的大小、类型,作用于调用此函数的实例。
代码

Mat src= Imgcodecs.imread("aa.jpg");
src.create(400,400,CvType.CV_8U);
HighGui.imshow("标题",src);//使用HighGui类的imshow()方法展示图片
HighGui.waitKey(0);

原图
在这里插入图片描述
执行结果
在这里插入图片描述

int channels()、int rows()、int cols()

获取图像的

channels():通道数

rows():行数

cols():列数
代码

Mat src= Imgcodecs.imread("aa.jpg");
System.out.println("行:"+src.rows()+"\n"+"列:"+src.cols()+"\n"+"通道数:"+src.channels());

执行结果
在这里插入图片描述

标签:src,常用,Java,Mat,构造方法,int,System,CV,mat
来源: https://blog.csdn.net/baiqi123456/article/details/122145485

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有