您好,
会员登录 快速注册
退出 ( 条未读消息)
关于本站 意见反馈 首页

公告:小宅博客网可以开发票了,需要发票的,去群里找群主哈!!
全部文章分类
  • 人工智能 >

  • 编程语言 >

  • WPF系列 >

  • ASP.NET系列 >

  • Linux >

  • 数据库 >

  • 嵌入式 >

  • WEB技术 >

  • PLC系列 >

  • 微服务与框架 >

  • 小宅DIY >

  • 学习资料 >

OpenCv基础 ANN车牌识别 yolov5车牌识别 指针式仪表识别 ROS系列 YOLO Halcon Detectron2 昇腾AI ChatGPT在线体验 英伟达JETSON ChatGLM ChatTTS FunASR 地平线 ByteTrack 魔搭社区 LangChain
C C# C++ Python Java Go
WPF
ASP.NET小功能 GPS定位系统-MVC GPS定位系统-VUE ASP.NET WebRTC
Linux Linux内核 Shell MakeFile
MySql SqlServer Oracle
STM8 STM32 51单片机
VUE入门 HTML JavaScript CSS layui镜像网站 ElementUi中文官网 element-plus 图标
三菱 欧姆龙 西门子 施耐德 松下 台达
IOTSharp IOTGateway ABP FRAMEWORK Docker
亚克力音响 编程仙途:智驭万法
面试题与技巧 Python入门技能树 微软C#教程
首页 编程之美 工具下载 全国就业 流量地图 文心一言
OpenCv基础
内容介绍与资料分享 C# OpenCv环境搭建 C++ OpenCv环境搭建 Python OpenCv环境搭建 Java OpenCv环境搭建 OpenCv组件结构解析 OpenCv命名规范 OpenCv基本专业术语与方法 OpenCV 常用函数与构造体详细说明 创建画布 打开一张图片 利用imwrite生成透明png图像 图像打开、混合显示和输出 图像腐蚀 blur图像模糊(均值滤波) sobel边缘检测 canny边缘检测 Scharr滤波器 程序性能检测及优化 视频播放 摄像头录像与播放 双摄像头操作与图像相似度检测 颜色空间转换与物体追踪 彩色目标追踪 光流法运动目标检测 OpenCV中的稠密光流 背景减除 点追踪 人脸识别 支持向量机之SVM引导 支持向量机之处理线性不可分数据 ROI矩形截取 鼠标绘制矩形 用OpenCV进行基本绘图 绘图函数(python中文显示) 把鼠标当画笔 用滑动条做调色板 图像的基础操作 图像上的算术运算 多通道图像混合 图像的亮度、对比度调整 XML和YAML文件的写入 XML和YAML文件的读取 卷积操作 三种线性滤波 两种非线性滤波 7种图像处理形态学(1) 7种图像处理形态学(2) 漫水填充 图像缩放与图像金字塔 二值化基本阈值操作 图像阈值 Laplacian图像变换(拉普拉斯算子) 霍夫变换HoughLines边缘检测与线性矢量 霍夫变换HoughLinesP边缘检测与线性矢量 霍夫变换HoughCircles边缘检测与线性矢量 LSD快速直线检测 几何变换 remap重映射 remap实现多种重映射 仿射变换综合示例 直方图均衡化 CLAHE有限对比适应性直方图均衡化 draw最大的轮廓 轮廓的性质 点到多边形的最短距离 形状匹配 椭圆拟合与直线拟合 基础轮廓查找 查找并绘制轮廓综合示例 凸缺陷/凸包检测 凸包检测 创建包围轮廓的矩形边界 创建包围轮廓的圆形边 创建包围轮廓的矩形和圆形边界框 查找和绘制图片轮廓矩 分水岭算法 图像修补 H-S二维直方图的绘制/2D直方图 一维直方图的绘制 RGB三色直方图的绘制 直方图对比 使用掩膜绘制直方图 直方图反向投影 模板匹配 多对象模板匹配 cornerHarris角点检测 cornerHarris角点检测综合示例 Shi-Tomasi角点检测 亚像素级角点检测 角点检测的FAST算法(FAST特征检测器) 颜色识别 warpPerspective透视变换 SURF/SIFT特征点检测 SURF/SIFT特征描述 使用FLANN进行特征点匹配 FLANN结合SURF/SIFT进行关键点的描述和匹配 寻找已知物体(一) 寻找已知物体(二) 目标查找与跟踪 - Meanshift与CamShift BRIEF描述符 ORB ORB算法描述与匹配 LUT 图像灰度调整 离散傅里叶变换 双目摄像头与图像拼接 环境亮度检测 stitching 全景拼接 Maze-Solver迷宫解密 使用Haar分类器之面部检测 使用Haar分类器之行人检测 OpenCv Haar/LBP/HOG分类器-人脸识别 斑点检测 使用GrabCut算法进行交互式前景提取 对极几何 摄像机标定 姿势估计 立体图像中的深度地图 OpenCv中的KNN KNN手写数字识别 ​SVM手写数字识别(使用SVM进行手写数据OCR) 英文字母的OCR 预测手写数字(预测不准) K值聚类(一) K值聚类(二) 计算摄影学-图像去噪 高动态范围成像(HDRI或HDR) MSER区域检测 二维码、条形码识别 删除图像中的水印 OpenCv深度学习dnn Kinect-深度相机 OpenCv常用数学算法 360度旋转直线绘制 向量延长线上的像素扫描 Tools工具包-窗体分配
OpenCv基本专业术语与方法
创建画布
激萌の小宅 小宅博客网 OpenCv基础

文章作者:激萌の小宅

促销:¥0

价格:¥0

配送方式: 购买后立即生效(如购买异常,请联系站长)
付款之后一定要等待自动跳转结束,否则购买可能会失败
  • 0 天

    有效期

  • 0

    总销量

  • 2

    累计评价

OpenCV 常用函数与构造体详细说明

Mat成员函数

 

Mat成员函数如下:

序号

成员函数

功能

1 

addref

计数器参考

2 

adjustROI

调整子阵大小及其在父矩阵中的位置

3 

assignTo

提供了一个convertTo的功能形式

4 

at

返回对指定数组元素的引用

5 

begin

返回矩阵迭代器,并将其设置为第一矩阵元

6 

channels

返回矩阵通道的数目

7 

checkVector

Mat矩阵如果其深度,连续性,通道数,行列式满足一定条件的话就返回Mat元素的个数和其通道数的乘积,否则返回-1

8 

clone

创建一个数字及其基础数据的完整副本

9 

col

创建一个指定列数的矩阵头

10 

colRange

创建指定列跨度的矩阵头

11 

convertTo

在缩放或不缩放的情况下转换为另一种数据类型

12 

copySize

【查不到】

13 

copyTo

把矩阵复制到另一个矩阵中

14 

create

分配新的阵列数据 (如果需要)

15 

cross

计算3元素向量的一个叉乘积

16 

deallocate

【查不到】

17 

depth

返回一个矩阵元素的深度

