Mat类详解

OpenCV学习笔记(五):Mat结构 在之前的OpenCV学习笔记(一)用到的几种显示图像的方法中其中一种就是Mat。Mat结构在OpenCV 2.0后才得到广泛应用,相对于OpenCV1.0时代中的IplImage,它有个好处就是不用再手动释放图像内存。而用IplImage格式存储图像的时候就必须在推出前将图像内存release掉,即添加语句cvReleaseImage(&iplImg);,否则会造成内存泄漏。除了这个好处外,它的操 阅读详情

1. 前言:Mat类起源

OpenCV作为强大的计算机视觉开源库,很大程度上参考了MatLab的实现细节和风格,比如说,在OpenCV2.x 版本以后,越来越多的函数实现了MatLab具有的功能,甚至干脆连函数名都一模一样(如 imread, imshow,imwriter等)。这一做法,不仅拉近了产品开发与学术研究的距离,并极大程度的提高了开发人员的研发效率,不得不说,Intel公司真的是一个伟大的公司。

在计算机内存中,数字图像以矩阵的形式存储和运算,比如,在MatLab中,图像读取之后对应一个矩阵,在OpenCV中,同样也是如此。

在早期的OpenCV1.x版本中,图像的处理是通过IplImage(该名称源于Intel的另一个开源库Intel Image Processing Library ,缩写成IplImage)结构来实现的。早期的OpenCV是用C语言编写,因此提供的借口也是C语言接口,其源代码完全是C的编程风格。IplImage结构是OpenCV矩阵运算的基本数据结构。

到OpenCV2.x版本,OpenCV开源库引入了面向对象编程思想,大量源代码用C++重写,Mat类 (Matrix的缩写) 是OpenCV用于处理图像而引入的一个封装类。从功能上讲,Mat类在IplImage结构的基础上进一步增强,并且,由于引入C++高级编程特性,Mat类的扩展性大大提高,Mat类的内容在后期的版本中不断丰富,如果你查看Mat类的定义的话(OpenCV3.1\sources\modules\core\include\opencv2\core\mat.hpp),会发现其设计实现十分全面而具体,基本覆盖计算机视觉对于图像处理的基本要求。

这里写图片描述

因此,在当前的OpenCV开发中,Mat可以说是最最最常见的数据单元,深入了解Mat类对于OpenCV深入开发有着重大意义。

2. Mat类常用成员函数和成员变量

Mat类十分庞大,其所涉及的成员函数和变量难以一一细数,在这里,仅学习记录其最最最常见的部分,以便日常使用。

2.1 构造函数

0.默认构造函数

cv::Mat::Mat()
  • 1

默认构造函数,生成一个矩阵并由OpenCV提供的函数(一般是Mat::create() 和 cv::imread() )来分配储存空间。

Mat类可以分为两个部分:矩阵头和指向像素数据的矩阵指针

矩阵头 包括数字图像的矩阵尺寸、存储方法、存储地址和引用次数等,矩阵头的大小是一个常数,不会随着图像的大小而改变,但是保存图像像素数据的矩阵则会随着图像的大小而改变,通常数据量会很大,比矩阵头大几个数量级。这样,在图像复制和传递过程中,主要的开销是由存放图像像素的矩阵而引起的。因此,OpenCV使用了引用次数,当进行图像复制和传递时,不再复制整个Mat数据,而只是复制矩阵头和指向像素矩阵的指针,例如:

cv::Mat a ; //默认构造函数,创建矩阵头
a = cv::imread("test.jpg");//读入图像,矩阵指针指向该像素数据
cv::Mat b = a ;//复制 
  • 1
  • 2
  • 3

上面的a,b有各自的矩阵头,但是其矩阵指针指向同一个矩阵,也就是其中任何一个改变了矩阵数据都会影响另外一个。
那么,多个Mat共用一个矩阵数据,最后谁来释放矩阵数据呢?
这就是引用计数的作用,当Mat对象每被复制一次时,就会将引用计数加1,而每销毁一个Mat对象(共用同一个矩阵数据)时引用计数会被减1,当引用计数为0时,矩阵数据会被清理。

1.常用构造函数(1)


cv::Mat::Mat(int rows,int cols,int type)
  • 1
  • 2

重载的构造函数,这也是常用构造函数之一,在创建对象同时,提供矩阵的大小(rows,行数;cols ,列数),以及存储类型(type)
该类型表示矩阵中每一个元素在计算机内存的存储类型,如CV_8UC3,具体含义为“3通道8位无符号数”。

