OpenCV图像处理入门即巅峰:Mat类

环境

操作系统:win10
工具:VS2019、OpenCV4.0.0

1. 什么是Mat?

Mat是Matrix(复数Maxtrices)的简称,意为矩阵。用于存储图像的像素(pixel)的类。通俗一点说它就是代表一张图像,操作它就是对图像操作。

2.Mat的常用构造函数

Mat():默认构造函数
Mat(int rows, int cols, int type):rows:代表一行有多少个pixels cols:代表一列有多少pixels type:一个pixels的大小。
常用的type有:
#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
#define CV_8UC2 CV_MAKETYPE(CV_8U,2)
#define CV_8UC3 CV_MAKETYPE(CV_8U,3)
#define CV_8UC4 CV_MAKETYPE(CV_8U,4)
以CV_8UC1为例,CV前缀就不用说了,8代表8 bits,UC是unsigned char(8bits),1代表个数,合起来是每个像素用1个8bits存储,

Mat(int rows, int cols, int type, const Scalar& s):Scalar类是用于初始化每个pixel,它的数据格式由type而定,CV_8UC3对应cv::Scalar(x, y, z) CV_8UC1对应cv::Scalar(x)等等。x,y,z取值位0~255,是BGR,而不是RGB。
Mat(const Mat& m):将另一个Mat赋值这个Mat,注意这里给的是地址,而不是Matrices,也就是说两个互相影响,举个例子,Mat A;Mat B=A;如果A的pixels矩阵发生改变,B的也会改变。如果要复制数据应该用Mat的clone、copy成员函数,Mat F = A.clone(); Mat G; A.copyTo(G);

3.Mat的常用成员函数

void create(int rows, int cols, int type):该成员函数用几个重载,用法跟前面的构造函数相似,只不过是定义完之后然后对其Matrices进行操作
Mat A;//调用默认构造函数Mat()
A.Create(100,100,CV_8UC3);//像素类型CV_8UC3,分辨率100*100
Mat B(100,100,CV_8UC3);//与A效果相同

uchar ptr(int row, int col)*:该成员函数返回位置第row行第col列的pixel指针,可以对该pixel数据进行操作。栗子:
Mat grayim(2, 2, CV_8UC1);
grayim(0,0) = 255;
这样第0行第0列的pixel数据就变成255了
_Tp ptr(int y)
:这个成员跟上面的类似,功能都一样。官方教程有这么一段:
Mat grayim(2, 2, CV_8UC1);
grayim.ptr(0)[1] = 255;
这里使用了模板,指定模板类型位uchar然后选定第0行,至于后面的[1]是进行的运算符重载,像对数组进行操作一样。同样也是对第0行第1列赋值为255;
Mat col(int x) const和Mat row(int y) const:返回指定行和返回指定列的Mat,可以用于查看
指定行和指定列的Mat,或者组合使用查看指定列和行的pixel
Mat grayim(2, 2, CV_8UC1);
Mat col = grayim.col(0);//返回第0列的mat
Mat row = grayim.row(0);//返回第0行的mat
Mat pixel = grayim.col(0).row(0)//返回第0列第0行mat,这里返回也就是pixel了

bool empty() const:Mat是否为空

3.成员变量

int rows, cols:列和行的数值

猜你喜欢

转载自blog.csdn.net/weixin_44653197/article/details/90072991