18 

diag

提取或创建矩阵对角线,d = 0:全图对角线,d > 0:下半部分对角线数据,d < 0:上半部分对角线数据

19 

dot

计算两向量的点乘

20 

elemSize

返回矩阵元素大小 (以字节为单位)

21 

elemSize1

以字节为单位返回每个矩阵元素通道的大小

22 

empty

如果数组有没有 elemens,则返回 true

23 

end

返回矩阵迭代器,并将其设置为 最后元素之后(after-last)的矩阵元

24 

eye

返回一个恒等指定大小和类型矩阵

25 

inv

反转矩阵

26 

isContinuous

返回矩阵是否连续

27 

isSubmatrix

检查是否为子矩阵

28 

locateROI

父矩阵内定位矩阵头

29 

mul

执行两个矩阵按元素相乘或这两个矩阵的除法

30 

ones

返回一个指定的大小和类型的全为1的数组

31 

pop_back

从底部的列表中删除元素

32 

ptr

返回指定矩阵行的指针

33 

push_back

将元素添加到矩阵的底部

34 

push_back_

【查不到】

35 

release

在必要的情况下,递减引用计数并释放该矩阵

36 

reserve

保留一定数量的行的空间

37 

reshape

在无需复制数据的前提下改变2D矩阵的形状和通道数或其中之一

38 

resize

更改矩阵的行数

39 

row

创建一个指定行数的矩阵头

40 

rowRange

创建指定行跨度(span)的矩阵头

41 

setTo

将阵列中所有的或部分的元素设置为指定的值

42 

step1

返回矩阵归一化迈出的一步

43 

t

通过矩阵表达式(matrix expression)实现矩阵的转置

44 

total

返回数组元素的总数

45 

type

返回一个矩阵元素的类型

46 

zeros

返回指定的大小和类型的零数组

47 

~Mat

t的析构函数。

48 

operator

提供矩阵赋值操作(非函数)

49 

operator()

提取矩阵子阵

50 

operator CvMat

创建矩阵CvMat头

51 

operator IplImage

创建IplImage矩阵头

 

Mat类成员函数参数名称的含义:

序号

参数

含义

1

ndims

数组的维数

2

rows

二维数组的行数

3

cols

二维数组的列数

4

size

二维数组的尺寸Size(cols, rows),在Size()构造函数函数中行数和列数在顺序上为反转过来的

5

sizes

指定n维数组形状的整数数组

6

type

数组的类型。使用CV_8UC1,... ... ,创建1-4通道的矩阵,CV_64FC4或CV_8UC(n),... ...,CV_64FC(n)可以创建多通道(高达CV_MAX_CN通道)矩阵

7

s

一个可选的初始化每个矩阵元素的参数。要在矩阵建成后将所有元素设置为特定值可以用Mat的赋值运算符Mat:operator=(constScala& value)。

8

data

指向用户数据的指针。矩阵构造函数传入data和step参数不分配矩阵数据。相反,它们只是初始化矩阵头指向指定的数据,这意味着没有数据的复制。此操作是很高效的,可以用来处理使用 OpenCV 函数的外部数据。外部数据不会自动释放,所以你应该小心处理它。

9

step

每个矩阵行占用的字节数。如果任何值应包括每行末尾的填充字节。如果缺少此参数(设置为 AUTO_STEP),假定没有填充和实际的步长用cols*elemSize()计算。请参阅Mat::elemSize()

9

steps

多维数组(最后一步始终设置为元素大小) 的情况下的 ndims-1个步长的数组。如果没有指定的话,该矩阵假定为连续。

10

M

分配给构造出来的矩阵的阵列(作为一个整体或部分)。这些构造函数没有复制数据。相反,指向 m 的数据或它的子数组的头被构造并被关联到m上。引用计数器中无论如何都将递增。所以,当您修改矩阵的时候,自然而然就使用了这种构造函数,您还修改 m 中的对应元素。如果你想要独立的子数组的副本,请使用 Mat::clone()

11

img

指向老版本的 IplImage图像结构的指针。默认情况下,原始图像和新矩阵之间共享数据。但当 copyData 被设置时,完整的图像数据副本就创建起来了

12

vec

矩阵的元素构成的STL 向量。矩阵可以取出单独一列并且该列上的行数和矢量元素的数目相同。矩阵的类型匹配的向量元素的类型。构造函数可以处理任意的有正确声明的DataType类型。这意味着矢量元素不支持的混合型结构,它们必须是数据(numbers)原始数字或单型数值元组。对应的构造函数是显式的。由于 STL 向量不会自动转换为Mat实例,您应显式编写 Mat(vec)。除非您将数据复制到矩阵 (copyData = true),没有新的元素被添加到向量中,因为这样可能会造成矢量数据重新分配,并且因此使得矩阵的数据指针无效

13

copyData

指定STL 向量或旧型 CvMat 或 IplImage是应复制到 (true)新构造的矩阵中 还是 (false) 与之共享基础数据的标志,复制数据时,使用Mat引用计数机制管理所分配的缓冲区。虽然数据共享的引用计数为 NULL,但是分配数据必须在矩阵被析构之后才可以释放

14

rowRange

m 的行数的取值范围。正常情况下,范围开始端具有包容性和范围结束端是独占的。使用 Range::all() 来取所有的行。

15

colRange

m 列数的取值范围。使用 Range::all() 来取所有的列

16

ranges

表示M沿每个维度选定的区域的数组

17

expr

矩阵表达式。请参见“矩阵表达式”一节的内容

 

以上这些都是Mat形成一个矩阵的各类构造函数。如输出数据的自动分配中所提到的,往往默认构造函数就足够了,不同的矩阵可以由 OpenCV 函数来分配数据空间。构造的矩阵可以进一步分配给另一个矩阵或矩阵表达或通过Mat::create()获配。在前一种情况,旧的内容是间接引用的。

 

Mat_<uchar>对应的是CV_8U,

Mat_<char>对应的是CV_8S,

Mat_<int>对应的是CV_32S,

Mat_<float>对应的是CV_32F,

Mat_<double>对应的是CV_64F,对应的数据深度如下:

• 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)

 

要少使用CV_64F,但是vs的编译器又会把float数据自动变成double型,有些不太爽。

还有个需要注意的问题,就是流操作符<<对于Mat的操作,仅限于Mat是2维的情况。

还有必要说一下Mat的存储是逐行的存储的。

再说说Mat的创建,方式有两种,罗列一下:

1. 调用create(行,列,类型)

2. Mat(行,列,类型(值))。

 

成员函数详细说明

 

在 Mat 类中有着众多的成员函数,后面会对所有成员函数进行详细的功能解读。

 

Mat row(int y)

获取 y 列数据。

 

Mat col(int x) const

获取 x 值。

 

Mat rowRange(int startrow, int endrow) const

获取起始列和结束列区域的数据

 

Mat rowRange(const Range& r) const

用 r 内的数据设定起始和结束列

 

Mat colRange(int startcol, int endcol) const

获取行数据,其余同上

 

