学计算机视觉不得不了解的Mat类

01

cv::Mat类简介

cv::Mat用于大型矩阵类型,这可以说是Opencv库整个c++实现的核心类。OpenCV库中绝大多数函数都是cv::Mat类的成员函数,或者以cv::Mat作为参数,或者以cv::Mat作为返回值,而利用OpenCV做各类计算机视觉的任务,Mat类型的矩阵数组更是必须要了解的,接下来我将详细的为大家分析该种类型的内部逻辑。

cv::Mat类用于表示任意维度的dense数组。大多数图像数据都是存储在dense数组中,当然与之对应的就是sparse数组。

dense数组:对于数组中的每个元素,内存中都存储了一个与当前元素对应的数据值,即使该元素值为零。

sparse数组:存储的是非零项。如果许多元素值实际上为零,那么这会节省大量存储空间。(Opencv中永cv::SpareseMat类表述sparse数组。)

Note:若你对opencv2.1之前的版本较熟悉,你可能记得IplImage,CvMat。但在之后的版本中,这些类都没了,都被cv::Mat取代。

02

cv::Mat类对象创建——构造函数法

该种创建Mat数组的方式不指定维度,所有维度默认为二维。若需要创建多维数组,则需要利用上述的第二种方式(后文在阐述),参数详解:。

3:表示的是创建的二维数组,第一维(行)为3。

10:表示的是创建的二维数组,第二维(列)为10。

cv::Scalar::all( 0 ):表示将数组所有元素初始化为0。

CV_32FC3:表示数组元素为32位浮点型,通道数为3。

CV_32FC3这个参数,即指定了元素类型,也指定了通道数。所有可能的类型都在头文件中定义了,一共有6*4=24种组合:CV_。这些格式的具体解释如下:

上一个例子中没有指定数组维度,因此默认为2维数组。然而在某些例子中需要用到多维数组,因此需要指定数组的维数。代码各参数详解如下:

int sz[] = { 3,4,5 }: 该参数用来指定多维数组各个维度的维度值,本例中表示三维数组的行为3,列为4,纵向为5。

3:根据用户需要创建的维数指定,本例中创建三维数组,而且上个参数int sz[] = { 3, 4, 5 },大括号内参数的个数要等于当前参数:3。

sz:将预先定义好的多维度中每个维度的大小输入。

CV_32FC3:同上。

cv::Scalar::all( 0 ):同上。

03

cv::Mat类对象创建——成员函数法

利用Mat类提供的成员函数可以创建一些特定类型的数组,该方案相对比较简单,就不做过多解释了。

04

两张图告诉你维度和通道的区别

上面利用构造过程创建数组的两个方法中,提到了多维度和多通道,那么维度和通道之间到底有什么区别呢?下面两张图(画了好久....)能够清晰的告诉你两者的区别。

图一:维度为2(只有X,Y),通道为3。

图二:维度为3(有X,Y,Z),通道为3。

所以我们传统意义上的彩色图像(RGB三通道),维度为2,就是如图一所示的结构。(不用在意图中的0,1数字那是随便画上去的~)

人到了一定岁数,自己就得是那个屋檐,再也没有地方可以躲雨。

——致自己

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181225G05N3800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券