使用举例:

Mat src(10,10,CV_32FC3);
  • 1

表示src是一个10*10的矩阵,且矩阵元素以32位float型存储

类似,OpenCV还提供了一种Size() 数据结构来构造Mat对象

2.常用构造函数(2)


cv::Mat::Mat(Size size,int type )   
  • 1
  • 2

Size类等效于一个成对数据,size::Size(cols,rows),特别注意 cols和rows的位置

举个例子

Mat src1(3, 4, CV_32FC3);
Mat src2(Size(3, 4), CV_32FC3);
cout << "src1.rows=" << src1.rows << " src1.cols=" << src1.cols <<endl;
cout << "src2.rows=" << src2.rows << " src2.cols=" << src2.cols << endl;
cout << "src1.size="<<src1.size() << endl <<"src2.size=" << src2.size() <<endl;
  • 1
  • 2
  • 3
  • 4
  • 5

输出结果

不得不说,这个Size类的数据结构有点“反人类”,但这样做的好处是方便了计算机内部的运算(比如OpenCV很多函数计算Size相关的数据也是按这个顺序来的,具体为什么这样,我也不太清楚,个人理解为行业标准)。

还有,我们平时所说分辨率,也是Size的类型,比如屏幕分别率 1440*900,其中cols=1440,rows=900。

3.常用构造函数(3)

cv::Mat::Mat(int ndims,const int *  sizes,int type,const Scalar& s) 
  • 1

该构造函数与使用了Scalar参数,作用是能够通过Scalar数据类来初始化元素值,例如,我们要生成一张白色背景的图片:

Mat src1(300, 400, CV_8UC3,Scalar(255,255,255));
imshow("test", src1);
  • 1
  • 2

运行结果

其中,(255,255,255)对应以8位无符号数存储,RGB色域的白色值。

4.常用构造函数(4)

cv::Mat::Mat(const Mat & m)
  • 1

引用m矩阵,注意,这里是引用值

2.2 成员函数

1.at函数
at函数的功能是访问矩阵元素,根据不同的使用场景,有多个重载函数可供选择。
如,访问一个二维的矩阵,可用at函数原型为:

_Tp& cv::Mat::at(int i0,int i1)
  • 1

使用方法举例:

Mat src = imread("test.jpg");
int elem = src.at<int>(0,0);
  • 1
  • 2

访问test.jpg图像的(0 , 0)元素

2.channels函数

int cv::Mat::channels   ()  const
  • 1

返回图像的通道数

3.clone函数

Mat cv::Mat::clone()    const
  • 1

矩阵复制

4.convertTo函数


void cv::Mat::convertTo(OutputArray m,int rtype,double alpha = 1,double beta = 0)   const
  • 1
  • 2

转换矩阵存储类型,具体计算公式如下:
m(x,y)=saturate_cast<rType>(α(∗this)(x,y)+β)
m是输入矩阵,rtype是目标类型,alpha是放缩系数,beta是增减标量

5.copyTo函数

void cv::Mat::copyTo(OutputArray    m)  const
  • 1

从m矩阵复制data数据单元,与clone函数的作用类似

6.create函数

void cv::Mat::create(int    rows,int cols,int type) 
  • 1

分配矩阵的存储单元,一般和默认构造函数配合使用

7**.depth函数**

int cv::Mat::depth()    const
  • 1

返回图像深度,即矩阵元素的存储方式

8.diag函数

Mat cv::Mat::diag(int   d = 0)  const
  • 1

提取矩阵的对角元素

9.mul函数

MatExpr cv::Mat::mul(InputArray m,double scale = 1 )    const
  • 1

矩阵的乘法

10.inv函数

MatExpr cv::Mat::inv(int    method = DECOMP_LU) const
  • 1

求逆矩阵

11.t函数

MatExpr cv::Mat::t() const
  • 1

求转置矩阵
12.total函数

size_t cv::Mat::total() const
  • 1

返回矩阵的元素总个数,如30*40的图像,存在1200个像素点

2.3 成员变量
int cv::Mat::cols; //返回矩阵的列数

int cv::Mat::rows // 返回矩阵行数

uchar* cv::Mat::data // 指向矩阵的数据单元的指针

int cv::Mat::dims // 返回矩阵维度,该维度≥2

MatSize cv::Mat::size // 返回矩阵大小
认识OpenCV中的数据类型:Mat容器-Mat类介绍 认识和使用OpenCV中的Mat数据类型。 阅读详情

相关推荐

OpenCV4(C++) —— Mat类