Mat colRange(const Range& r) const

获取行数据,其余同上

 

Mat diag(int d=0) const

获取对角线数据:

d = 0:全图对角线

d > 0:下帮部分对角线数据

d < 0:上半部分对角线数据

 

Mat clone() const

创建数据副本。

与 Mat1 = Mat2 不同,Mat2 被清除后 Mat1 数据也会被清除。

Mat1 = Mat2.clone()在 Mat2 被改变后 Mat1 不会被改变

 

void copyTo( OutputArray m ) const;

复制数据到 m 中

 

void copyTo( OutputArray m, InputArray mask ) const;

复制 mask 设定的部分数据到 m 中

 

void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;

转换矩阵存储类型,具体计算公式如下:

m(x,y)=saturate_cast<rType>(α(∗this)(x,y)+β)

m 是输入矩阵,rtype 是目标类型,alpha 是放缩系数,beta 是增减标量。

这个函数也至关重要,因为在数字图像处理中,矩阵是最基本的运算单位,而矩阵的数 据类型转换全靠该函数来实现。

 

void assignTo( Mat& m, int type=-1 ) const

功能同上,将数据转换到 M 矩阵中,type 设定目标数据

 

Mat& operator = (const Scalar& s)

设置矩阵的所有像素点值为 s。

 

Mat& setTo(InputArray value, InputArray mask=noArray())

设定矩阵中部分区域的值为 value

 

Mat reshape(int cn, int rows=0) const;

改变通道数和行数或其中之一:

cn – 新的通道数。若 cn=0,那么通道数就保持不变。

rows –新的行数。 若 rows = 0, 那么行数保持不变

 

Mat reshape(int cn, int newndims, const int* newsz) const

改变通道数和数据维数或其中之一:

cn – 新的通道数。若 cn=0,那么通道数就保持不变。

newndims – 新的维数。 若 = 0, 那么维数保持不变。

newsz – 新维平面的尺寸。

MatExpr t() const;

获取转置矩阵。

 

MatExpr inv(int method=DECOMP_LU) const;

获取逆矩阵:

– DECOMP_LU 是 LU 分解一定不能是单数的。

– DECOMP_CHOLESKY 是 Cholesky LLT 只适用于对称正矩阵的分解。该类型在处理大的矩阵时的速度是 LU 的两倍左右。

– DECOMP_SVD 是 SVD 分解。如果矩阵是单数或甚至不是 2 维,函数就会计算伪反转矩阵。

 

MatExpr mul(InputArray m, double scale=1) const

矩阵按元素进行乘法运算

 

Mat cross(InputArray m) const;

矩阵差乘

 

Mat dot(InputArray m) const;

矩阵点乘

 

static MatExpr zeros(int rows, int cols, int type);

static MatExpr zeros(Size size, int type);

static MatExpr zeros(int ndims, const int* sz, int type);

设置 0 矩阵

 

static MatExpr ones(int rows, int cols, int type);

static MatExpr ones(Size size, int type);

static MatExpr ones(int ndims, const int* sz, int type);

设置 1 矩阵

 

static MatExpr eye(int rows, int cols, int type);

static MatExpr eye(Size size, int type);

设置对角线维 1 的矩阵

 

void create(int rows, int cols, int type);

void create(Size size, int type);

void create(int ndims, const int* sizes, int type);

设置类型中的变量数据

 

void addref();

refcount;成员变量自加一

该方法递增与矩阵数据关联的引用计数。如果矩阵头指向外部的数据集(见 Mat::Mat()),则引用计数为 NULL,并且该方法在这种情况下不起作用。通常情况下,为避免内存泄漏,不应显式调用该方法。它是由该矩阵赋值运算符隐式调用。在支持的它平台上,引用计数器递增是一个原子操作。因此,对相同的矩阵,在不同的线程异步操作是安全的。

 

void release();

在必要的情况下,递减引用计数并释放该矩阵。

该方法递减与矩阵的数据关联的引用计数。当引用计数减为 0 时,矩阵的数据将被释放,数据和引用计数器指针设置为 NULL。如果矩阵头指向外部数据集 (见 Mat::Mat()), 引用计数为 NULL,并且该方法在这种情况下无效。

可以手动调用此方法强制矩阵数据释放。但由于这种方法在析构函数中是自动调用的,或以更改数据指针的其他方法,因此通常不需要调用这个函数。在支持它的平台上,引用计数器递减并检查是否为 0 是一个原子操作。因此,在不同的线程异步调用相同的矩阵是安全的操作。

 

void resize(size_t sz);

void resize(size_t sz, const Scalar& s);

调整 Mat 尺寸,sz:新增加行列数量

s:新增行列数据值

void reserve(size_t sz);

调整 Mat 到只有 sz 的行列尺寸

 

void push_back_(const void* elem);

void push_back(const Mat& m)

elem –增加的一个或多个元素。m –增加的一个 Mat

该方法将一个或多个元素添加到矩阵的底部。他们是模拟相应的 STL 向量类的方法。

元素为 Mat 时,其类型和列的数目必须和矩阵容器是相同的。

 

void pop_back(size_t nelems=1);

nelems –删除的行的数目。如果它大于总的行数,则会引发异常。

该方法从底部的列表中删除一行或多行。

 

void locateROI( Size& wholeSize, Point& ofs ) const;

父矩阵内定位矩阵头。

wholeSize–输出参数,其中包含的整个矩阵包含大小 * 这是其中一部分。ofs –输出参数包含*this 在整个的矩阵里面的偏移量。你使用 Mat::row()、 Mat::col()、Mat::rowRange()、Mat::colRange()以及其他的方法从矩阵中提取子阵后该结果子阵只指向原始大矩阵的一部分。然而,每个子阵包含有助于重建的最初矩阵大小和提取子阵在原始矩阵中的位置信息(由 datastart 和 dataend fields 表示)。locateROI 方法正是这样做的。

 

Mat& adjustROI( int dtop, int dbottom, int dleft, int dright );

调整子阵大小及其在父矩阵中的位置。

dtop –顶部子阵边界向上的平移量。

dbottom –底部子阵边界向下的平移量。

dleft –左子阵边界向左的平移量。

dright –右子阵边界向右的平移量。

该方法是 Mat::locateROI() 的互补性方法。这些函数的典型应用是确定父矩阵中子阵的位置,然后以某种方式改变位置。尤其典型的是,当滤镜操作中要考虑 ROI 外的像素时就需要它。当方法的所有参数都是正的时候,ROI 需要以指定量全方位增长,例如:

A.adjustROI(2, 2, 2,2);

在此示例中,每个方向 4 元素增加矩阵大小。矩阵向左侧和上侧分别平移 2 个元素,这会产生 5 x 5 内核的滤镜所需的所有像素。你的责任是确保 adjustROI 不超出父矩阵边界。如果超出,该函数发出错误提示。OpenCV 的滤镜函数在内部调用该函数,像 filter2D(),形态学的操作,等等。

 

Mat operator()( Range rowRange, Range colRange ) const;

