opencv中MatND和Mat的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv中MatND和Mat的区别相关的知识,希望对你有一定的参考价值。

opencv中MatND和Mat两个函数有什么区别?

首先它们并不是函数,只是两个数据类型

 

OpenCV2.2以前的版本里它们稍微有点区别:

Mat特指2维矩阵

MatND是多维矩阵(>=3维)

 

但2.2以后它们被统一成Mat,Mat可以表示任意维矩阵

所以没必要在意MatND和Mat的区别,如果你用的是2.2以后的版本,统一使用Mat就行了。

 

参考技术A   简单的说,Mat特指2维矩阵,MatND是多维矩阵(>=3维);
  Mat对象提供了size()、channels()和depth()等方法分别获得图像的大小、通道数和数值类型。上面的例子中,图像img的宽为512个像素,高为393个像素,有3个通道(channels),即图像中的每个像素的颜色用三个数值表示。每个通道的数值类型(depth)的编号为0,0表示无符号8bit整数。
  MatND对象使用size和step属性保存每个轴的长度和每个轴的字节偏移量,它们和NumPy数组的shape和strides属性类似。但是这两个属性都是长度固定为32的整数数组。

OpenCV中Mat的属性

OpenCV中Mat的属性

 

 

最近在做一OpenCV的图像轮廓检验,但当用到霍夫变换时才发现对Mat的属性了解不足。Mat在OpenCV中的地位是及其重要的,因此有必要做一个总结。

 

大体上来说,Mat是一个类,由两个数据部分组成:矩阵头(包括矩阵尺寸、存储方法、存储地址等信息)和指向数据部分的指针。

 

 

 

  • 矩阵头部分

 

dims->矩阵的维度

 

rows->矩阵的行数

 

cols->矩阵的列数

 

size->矩阵的大小,size(cols,rows)

 

channels->矩阵元素拥有的通道数。

 

type->矩阵中元素的类型以及矩阵的通道个数,为一些预定常量,CV_(位数)+(数据类型)+(通道数),如:CV_8UC1表示元素类型是一个8位无符号整数,通道数为1。数据类型中U-无符号整数,S-有符号整数,F-浮点数。具体值如下 

 

CV_8UC1 CV_8UC2 CV_8UC3 CV_8UC4
CV_8SC1 CV_8SC2 CV_8SC3 CV_8SC4
CV_16UC1 CV_16UC2 CV_16UC3 CV_16UC4
CV_16SC1 CV_16SC2 CV_16SC3 CV_16SC4
CV_32SC1 CV_32SC2 CV_32SC3 CV_32SC4
CV_32FC1 CV_32FC2 CV_32FC3 CV_32FC4
CV_64FC1 CV_64FC2 CV_64FC3 CV_64FC4

 

depth->矩阵中元素的一个通道的数据类型,对应于0,1,2,3,4,5,6的预定义常量为:

 

CV_8U,CV_8S,CV_16U,CV_16S,CV_32S,CV_32F,CV_64F

 

elemSize->矩阵一个元素占用的字节数,例如:type是CV_16CS3,那么elemSize=3*16/8=6B

 

elemSize1->矩阵元素一个通道占用的字节数,例如:type是CV_16SC3,那么elemSize1=16/8=2B

 

还有一个比较复杂的step稍后将补充。

 

以上是关于opencv中MatND和Mat的区别的主要内容,如果未能解决你的问题,请参考以下文章

以下 3 个 opencv Mat 实例有啥区别?

OpenCV:Mat,IplImage,CvMat类型转换

cvMat、Mat 和 IpImage 的区别

图像的opencv中以下两行之间有啥区别

opencv编程中cvMat到Mat如何进行数据转换?

OPenCV中累加一个三通道矩阵中的所有元素: