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类的概述、常用构造方法、常用函数相关推荐

  1. java integer 包_java之学习基本类型包装类的概述及Integer类的概述和构造方法

    基本类型包装类的概述 A:为什么会有基本类型包装类 * 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据. * B:常用操作 * 常用的操作之一:用于基本数据类型与字符串之间 ...

  2. 在ROS下利用OpenCV的Mat类,将激光点云展开为深度图像(从零开始,超详细)

    激光雷达3D目标检测任务需要将地面滤除,滤除地面的方法多种多样:基于深度学习.基于栅格.基于平面拟合.基于条件随机场.基于深度图像等等.关于将点云转化为深度图像,PCL库中有相关函数,但使用起来有一定 ...

  3. OpenCV 之 Mat 类

    数字图像可看作一个数值矩阵, 其中的每个元素代表一个像素点,如下图所示: OpenCV 中,用 Mat 来表示该数值矩阵,它是很关键的一种数据结构,因为 OpenCV 中的大部分函数都和 Mat 有关 ...

  4. 计算机视觉之OpenCV教程 ---Mat类基础(一)

    机器视觉之OpenCV教程图像容器Mat类基础一(一) 零.OpenCV概述 基本上在机器识别的领域 ,都有OpenCV的身影 . OpenCV中基本上包含了所有的机器视觉所用到的算法 , 即使没有也 ...

  5. java api 第一个类是_JAVA之Object常用API

    [Object类.常用API] 主要内容Object类 Date类 DateFormat类 Calendar类 System类 StringBuilder类 包装类 第一章 Object类 1.1 概 ...

  6. Opencv中Mat类详细解读(学习笔记)

    基于windows10.vs2015.OpenCv4.1.0. 目录 1.Mat类简介 2.Mat类的构造与赋值 2.1.Mat类的构造 2.2.Mat类的赋值 3.Mat类支持的运算 3.1Mat类 ...

  7. c++ python opencv_ubuntu下C++与Python混编,opencv中mat类转换

    C++ 与 Python 混编 因为赶项目进度,需要使用到深度学习的内容,不过现有的深度学习框架大多使用python代码,对于不会改写C++的朋友来说,需要耗费大量的时间去改写,因此,使用python ...

  8. C++ OpenCV的Mat类

    在C++的编程体系下,Mat类在OpenCV中是最重要的一种图像表示形式(即为Matrix).这里的Mat 可以指定存储的数据类型.行列数,以及每个元素中的数值个数(通道数)等等. Mat 类的数据分 ...

  9. OpenCV中Mat类的重载运算符operator()的用法

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 定义如下: inline Mat Mat::op ...

最新文章

  1. 简明天线理论与设计应用_天线理论与设计笔记5--(宽带天线、口径天线)
  2. 利用目录服务器实现单点登录
  3. allure 测试报告本地打开_Allure--自动化测试报告生成
  4. hdu2973 YAPTCHA
  5. 【arduino】继续蜂鸣器音乐播放,arduinoIDE里调用音乐播放库
  6. Python入门学习(四)
  7. JZOJ 5183. 【NOIP2017提高组模拟6.29】小T的钢琴
  8. sql语句Order by 报错列名不明确
  9. java中错误的源文件,关于Java源文件结构规则,说法错误的是()A.版权信息必须在java文件的开头B.package语句在imports...
  10. 2020年产业互联网发展报告
  11. redis数据结构类型
  12. 八皇后问题的非递归解法
  13. (转)支持Dubbo生态发展,阿里巴巴启动新的开源项目 Nacos
  14. SpringBoot-Freemarker与SpringBoot集成
  15. 决策树(六)--随机森林
  16. spark rdd详解二(transformation与action操作)
  17. 大学excel题库含答案_2017excel试题库附答案.doc
  18. 常用中文字体的Unicode编码
  19. Ribbon常用配置
  20. mysql如何创建用户代码_Mysql 创建用户 受权_mysql

热门文章

  1. Java-ArrayList.Itr类(Iterator的实现)
  2. 4.15_strategy_行为型模式:策略模式
  3. 如何得到所有子对象_对象可能会迟到,但它永远不会缺席
  4. ThinkPHP 多语言的实现
  5. html中iframe子页面与父页面元素的访问以及js变量的访问
  6. Nhibernate学习之many-to-many篇
  7. JS:ES6-1 let 关键字
  8. React实现类似淘宝tab居中切换效果
  9. 数据库---连接查询,数据表之间的并交集关系
  10. 零点是结束,也是开始。