Mat operator()( const Rect& roi ) const;

Mat operator()( const Range* ranges ) const;

提取矩形子阵

rowRange –提取的子阵的开始和结束的行。不包括的上限。若要选择的所有行,请使用 Range::all()。

colRange –提取的子阵的开始和结束的列。不包括的上限。若要选择的所有列,请使用Range::all()。

roi – 抽出子阵 specified 作为一个矩形。

ranges – 选定范围沿每个数组维度的数组。

该运算符为*this 的子数组创建新的头。他们是 Mat::row()、Mat::col()、Mat::rowRange(),和 Mat::colRange()最普遍的形式。例如,A(Range(0, 10),Range::all()) 是相当于 A.rowRange(0,10)。与上述所有操作相同,该操作运算符是复杂度为 O(1)的操作,就是没有矩阵数据将被复制。

 

bool isContinuous() const;

返回矩阵是否连续。

//! returns true if the matrix is a submatrix of another matrix

 

bool isSubmatrix() const;

返回矩阵是否子矩阵。

 

size_t elemSize() const;

返回矩阵元素大小 (以字节为单位)。

该方法返回以字节为单位的矩阵元素大小。例如,如果矩阵类型是 CV_16SC3,该方法返回 3*sizeof(short)或 6。

 

size_t elemSize1() const;

以字节为单位返回每个矩阵元素通道的大小。

该方法返回以字节为单位的矩阵元素通道大小,也就是忽略通道的数量。例如,如果矩阵类型是 CV_16SC3,该方法返回 sizeof(short) 或 2。

 

int type() const;

返回一个矩阵元素的类型。

 

int depth() const;

返回一个矩阵元素的深度。

• 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)

 

int channels() const;

返回矩阵通道的数目。

 

size_t step1(int i=0) const;

返回矩阵归一化迈出的一步。

该方法返回以矩阵的 step 除以 Mat::elemSize1()。它对快速访问任意矩阵元素很有用。

 

bool empty() const;

如果数组有没有 elemens,则返回 true。

 

size_t total() const;

返回数组元素的总数。

 

uchar* ptr(int i0=0);

const uchar* ptr(int i0=0) const;

返回指定矩阵行的指针。

 

uchar* ptr(int i0, int i1);

const uchar* ptr(int i0, int i1) const;

返回指定二维矩阵行指针

 

uchar* ptr(int i0, int i1, int i2);

const uchar* ptr(int i0, int i1, int i2) const;

返回指定三维矩阵的行指针

 

uchar* ptr(const int* idx);

返回矩阵元素的指针

 

const uchar* ptr(const int* idx) const;

返回到矩阵元素的只读指针

 

template<typename T> T& Mat::at(int i)const

template<typename T> const T&Mat::at(int i) const

template<typename T> T& Mat::at(int i,int j)

template<typename T> const T&Mat::at(int i, int j) const

template<typename T> T& Mat::at(Pointpt)

template<typename T> const T&Mat::at(Point pt) const

template<typename T> T& Mat::at(int i,int j, int k)

template<typename T> const T&Mat::at(int i, int j, int k) const

template<typename T> T& Mat::at(constint* idx)

template<typename T> const T&Mat::at(const int* idx) const

返回对指定数组元素

i –索引 0 维度

j – 1 维度的索引

k – 沿 2 维度的索引

pt – Point(j,i) 作为指定元素的位置。

idx – Mat::dims 数组的索引。

该模板方法返回指定数组元素的引用。为了具有更高的性能,索引范围检查只在调试配置下执行。请注意使用具有单个索引 (i) 的变量可以访问的单行或单列的 2 维的数组元素。也就是比 方说,如果 A 是 1 x N 浮点矩阵 和 B 是 M x 1 的整数矩 阵,您只需编 写A. at<float>(k+4) 和 B.at<int>(2*i+1) 分别代替 A.at<float>(0,k+4)和 B.at<int>(2*i+1,0)。

 

template<typename _Tp>MatIterator_<_Tp> Mat::begin()

template<typename _Tp>MatConstIterator_<_Tp> Mat::begin() const

返回矩阵迭代器,并将其设置为第一矩阵元。

该方法返回矩阵的只读或读写的迭代器。矩阵迭代器的使用和双向 STL 迭代器的使用

是非常相似的。

 

template<typename _Tp>MatIterator_<_Tp> Mat::end()

template<typename _Tp>MatConstIterator_<_Tp> Mat::end() const

返回矩阵迭代器,并将其设置为 最后元素之后(after-last)的矩阵元。

该方法返回矩阵只读或读写的迭代器,设置为紧随最后一个矩阵元素的点。

 

 

Mat类成员

 

Mat类成员名称的含义:

序号

类名称

含义

1 

allocator

如果需要创建一个新矩阵的内存空间,系统会调用 MatAllocator 类作为分配符进行内存的分配

2 

cols

图像数组的列数

3 

data

图像数据指针

4 

dataend

图像 ROI 数据结束地址

5 

datalimit

图像 ROI 实时数据地址

6 

datastart

图像 ROI 数据起始地址

7 

dims

图像数组的维度

8 

flags

数据是非连续的标志位

9 

refcount

它记录了这个矩阵的数据被其他变量引用了多少次

10 

rows

图像数组的行数

11 

size

返回一个矩阵大小

12 

step

矩阵元素寻址。step[i]是 Mat 类中十分重要的一个属性,表示第 i 维的总大小,单位字节 .

 

其他说明:

 

int* refcount:【二次开发的关键】

它记录了这个矩阵的数据被其他变量引用了多少次。在 c++中矩阵的一些赋值操作往往只给新的变量赋予一个新的头文件,而数据部分只把数据指针指过去,而不重新分为内存,需要程序员来管理内存。这样的话就会有隐患,因为如果原始的变量的数据内存释放了,新的变量却还在,指向了已经被释放的内存区域,如果对新变量进行操作,很可能出现意想不到的问题。不过不用担心,OpenCV 的开发者早就想到了这个问题,并为我们想到了一个解决方法,那就是靠这个 refcount 来记录该数据被多少变量共用,直到最后一个变量被释放时,才释放掉这个存储数据内存块。这也是为什么类定义中 refcount 为指针,让实际记录次数的变量跟在矩阵数据最后面。

保存图像像素数据的矩阵则会随着图像的大小而改变,通常数据量会很大,比矩阵头大几个数量级。这样,在图像复制和传递过程中,主要的开销是由存放图像像素的矩阵而引起的。因此,OpenCV 使用了引用次数,当进行图像复制和传递时,不再复制整个 Mat 数据,而只是复制矩阵头和指向像素矩阵的指针,但是其矩阵指针指向同一个矩阵,也就是其中任何一个改变了矩阵数据都会影响另外一个。

这就是引用计数的作用,当 Mat 对象每被复制一次时,就会将引用计数加 1,而每销毁一个 Mat 对象(共用同一个矩阵数据)时引用计数会被减 1,当引用计数为 0 时,矩阵数据会被清理。这就是 refcount 的作用。

 

