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数字那是随便画上去的~)
人到了一定岁数,自己就得是那个屋檐,再也没有地方可以躲雨。
——致自己
领取专属 10元无门槛券
私享最新 技术干货