在python的opencv中,也就是导入:import cv2。使用的是numpy和内置ndarray来存储和处理图像数据。而对于C++的opencv是没有ndarray的,也没有numpy库,而是使用cv::Mat类来表示图像数据与进行处理的。python是一种动态类型语言,无需显示的指定变量的类型。直接使用imread返回的就是ndarray对象,后续使用numpy库可以直接对其进行相关图像操作。import cv2C++是一种静态类型语言,任何变量都需要显示地指定一个数据类型。

qq_43199575的博客 4242

openCV学习(一)Mat数据类型

Mat数据结构Mat类型是opencv2.0后的类型,使用此类型无需进行内存管理,即无需手动分配内存,在不需要时自动释放内存,但因目前的许多嵌入式系统仅支持c语言,故而除了在某些嵌入式系统中使用cvMat或IplImage, 基本使用Mat类型。注:后续的matrix均表示存储图像像素值的矩阵 。Mat包含2个数据部分:the matrix header--包含matrix大小,存储方法,matr...

小白的博客 1万+

【WiFi软件开发】IOCTL和Netlink----用户空间和内核空间交互的两种方式

linux开发中通常会涉及用户空间和内核模块的交互。本文介绍了两种典型的用户空间和内核模块通信方式:ioctl和netlink

liuwe1ye的博客 2349

【学习OpenCV】——Mat类详解