构造函数

 

空构造

Mat()

构造空的类,结构体全零初始化。

 

2D 平面构造

Mat(int rows, int cols, int type)

构造 cols 行,rows 列,数据类型为 type 的类

 

Mat(int rows, int cols, int type, const Scalar& s);

构造内容同上,增加了预装填数据 s

 

Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);

构造内容同上,使用 data 指针指向数据进行初始化装填。

 

Mat(Size size, int type)

构造行列数量为 size 内装填值的 type 类型的类

 

Mat(Size size, int type, const Scalar& s);

构造内容同上,增加了预装填数据 s

 

Mat(Size size, int type, void* data, size_t step=AUTO_STEP);

构造内容同上,使用 data 指针指向数据进行初始化装填。

//! constructor for matrix headers pointing to user-allocated data

 

nD 矩阵构建

Mat(int ndims, const int* sizes, int type);

构建带有 ndims 个 2D 平面的,大小存储在地址中的,type 类型数据矩阵类

 

Mat(int ndims, const int* sizes, int type, const Scalar& s);

构造内容同上,增加了预装填数据 s

 

Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0);

构造内容同上,使用 data 指针指向数据进行初始化装填。

 

使用 Mat 进行初始化

Mat(const Mat& m);

复制已有的 Mat,构造一个新的 Mat。其中所有的值都和已有的 Mat 相同。

 

Mat(const Mat& m, const Range& rowRange, const Range& colRange);

复制已有 Mat 的部分列(rowRange),部分行(colRange)构建一个新的 Mat 类。

 

Mat(const Mat& m, const Rect& roi);

复制由 Roi 框选的已有 Mat 类部分数据,构建一个新的类

 

Mat(const Mat& m, const Range* ranges);

复制 Mat 类总被 ranges 指针指向数据规定的范围数据,构建一个新的 Mat。

 

CvMat 格式数据初始化 Mat

Mat(const CvMat* m, bool copyData=false);

C 语言格式数据 CvMat 来构造新的 2D 格式的 Mat 类,根据 copyData 判定是否复制数据。

 

Mat(const CvMatND* m, bool copyData=false);

C 语言格式数据 CvMatND 来构造新的 ND 格式的 Mat 类,根据 copyData 判定是否复制数据。

 

Mat(const IplImage* img, bool copyData=false);

使用 OpenCV1.0 格式下最根本的图像数据存储结构体 IplImage 来构造新的 2D 格式的Mat 类,根据 copyData 判定是否复制数据。


OpenCv基本专业术语与方法
创建画布

友情链接: CSDN激萌の小宅 95知识库 自考题库 罗分明个人网络博客 精益编程leanboot

小宅博客  www.bilibili996.com All Rights Reserved. 备案号: 闽ICP备2024034575号

网站经营许可证  福建省福州市 Copyright©2021-2025 版权所有

小宅博客
首页 智能家居 地图定位
公告:小宅博客网可以开发票了,需要发票的,去群里找群主哈!!

文章作者:激萌の小宅

促销:¥0

价格:¥0

配送方式: 购买后立即生效(如购买异常,请联系站长)
付款之后一定要等待自动跳转结束,否则购买可能会失败
  • 0 天

    有效期

  • 0

    总销量

  • 2

    累计评价

OpenCV 常用函数与构造体详细说明

Mat成员函数

 

Mat成员函数如下:

序号

成员函数

功能

1 

addref

计数器参考

2 

adjustROI

调整子阵大小及其在父矩阵中的位置

3 

assignTo

提供了一个convertTo的功能形式

4 

at

返回对指定数组元素的引用

5 

begin

返回矩阵迭代器,并将其设置为第一矩阵元

6 

channels

返回矩阵通道的数目

7 

checkVector

Mat矩阵如果其深度,连续性,通道数,行列式满足一定条件的话就返回Mat元素的个数和其通道数的乘积,否则返回-1

8 

clone

创建一个数字及其基础数据的完整副本

9 

col

创建一个指定列数的矩阵头

10 

colRange

创建指定列跨度的矩阵头

11 

convertTo

在缩放或不缩放的情况下转换为另一种数据类型

12 

copySize

【查不到】

13 

copyTo

把矩阵复制到另一个矩阵中

14 

create

分配新的阵列数据 (如果需要)

15 

cross

计算3元素向量的一个叉乘积

16 

deallocate

【查不到】

17 

depth

返回一个矩阵元素的深度

18 

diag

提取或创建矩阵对角线,d = 0:全图对角线,d > 0:下半部分对角线数据,d < 0:上半部分对角线数据

19 

dot

计算两向量的点乘

20 

elemSize

返回矩阵元素大小 (以字节为单位)

21 

elemSize1

以字节为单位返回每个矩阵元素通道的大小

22 

empty

如果数组有没有 elemens,则返回 true

23 

end

返回矩阵迭代器,并将其设置为 最后元素之后(after-last)的矩阵元

24 

eye

返回一个恒等指定大小和类型矩阵

25 

inv

反转矩阵

26 

isContinuous

返回矩阵是否连续

27 

isSubmatrix

检查是否为子矩阵

28 

locateROI

父矩阵内定位矩阵头

29 

mul

执行两个矩阵按元素相乘或这两个矩阵的除法

30 

ones

返回一个指定的大小和类型的全为1的数组

31 

pop_back

从底部的列表中删除元素

32 

ptr

返回指定矩阵行的指针

33 

push_back

将元素添加到矩阵的底部

34 

push_back_

【查不到】

35 

release

在必要的情况下,递减引用计数并释放该矩阵

36 

reserve

保留一定数量的行的空间

37 

reshape

在无需复制数据的前提下改变2D矩阵的形状和通道数或其中之一

38 

resize

更改矩阵的行数

39 

row

创建一个指定行数的矩阵头

40 

rowRange

创建指定行跨度(span)的矩阵头

41 

setTo

将阵列中所有的或部分的元素设置为指定的值

42 

step1

返回矩阵归一化迈出的一步

43 

t

通过矩阵表达式(matrix expression)实现矩阵的转置

44 

total

返回数组元素的总数

45 

type

返回一个矩阵元素的类型

46 

zeros

返回指定的大小和类型的零数组

47 

~Mat

t的析构函数。

48 

operator

提供矩阵赋值操作(非函数)

49 

operator()

提取矩阵子阵

50 

operator CvMat

创建矩阵CvMat头

51 

operator IplImage

创建IplImage矩阵头

 

Mat类成员函数参数名称的含义:

序号

参数

含义

1

ndims

数组的维数

2

rows

二维数组的行数

3

cols

二维数组的列数

4

size

二维数组的尺寸Size(cols, rows),在Size()构造函数函数中行数和列数在顺序上为反转过来的

5

sizes

指定n维数组形状的整数数组

6

type

数组的类型。使用CV_8UC1,... ... ,创建1-4通道的矩阵,CV_64FC4或CV_8UC(n),... ...,CV_64FC(n)可以创建多通道(高达CV_MAX_CN通道)矩阵

