openCV:Mat对象详解和使用

Mat对象

Mat是OpenCV中用来存储图像信息的内存对象,可以理解为一个包含所有强度值的像素点矩阵,另外包含其他信息(宽,高,类型,纬度,大小,深度等)。

当你使用Mat对象时会自动为你分配内存空间,不用再像openCV2.x.x版本之前一样使用IplImage还要自己分配内存空间。

Mat对象使用

首先是最简单的使用:

Mat a;
a = imread("...");

定义一个Mat对象a后使用imread函数读取一张图片。

我们还能这样使用Mat:

Mat a,b;
a=imread("...");
b=Mat(a.size(),a.type());

首先定义一个Mat对象a并读取一张图片后定义一个Mat对象b,并且这个对象b的大小和格式与a是一样的。

Mat a,b;
a=imread("...");
b=Mat(a.size(),a.type());
b=Scalar(255,255,255);

因为我们刚才只是定义了一个Mat对象b的框架所以我们可以使用Scalar函数来让b这个对象生成一张图片,图片的颜色为白色(因为三原色的值都为255所以是白色)。

Mat a,b;
a=imread("...");
b=a.clon();

如果我们想要完全复制一张照片要怎么办呢?这时我们就可以使用clon()这个函数了,clon()是全复制你不需要担心因为改变了对象a的数值而会导致对象b的数值随着a改变而改变。

Mat a,b;
a = imread("..");
a.copyTo(b);

copyTo()函数和clon()函数也是一样的效果,你可以根据自己的喜好去使用。

Mat a,b;
a = imread("..");
cvtColor(a,b,COLOR_BGR2GRAY);

cvtColor()函数可以将a复制到b并且以COLOR_BGR2GRAY的形式展现给你,在这里COLOR_BGR2GRAY是参数名称灰度图的意思。你可以根据需要使用其它参数。

Mat a(3,3,CV_8UC3,Scalar(50,100,200);
cout<<a<<endl;
namedWindow("test",CV_WINDOW_AUTOSIZE);
imshow("test",a);

我们同样可以使用Mat对象创建一个x*x的矩阵,并根据参数CV_8UC3来为它每个像素点来设置数值为(50,100,200)。需要解释一下的是C3代表的是Channel 3,意味着我们这张图片每个像素点有3个通道分别对应的是三原色(RGB),而后面的数值(50,100,200)就是三原色的数值(当然你可以根据需要自己变)。

除了三通道还有一通道,也就是灰度图(还记得上文哪有提到过🐎?)

Mat a = Mat::eye(5, 5, CV_8UC1);

我们可以通过上面这种形式来对对象a进行初始化,这里的eye代表最后出现的矩阵是以对角线形式出现的

你可以修改参数为zeros,这样它就会把矩阵通通初始化为0:

 

Mat对象差不多就讲到这儿了,光看没有用建议打开电脑自己也来操作一遍这样印象才深刻嗷!