首页 > 其他分享 >Mat类介绍

Mat类介绍

时间:2023-04-07 16:44:51浏览次数:30  
标签:Mat 矩阵 数据类型 介绍 OpenCV 数据 CV

Mat类用来保存矩阵类型的数据信息,包括向量、矩阵、灰度或彩色图像等数据。Mat类分为矩阵头和指向存储数据的矩阵指针两部分。矩阵头中包含矩阵的尺寸、存储方法、地址和引用次数等。矩阵头的大小是一个常数,不会随着矩阵尺寸大小而改变。在绝大多数情况下矩阵头大小远小于矩阵中数据量的大小,因此图像复制和传递过程中主要的开销是存放矩阵数据。为了解决这个问题,在OpenCV中复制和传递图像时,只是复制了矩阵头和指向存储数据的指针,因此在创建Mat类时可以先创建矩阵头后赋值数据,其方法如代码清单2-1所示。

代码清单2-1 创建Mat类
cv::Mat a; //创建一个名为a的矩阵头
a = cv::imread(“test.jpg”); //向a中赋值图像数据,矩阵指针指向像素数据
cv::Mat b=a; //复制矩阵头,并命名为b

  上面这段代码首先创建了一个名为a的矩阵头,之后读入一张图像并将a中的矩阵指针指向该图像的像素数据,最后将a矩阵头中的内容复制到b矩阵头中。虽然a、b有各自的矩阵头,但是其矩阵指针指向的是同一个矩阵数据,通过任意一个矩阵头修改矩阵中的数据,另一个矩阵头指向的数据也会跟着发生改变。但是当删除a变量时,b变量并不会指向一个空数据,只有当两个变量都删除后,才会释放矩阵数据。因为矩阵头中引用次数标记了引用某个矩阵数据的次数,只有当矩阵数据引用次数为0的时候才会释放矩阵数据。根据官方给出的Mat类继承图,Mat类可以存储的数据类型包含double、float、uchar、unsigned char以及自定义的模板等。我们可以通过代码清单2-2的方式声明一个存放指定类型的Mat类变量:

代码清单2-2 声明一个指定类型的Mat类
cv::Mat A = Mat_<double>(3,3);//创建一个3*3的矩阵用于存放double类型数据

由于OpenCV提出Mat类主要用于存储图像,而像素值的最大值又决定了图像的质量,如果用8位无符号整数去存储16位图像,会造成严重的图像颜色失真或造成数据错误。而由于不同位数的编译器对数据长度定义不同,为了避免在不同环境下因变量位数长度不同而造成程序执行问题,OpenCV根据数值变量存储位数长度定义了数据类型,表2-1中列出了OpenCV中的数据类型与取值范围。

表2-1 OpenCV中的数据类型与取值范围

数据类型 具体类型 取值范围
CV_8U 8位无符号整数 0-255
CV_8S 8位符号整数 -128—127
CV_16U 16位无符号整数 0-65535
CV_16S 16位符号整数 -32768—32767
CV_32S 32位符号整数 -2147483648—2147483647
CV_32F 32位浮点整数 -FLT_MAX—FLT_MAX, INF, NAN
CV_64F 64位浮点整数 -DBL_MAX—DBL_MAX, INF, NAN

  仅有数据类型是不够的,还需要定义图像数据的通道(Channel)数,例如灰度图像数据是单通道数据,彩色图像数据是3通道或者4通道数据。因此针对这个情况,OpenCV还定义了通道数标识,C1、C2、C3、C4分别表示单通道、双通道、3通道和4通道。每一种数据类型都存在多个通道的情况,所以将数据类型与通道数表示结合便得到了OpenCV中对图像数据类型的完整定义,例如CV_8UC1表示的就是8位单通道数据,用于表示8位灰度图,而CV_8UC3表示的是8位3通道数据,用于表示8位彩色图。我们可以通过代码清单2-3的方式创建一个声明通道数和数据类型的Mat类:

代码清单2-3 通过OpenCV数据类型创建Mat类
cv::Mat a(640,480,CV_8UC3) //创建一个640*480的3通道矩阵用于存放彩色图像
cv::Mat a(3,3,CV_8UC1) //创建一个3*3的8位无符号整数的单通道矩阵
cv::Mat a(3,3,CV_8U) //创建单通道矩阵C1标识可以省略

 

 

 

 