7

s

一个可选的初始化每个矩阵元素的参数。要在矩阵建成后将所有元素设置为特定值可以用Mat的赋值运算符Mat:operator=(constScala& value)。

8

data

指向用户数据的指针。矩阵构造函数传入data和step参数不分配矩阵数据。相反,它们只是初始化矩阵头指向指定的数据,这意味着没有数据的复制。此操作是很高效的,可以用来处理使用 OpenCV 函数的外部数据。外部数据不会自动释放,所以你应该小心处理它。

9

step

每个矩阵行占用的字节数。如果任何值应包括每行末尾的填充字节。如果缺少此参数(设置为 AUTO_STEP),假定没有填充和实际的步长用cols*elemSize()计算。请参阅Mat::elemSize()

9

steps

多维数组(最后一步始终设置为元素大小) 的情况下的 ndims-1个步长的数组。如果没有指定的话,该矩阵假定为连续。

10

M

分配给构造出来的矩阵的阵列(作为一个整体或部分)。这些构造函数没有复制数据。相反,指向 m 的数据或它的子数组的头被构造并被关联到m上。引用计数器中无论如何都将递增。所以,当您修改矩阵的时候,自然而然就使用了这种构造函数,您还修改 m 中的对应元素。如果你想要独立的子数组的副本,请使用 Mat::clone()

11

img

指向老版本的 IplImage图像结构的指针。默认情况下,原始图像和新矩阵之间共享数据。但当 copyData 被设置时,完整的图像数据副本就创建起来了

12

vec

矩阵的元素构成的STL 向量。矩阵可以取出单独一列并且该列上的行数和矢量元素的数目相同。矩阵的类型匹配的向量元素的类型。构造函数可以处理任意的有正确声明的DataType类型。这意味着矢量元素不支持的混合型结构,它们必须是数据(numbers)原始数字或单型数值元组。对应的构造函数是显式的。由于 STL 向量不会自动转换为Mat实例,您应显式编写 Mat(vec)。除非您将数据复制到矩阵 (copyData = true),没有新的元素被添加到向量中,因为这样可能会造成矢量数据重新分配,并且因此使得矩阵的数据指针无效

13

copyData

指定STL 向量或旧型 CvMat 或 IplImage是应复制到 (true)新构造的矩阵中 还是 (false) 与之共享基础数据的标志,复制数据时,使用Mat引用计数机制管理所分配的缓冲区。虽然数据共享的引用计数为 NULL,但是分配数据必须在矩阵被析构之后才可以释放

14

rowRange

m 的行数的取值范围。正常情况下,范围开始端具有包容性和范围结束端是独占的。使用 Range::all() 来取所有的行。

15

colRange

m 列数的取值范围。使用 Range::all() 来取所有的列

16

ranges

表示M沿每个维度选定的区域的数组

17

expr

矩阵表达式。请参见“矩阵表达式”一节的内容

 

以上这些都是Mat形成一个矩阵的各类构造函数。如输出数据的自动分配中所提到的,往往默认构造函数就足够了,不同的矩阵可以由 OpenCV 函数来分配数据空间。构造的矩阵可以进一步分配给另一个矩阵或矩阵表达或通过Mat::create()获配。在前一种情况,旧的内容是间接引用的。

 

Mat_<uchar>对应的是CV_8U,

Mat_<char>对应的是CV_8S,

Mat_<int>对应的是CV_32S,

Mat_<float>对应的是CV_32F,

Mat_<double>对应的是CV_64F,对应的数据深度如下:

• 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)

 

要少使用CV_64F,但是vs的编译器又会把float数据自动变成double型,有些不太爽。

还有个需要注意的问题,就是流操作符<<对于Mat的操作,仅限于Mat是2维的情况。

还有必要说一下Mat的存储是逐行的存储的。

再说说Mat的创建,方式有两种,罗列一下:

1. 调用create(行,列,类型)

2. Mat(行,列,类型(值))。

 

成员函数详细说明

 

在 Mat 类中有着众多的成员函数,后面会对所有成员函数进行详细的功能解读。

 

Mat row(int y)

获取 y 列数据。

 

Mat col(int x) const

获取 x 值。

 

Mat rowRange(int startrow, int endrow) const

获取起始列和结束列区域的数据

 

Mat rowRange(const Range& r) const

用 r 内的数据设定起始和结束列

 

Mat colRange(int startcol, int endcol) const

获取行数据,其余同上

 

Mat colRange(const Range& r) const

获取行数据,其余同上

 

Mat diag(int d=0) const

获取对角线数据:

d = 0:全图对角线

d > 0:下帮部分对角线数据

d < 0:上半部分对角线数据

 

Mat clone() const

创建数据副本。

与 Mat1 = Mat2 不同,Mat2 被清除后 Mat1 数据也会被清除。

Mat1 = Mat2.clone()在 Mat2 被改变后 Mat1 不会被改变

 

void copyTo( OutputArray m ) const;

复制数据到 m 中

 

void copyTo( OutputArray m, InputArray mask ) const;

复制 mask 设定的部分数据到 m 中

 

void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;

转换矩阵存储类型,具体计算公式如下:

m(x,y)=saturate_cast<rType>(α(∗this)(x,y)+β)

m 是输入矩阵,rtype 是目标类型,alpha 是放缩系数,beta 是增减标量。

这个函数也至关重要,因为在数字图像处理中,矩阵是最基本的运算单位,而矩阵的数 据类型转换全靠该函数来实现。

 

void assignTo( Mat& m, int type=-1 ) const

功能同上,将数据转换到 M 矩阵中,type 设定目标数据

 

Mat& operator = (const Scalar& s)

设置矩阵的所有像素点值为 s。

 

Mat& setTo(InputArray value, InputArray mask=noArray())

设定矩阵中部分区域的值为 value

 

Mat reshape(int cn, int rows=0) const;

改变通道数和行数或其中之一:

cn – 新的通道数。若 cn=0,那么通道数就保持不变。

rows –新的行数。 若 rows = 0, 那么行数保持不变

 

Mat reshape(int cn, int newndims, const int* newsz) const

改变通道数和数据维数或其中之一:

cn – 新的通道数。若 cn=0,那么通道数就保持不变。

newndims – 新的维数。 若 = 0, 那么维数保持不变。

newsz – 新维平面的尺寸。

MatExpr t() const;

获取转置矩阵。

 

MatExpr inv(int method=DECOMP_LU) const;

获取逆矩阵:

– DECOMP_LU 是 LU 分解一定不能是单数的。

– DECOMP_CHOLESKY 是 Cholesky LLT 只适用于对称正矩阵的分解。该类型在处理大的矩阵时的速度是 LU 的两倍左右。

– DECOMP_SVD 是 SVD 分解。如果矩阵是单数或甚至不是 2 维,函数就会计算伪反转矩阵。

 

MatExpr mul(InputArray m, double scale=1) const

矩阵按元素进行乘法运算

 

Mat cross(InputArray m) const;

矩阵差乘

 

Mat dot(InputArray m) const;

矩阵点乘

 

static MatExpr zeros(int rows, int cols, int type);

static MatExpr zeros(Size size, int type);

static MatExpr zeros(int ndims, const int* sz, int type);

设置 0 矩阵

 

static MatExpr ones(int rows, int cols, int type);

static MatExpr ones(Size size, int type);

static MatExpr ones(int ndims, const int* sz, int type);

设置 1 矩阵

 

static MatExpr eye(int rows, int cols, int type);

static MatExpr eye(Size size, int type);

设置对角线维 1 的矩阵

 

void create(int rows, int cols, int type);

void create(Size size, int type);

void create(int ndims, const int* sizes, int type);

设置类型中的变量数据

 

void addref();

refcount;成员变量自加一

该方法递增与矩阵数据关联的引用计数。如果矩阵头指向外部的数据集(见 Mat::Mat()),则引用计数为 NULL,并且该方法在这种情况下不起作用。通常情况下,为避免内存泄漏,不应显式调用该方法。它是由该矩阵赋值运算符隐式调用。在支持的它平台上,引用计数器递增是一个原子操作。因此,对相同的矩阵,在不同的线程异步操作是安全的。

 

void release();

在必要的情况下,递减引用计数并释放该矩阵。

该方法递减与矩阵的数据关联的引用计数。当引用计数减为 0 时,矩阵的数据将被释放,数据和引用计数器指针设置为 NULL。如果矩阵头指向外部数据集 (见 Mat::Mat()), 引用计数为 NULL,并且该方法在这种情况下无效。

可以手动调用此方法强制矩阵数据释放。但由于这种方法在析构函数中是自动调用的,或以更改数据指针的其他方法,因此通常不需要调用这个函数。在支持它的平台上,引用计数器递减并检查是否为 0 是一个原子操作。因此,在不同的线程异步调用相同的矩阵是安全的操作。

 

void resize(size_t sz);

void resize(size_t sz, const Scalar& s);

调整 Mat 尺寸,sz:新增加行列数量

s:新增行列数据值

void reserve(size_t sz);

调整 Mat 到只有 sz 的行列尺寸

 

void push_back_(const void* elem);

void push_back(const Mat& m)

elem –增加的一个或多个元素。m –增加的一个 Mat

该方法将一个或多个元素添加到矩阵的底部。他们是模拟相应的 STL 向量类的方法。

元素为 Mat 时,其类型和列的数目必须和矩阵容器是相同的。

 

void pop_back(size_t nelems=1);

nelems –删除的行的数目。如果它大于总的行数,则会引发异常。

该方法从底部的列表中删除一行或多行。

 

void locateROI( Size& wholeSize, Point& ofs ) const;

父矩阵内定位矩阵头。

wholeSize–输出参数,其中包含的整个矩阵包含大小 * 这是其中一部分。ofs –输出参数包含*this 在整个的矩阵里面的偏移量。你使用 Mat::row()、 Mat::col()、Mat::rowRange()、Mat::colRange()以及其他的方法从矩阵中提取子阵后该结果子阵只指向原始大矩阵的一部分。然而,每个子阵包含有助于重建的最初矩阵大小和提取子阵在原始矩阵中的位置信息(由 datastart 和 dataend fields 表示)。locateROI 方法正是这样做的。

 

Mat& adjustROI( int dtop, int dbottom, int dleft, int dright );

调整子阵大小及其在父矩阵中的位置。

dtop –顶部子阵边界向上的平移量。

dbottom –底部子阵边界向下的平移量。

dleft –左子阵边界向左的平移量。

dright –右子阵边界向右的平移量。

该方法是 Mat::locateROI() 的互补性方法。这些函数的典型应用是确定父矩阵中子阵的位置,然后以某种方式改变位置。尤其典型的是,当滤镜操作中要考虑 ROI 外的像素时就需要它。当方法的所有参数都是正的时候,ROI 需要以指定量全方位增长,例如:

A.adjustROI(2, 2, 2,2);

在此示例中,每个方向 4 元素增加矩阵大小。矩阵向左侧和上侧分别平移 2 个元素,这会产生 5 x 5 内核的滤镜所需的所有像素。你的责任是确保 adjustROI 不超出父矩阵边界。如果超出,该函数发出错误提示。OpenCV 的滤镜函数在内部调用该函数,像 filter2D(),形态学的操作,等等。

 

Mat operator()( Range rowRange, Range colRange ) const;

Mat operator()( const Rect& roi ) const;

Mat operator()( const Range* ranges ) const;

提取矩形子阵

rowRange –提取的子阵的开始和结束的行。不包括的上限。若要选择的所有行,请使用 Range::all()。

colRange –提取的子阵的开始和结束的列。不包括的上限。若要选择的所有列,请使用Range::all()。

roi – 抽出子阵 specified 作为一个矩形。

ranges – 选定范围沿每个数组维度的数组。

该运算符为*this 的子数组创建新的头。他们是 Mat::row()、Mat::col()、Mat::rowRange(),和 Mat::colRange()最普遍的形式。例如,A(Range(0, 10),Range::all()) 是相当于 A.rowRange(0,10)。与上述所有操作相同,该操作运算符是复杂度为 O(1)的操作,就是没有矩阵数据将被复制。

 

bool isContinuous() const;

返回矩阵是否连续。

//! returns true if the matrix is a submatrix of another matrix

 

bool isSubmatrix() const;

返回矩阵是否子矩阵。

 

size_t elemSize() const;

返回矩阵元素大小 (以字节为单位)。

该方法返回以字节为单位的矩阵元素大小。例如,如果矩阵类型是 CV_16SC3,该方法返回 3*sizeof(short)或 6。

 

size_t elemSize1() const;

以字节为单位返回每个矩阵元素通道的大小。

该方法返回以字节为单位的矩阵元素通道大小,也就是忽略通道的数量。例如,如果矩阵类型是 CV_16SC3,该方法返回 sizeof(short) 或 2。

 

int type() const;

返回一个矩阵元素的类型。

 

int depth() const;

返回一个矩阵元素的深度。

• 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)

 

int channels() const;

返回矩阵通道的数目。

 

size_t step1(int i=0) const;

返回矩阵归一化迈出的一步。

该方法返回以矩阵的 step 除以 Mat::elemSize1()。它对快速访问任意矩阵元素很有用。

 

bool empty() const;

如果数组有没有 elemens,则返回 true。

 

size_t total() const;

返回数组元素的总数。

 

uchar* ptr(int i0=0);

const uchar* ptr(int i0=0) const;

返回指定矩阵行的指针。

 

uchar* ptr(int i0, int i1);

const uchar* ptr(int i0, int i1) const;

返回指定二维矩阵行指针

 

uchar* ptr(int i0, int i1, int i2);

const uchar* ptr(int i0, int i1, int i2) const;

返回指定三维矩阵的行指针

 

uchar* ptr(const int* idx);

返回矩阵元素的指针

 

