Java OpenCV之Mat类的概述、常用构造方法、常用函数
2021/12/25 17:37:26
本文主要是介绍Java OpenCV之Mat类的概述、常用构造方法、常用函数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Java OpenCV之Mat类
- 概述
- 头部信息
- 数据类型
- 数据部分
- Mat对象的构造方法
- Mat()
- Mat(long addr)
- Mat(int row,int cols,int type)
- Mat(Size size,int type)
- Mat(int rows,int cols,int type,Scalar s)
- Mat(Size size,int type,Scalar s)
- Mat对象常用方法
- int depth()
- void copyTo(Mat mat)
- void convertTo(Mat dst,int type)
- Mat clone()
- void create(xxx)
- int channels()、int rows()、int cols()
概述
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());
执行结果
这篇关于Java OpenCV之Mat类的概述、常用构造方法、常用函数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-05小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南