标签:Mat,矩阵,数据类型,介绍,OpenCV,数据,CV
From: https://www.cnblogs.com/okmai77xue/p/17296185.html

相关文章

  • js Math汇总
    //----------JavaScriptMath----------////abs(x)//返回x的绝对值//Math.abs(x)console.log(Math.abs(8.8));//8.8console.log(Math.abs(-8.8));//8.8console.log(Math.abs(null));//0console.log(Math.abs(undefined));//NaNconsole.log(......
  • 支付宝定时任务怎么做?三层分发任务处理框架介绍
    一、背景介绍技术同学对定时任务肯定不陌生。定时任务一般用来定时批量进行业务处理。支付宝卡包券到期提醒、删除过期失效券,五福大促批量给用户发放添福红包等场景,都是通过定时任务触发来完成的。作者有幸参与了2023兔年五福大促的开发,主导完成了福气乐园分会场平分5000万大奖需求......
  • CCNA考试流程、考试费用及考场介绍
    4月15日CCNA+HCIA新一轮班级开班CCNA(CiscoCertifiedNetworkAssociate)思科认证网络工程师 一、CCNA认证考试流程ccna考试认证,先学习CCNA理论知识,然后下载CCNA考试题库,预约考试,参加并通过考试。CCNA证书如下: 二、CCNA认证考试相关内容 考试要求:对学历、专业、年龄没有要求。考......
  • m基于flocking算法的无人机群空间避障飞行matlab仿真,对比二维场景和三维场景
    1.算法描述        近年来,随着通信网络、人工智能、自主系统、大数据的前沿技术的发展,无人机蜂群作战也正在由概念变成现实,从理论走向实践。航迹规划,多机协作,集群控制等问题成为当下研究热点。在军事作战中派遣多无人机协同作战相比于单无人机能够在穿透敌方防御系统,......
  • 混合类Mixins介绍
    介绍混合类是封装了一些通用行为的基类,旨在重用代码。通常,混合类本身并没有什么用,仅扩展这种类也行不通因为在大多数情况下,它都依赖于其它类中定义的方法和属性。通过多继承,可将混合类与其它类一起使用,从而让混合类的方法或属性变得可用。示例假设有一个简单的分析器,它接收......
  • Java 自增自减运算符和移位运算符介绍
    摘自JavaGuide(「Java学习+面试指南」一份涵盖大部分Java程序员所需要掌握的核心知识。准备Java面试,首选JavaGuide!)自增自减运算符在写代码的过程中,常见的一种情况是需要某个整数类型变量增加1或减少1,Java提供了一种特殊的运算符,用于这种表达式,叫做自增运算符(++)和自......
  • “往后余生探索未来”通联七星&俄罗斯领事馆原址MateX3浪漫约会
    一座城市的建筑,就是这座城市的历史,也是这座城市整体文化的代表和象征......近日,七星手机连锁东区联合华为开展主题为“往后余生,探索未来”的MateX3系列活动,把现代科技与俄式领事馆建筑群联合,在活动中体验百年俄式建筑群和最新现代最高科技的完美贴合。在活动现场,花粉们竞相互动,通过......
  • HDU - 3081 Marriage Match II(二分图最大匹配 + 并查集)
    题目大意:有n个男生n个女生,现在要求将所有的男女配对,所有的男女都配对的话,算该轮游戏结束了。接着另一轮游戏开始,还是男女配对,但是配对的男女不能是之前配对过的。问这游戏能玩多少轮男女能配对的条件如下1.男女未曾吵架过。2.如果两个女的是朋友,那么另一个女的男朋友可以和......
  • 纯电动汽车动力性经济性开发程序 Matlab AppDesigner 汽车性能开发工具
    纯电动汽车动力性经济性开发程序MatlabAppDesigner汽车性能开发工具电动汽车动力性计算电动汽车动力总成匹配写在前面:汽车动力性经济性仿真常用的仿真工具有AVLCruise、ameSIM、matlabsimulink、carsim等等,但这些软件学习需要付出一定时间成本,有很多老铁咨询有没有方便入......
  • bp神经网络交叉验证算法和确定最佳隐含层节点个数matlab 程序
    bp神经网络交叉验证算法和确定最佳隐含层节点个数matlab程序,直接运行即可。数据excel格式,注释清楚,效果清晰,一步上手。YID:6859628310735572......