const uchar* ptr(const int* idx) const;

返回到矩阵元素的只读指针

 

template<typename T> T& Mat::at(int i)const

template<typename T> const T&Mat::at(int i) const

template<typename T> T& Mat::at(int i,int j)

template<typename T> const T&Mat::at(int i, int j) const

template<typename T> T& Mat::at(Pointpt)

template<typename T> const T&Mat::at(Point pt) const

template<typename T> T& Mat::at(int i,int j, int k)

template<typename T> const T&Mat::at(int i, int j, int k) const

template<typename T> T& Mat::at(constint* idx)

template<typename T> const T&Mat::at(const int* idx) const

返回对指定数组元素

i –索引 0 维度

j – 1 维度的索引

k – 沿 2 维度的索引

pt – Point(j,i) 作为指定元素的位置。

idx – Mat::dims 数组的索引。

该模板方法返回指定数组元素的引用。为了具有更高的性能,索引范围检查只在调试配置下执行。请注意使用具有单个索引 (i) 的变量可以访问的单行或单列的 2 维的数组元素。也就是比 方说,如果 A 是 1 x N 浮点矩阵 和 B 是 M x 1 的整数矩 阵,您只需编 写A. at<float>(k+4) 和 B.at<int>(2*i+1) 分别代替 A.at<float>(0,k+4)和 B.at<int>(2*i+1,0)。

 

template<typename _Tp>MatIterator_<_Tp> Mat::begin()

template<typename _Tp>MatConstIterator_<_Tp> Mat::begin() const

返回矩阵迭代器,并将其设置为第一矩阵元。

该方法返回矩阵的只读或读写的迭代器。矩阵迭代器的使用和双向 STL 迭代器的使用

是非常相似的。

 

template<typename _Tp>MatIterator_<_Tp> Mat::end()

template<typename _Tp>MatConstIterator_<_Tp> Mat::end() const

返回矩阵迭代器,并将其设置为 最后元素之后(after-last)的矩阵元。

该方法返回矩阵只读或读写的迭代器,设置为紧随最后一个矩阵元素的点。

 

 

Mat类成员

 

Mat类成员名称的含义:

序号

类名称

含义

1 

allocator

如果需要创建一个新矩阵的内存空间,系统会调用 MatAllocator 类作为分配符进行内存的分配

2 

cols

图像数组的列数

3 

data

图像数据指针

4 

dataend

图像 ROI 数据结束地址

5 

datalimit

图像 ROI 实时数据地址

6 

datastart

图像 ROI 数据起始地址

7 

dims

图像数组的维度

8 

flags

数据是非连续的标志位

9 

refcount

它记录了这个矩阵的数据被其他变量引用了多少次

10 

rows

图像数组的行数

11 

size

返回一个矩阵大小

12 

step

矩阵元素寻址。step[i]是 Mat 类中十分重要的一个属性,表示第 i 维的总大小,单位字节 .

 

其他说明:

 

int* refcount:【二次开发的关键】

它记录了这个矩阵的数据被其他变量引用了多少次。在 c++中矩阵的一些赋值操作往往只给新的变量赋予一个新的头文件,而数据部分只把数据指针指过去,而不重新分为内存,需要程序员来管理内存。这样的话就会有隐患,因为如果原始的变量的数据内存释放了,新的变量却还在,指向了已经被释放的内存区域,如果对新变量进行操作,很可能出现意想不到的问题。不过不用担心,OpenCV 的开发者早就想到了这个问题,并为我们想到了一个解决方法,那就是靠这个 refcount 来记录该数据被多少变量共用,直到最后一个变量被释放时,才释放掉这个存储数据内存块。这也是为什么类定义中 refcount 为指针,让实际记录次数的变量跟在矩阵数据最后面。

保存图像像素数据的矩阵则会随着图像的大小而改变,通常数据量会很大,比矩阵头大几个数量级。这样,在图像复制和传递过程中,主要的开销是由存放图像像素的矩阵而引起的。因此,OpenCV 使用了引用次数,当进行图像复制和传递时,不再复制整个 Mat 数据,而只是复制矩阵头和指向像素矩阵的指针,但是其矩阵指针指向同一个矩阵,也就是其中任何一个改变了矩阵数据都会影响另外一个。

这就是引用计数的作用,当 Mat 对象每被复制一次时,就会将引用计数加 1,而每销毁一个 Mat 对象(共用同一个矩阵数据)时引用计数会被减 1,当引用计数为 0 时,矩阵数据会被清理。这就是 refcount 的作用。

 

构造函数

 

空构造

Mat()

构造空的类,结构体全零初始化。

 

2D 平面构造

Mat(int rows, int cols, int type)

构造 cols 行,rows 列,数据类型为 type 的类

 

Mat(int rows, int cols, int type, const Scalar& s);

构造内容同上,增加了预装填数据 s

 

Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);

构造内容同上,使用 data 指针指向数据进行初始化装填。

 

Mat(Size size, int type)

构造行列数量为 size 内装填值的 type 类型的类

 

Mat(Size size, int type, const Scalar& s);

构造内容同上,增加了预装填数据 s

 

Mat(Size size, int type, void* data, size_t step=AUTO_STEP);

构造内容同上,使用 data 指针指向数据进行初始化装填。

//! constructor for matrix headers pointing to user-allocated data

 

nD 矩阵构建

Mat(int ndims, const int* sizes, int type);

构建带有 ndims 个 2D 平面的,大小存储在地址中的,type 类型数据矩阵类

 

Mat(int ndims, const int* sizes, int type, const Scalar& s);

构造内容同上,增加了预装填数据 s

 

Mat(int ndims, const int* sizes, int type, void* data, const size_t* steps=0);

构造内容同上,使用 data 指针指向数据进行初始化装填。

 

使用 Mat 进行初始化

Mat(const Mat& m);

复制已有的 Mat,构造一个新的 Mat。其中所有的值都和已有的 Mat 相同。

 

Mat(const Mat& m, const Range& rowRange, const Range& colRange);

复制已有 Mat 的部分列(rowRange),部分行(colRange)构建一个新的 Mat 类。

 

Mat(const Mat& m, const Rect& roi);

复制由 Roi 框选的已有 Mat 类部分数据,构建一个新的类

 

Mat(const Mat& m, const Range* ranges);

复制 Mat 类总被 ranges 指针指向数据规定的范围数据,构建一个新的 Mat。

 

CvMat 格式数据初始化 Mat

Mat(const CvMat* m, bool copyData=false);

C 语言格式数据 CvMat 来构造新的 2D 格式的 Mat 类,根据 copyData 判定是否复制数据。

 

Mat(const CvMatND* m, bool copyData=false);

C 语言格式数据 CvMatND 来构造新的 ND 格式的 Mat 类,根据 copyData 判定是否复制数据。

 

Mat(const IplImage* img, bool copyData=false);

使用 OpenCV1.0 格式下最根本的图像数据存储结构体 IplImage 来构造新的 2D 格式的Mat 类,根据 copyData 判定是否复制数据。