官方文档说明:点击打开链接 C++的接口,基于opencv 2.4.9 Mat类 class CV_EXPORTS Mat { public: // ... a lot of methods ... ... /*! includes several bit-fields: - the magic signature -...

Kelvin_Yan的专栏 1万+

科研智能体平台搭建与实战:大模型如何驱动科研自动化

大模型技术的快速发展,正推动AI智能体从单纯对话工具向主动执行任务的科研伙伴演进。智能体的核心原理在于整合模型调用、工具使用、知识库检索与工作流编排,使其能够自主拆解目标、执行操作并迭代优化。在科研场景中,这一技术价值尤为突出:文献初筛、实验数据清洗、代码调试、结果汇总等高频重复劳动均可实现自动化,大幅释放研究者精力。从基础组件配置到多智能体协同,从平台选型到提示词调优,实际落地需要关注模型匹配、工具稳定性、记忆管理与人机校验机制。本文基于真实工程经验,系统梳理科研智能体平台的搭建路径、应用案例与高频问题排

weixin_32597009的博客 289

Mac上Ollama服务IP访问失败的3种修复方法(含永久生效配置)

本文详细介绍了Mac上Ollama服务IP访问失败的3种修复方法,包括临时环境变量覆盖、永久Shell配置修改及进阶排查技巧。重点解析了OLLAMA_HOST环境变量的配置原理,帮助开发者解决Connection refused问题,实现局域网IP访问Ollama服务的需求。

weixin_29209805的博客 209

类 Mat 详解

类 Mat 详解 OpenCV c + + n 维稠密数组类 类CV_EXPORTS Mat { public: / / … …很多的方法... ...   int flags;(Note :目前还不知道flags做什么用的) //!数组的维数,> = 2 int dims ; //!行和列的数量或 (-1,-1) 此时数组已超

b1342504010的专栏 756

C++,使用Qt设计一个登录窗口

使用Qt设计一个登录界面

heyu0311的博客 2991

【c++】Opencv Mat类详解

1. Mat类常用成员函数和成员变量 由于 Mat 类使用的非常广泛,使用的形式也非常之多,这里只对较为常用的成员函数和成员变量做出了整理; 1.1 构造函数 (1)默认构造函数 cv::Mat::Mat() 默认构造函数:生成一个矩阵并由OpenCV提供的函数(一般是Mat::create() 和 cv::imread() )来分配储存空间。 Mat类可以分为两个部分:矩阵头和指向像素数据的矩阵指针 矩阵头:包括数字图像的矩阵尺寸、存储方法、存储地址和引用次数等,矩阵头的大...

热爱数据库的小胖 8137

激光雷达点云配准:ICP与NDT算法详解

激光雷达点云配准:ICP与NDT算法详解​ ,人工智能,计算机视觉,大模型,AI,本文深入解析激光雷达点云配准的ICP与NDT算法。阐述了点云配准基础概念与评价指标,详解ICP算法原理、流程、最优变换矩阵计算、优缺点及改进版,给出Python代码示例;同样解析NDT算法的原理、流程、模型构建、优缺点、参数选择与代码示例。还对比两者在精度、效率、鲁棒性和适用场景的差异,提供算法选择建议,介绍实际应用案例、常见问题及解决方法,探讨算法发展趋势。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 15万+

手把手教你新建一个winform项目(史上最全)

本文介绍如何利用visual studio新建一个winform程序

qq_34059233的博客 4万+

openCV学习(一)——Mat类详解

之前用Python学习openCV 和Slam,由于要做特征点提取和对接约束、三角测距等,而C++对SLAM比较友好,所以转来使用C++调研openCV,不同于Python不考虑数据类型,所以开始学习openCV常见的数据类型。

lvyaer_1122的博客 1万+

【系统架构设计师】案例分析考点情况分析和解题技巧(包括2009~2024年考点详情)

复习方法建议仍然是以真题为主,只不过和综合题不同,标准答案并不会涵盖所有可能的考点。案例的考察方法和论文不太一样,它考察两大块的内容:

数据知道的博客 1万+

[OpenCV]Mat类详解

http://blog.youkuaiyun.com/yang_xian521/article/details/7107786 Preface Mat:Matrix Mat类可以被看做是opencv中C++版本的矩阵类,通俗的说就是操作矩阵(例如:求逆/转置/加减乘除等等,), 而图片的存储就是矩阵,所以经常用他来处理图片 Mat最大的优势跟STL很相似,有很多类似于STL的操作。但是Mat...

aed16617的博客 127

YOLO11改进-注意力-引入级联组注意力机制(Cascaded Group Attention, CGA)

输入特征拆分:输入特征进入 CGA 模块后,被均匀拆分为个部分,每个部分作为一个注意力头的输入,这样每个头关注输入特征的不同部分,实现特征的并行处理,同时为提高注意力多样性奠定基础。注意力头计算单元:每个注意力头包含三个线性投影层、、用于将输入特征映射到不同子空间,以及计算自注意力的单元。在计算过程中,通过注意力头之间的级联操作,前一个头的输出会累加到下一个头的输入上,实现特征的逐步细化。

qq_64693987的博客 2491

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

OpenCV Mat类详解和用法

OpenCV Mat类详解和用法      我们有多种方法可以获得从现实世界的数字图像:数码相机、扫描仪、计算机体层摄影或磁共振成像就是其中的几种。在每种情况下我们(人类)看到了什么是图像。但是,转换图像到我们的数字设备时我们的记录是图像的每个点的数值。       例如在上图中你可以看到车的镜子只是一个包含所有强度值的像素点矩阵。现在,我们如何获取和存储像素值可能根据最适合我们的需要而变...

AI吃大瓜的博客 16万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

OPENCV之Mat类详解

译文参考The OpenCV Reference Manual (Release 2.3)August 17 2011 Mat类 OpenCV c + + n 维稠密数组类 class CV_EXPORTS Mat { public: / / … …很多的方法... ... /*!包括几位字段: -神奇的签名 -连续性标志

drrlalala的专栏 1187

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

OpenCV Mat类详解

译文参考The OpenCV Reference Manual (Release 2.3)August 17 2011 Mat类 OpenCV c + + n 维稠密数组类 class CV_EXPORTS Mat { public: / / … …很多的方法... ... /*!包括几位字段: -神奇的签名 -连续性标志 -深度(

poem_of_sunshine的专栏 1万+

OpenCV 的 Mat 类详解

Mat 是 OpenCV 中最核心的 多维数组类,用于存储图像、矩阵、张量等数据。它比原生数组更强大,支持自动内存管理、多种数据类型和多维操作。⚠️ 注意:此时 mat 不拥有数据所有权,需确保 externalData 生命周期长于 mat。引用计数:多个 Mat 对象可共享同一数据内存,最后一个引用释放时自动销毁数据。支持多维数据:1D(向量)、2D(矩阵)、3D(体积数据)等。深拷贝:调用 clone() 时复制独立副本。示例3:深度学习输出解析。示例2:包装外部数据。

qq_42936727的博客 535

openCV Mat类详解

 本文转自:http://blog.youkuaiyun.com/holybin/article/details/17751063 综述 Mat类可以被看做是opencv中C++版本的矩阵类,替代原来C版本的矩阵结构体CvMat和图像结构体IplImage; Mat最大的优势跟STL的兼容性很好,有很多类似于STL的操作。但是Mat远远强于后者; Mat是一种高效的数据类型,它对内存进行

Sunshine_in_Moon的专栏 3437
上一篇: 求连直线的焦点
下一篇: IplImage访问图像像素值
LiBin1103
博客等级 码龄9年 38粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值