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的属性了解不足。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的区别的主要内容,如果未能解决你的问题,请参考以下文章