Mat中的depth、dims、channels、step、data、elemSize

参考网址:

http://www.douban.com/note/265479171/



Mat:用于表示一个单通道或者多通道的稠密数组

相当于原先版本的:CvMat、CvMatND、IplImage

矩阵(M)中的数据元素的地址计算公式:

addr(Mi0,i1,,,,,,,,,im-1)=M.data+M.step[0]*i0+M.step[1]*i1+,,,,,,,,,,,,,,+M.step[m-1]*i1-1

其中,m=M.dims  即M的维度


data:Mat对象中的一个指针,指向内存中存放矩阵数据的一块内存(uchar* data)

dims:Mat所代表的矩阵的维度,例如:3*4  则维度为2 ,       3*4*5则维度为3

channels:通道,矩阵中每一个矩阵元素拥有的元素个数。比如:3*4矩阵中一共有12个元素,如果每个元素

有三个值,则即这个矩阵是三通道的,即channels=3,常见的一张彩色图片有r,g,b三个通道。

depth:深度,即每个像素的位数,opencv中Mat.depth中得到一个0-6的数字,分别表示不同的位数。

enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 }; 

可见 0和1都代表8位, 2和3都代表16位,4和5代表32位,6代表64位;

step:一个数组,定义了矩阵的布局,step1=step/eleSize1,

Mat中的step是一个MStqp的一个实例,

step是size_t类型的,c++中size_t即unsigned int类型的,

typedef unsigned int size_t

即size_t是无符号整数

step[0]是矩阵中一行元素的字节数

step[1]是矩阵中一个元素的字节数,即和elemSize相等

另外注意 step1 (step / elemSize1),M.step[m-1] 总是等于 elemSize,M.step1(m-1)总是等于 channels;

  • elemSize : 矩阵中每一个元素的数据大小,如果Mat中的数据的数据类型是 CV_8U 那么 elemSize = 1,CV_8UC3 那么 elemSize = 3,CV_16UC2 那么 elemSize = 4;记住另外有个 elemSize1 表示的是矩阵中数据类型的大小,即 elemSize / channels 的大小
http://tmjfzy.blog.163.com/blog/static/66447025201261052543349/




所以,step[0]/step[1]好像就是cols,列数了。

因为step[0]是一行所占的字节数,

step[1]是一个元素所占的字节数

step的种种:

面、线、点

M.step[m-1]总是等于eleSize,M.step1(m-1)总是等于channels

elemSize:矩阵中的每一个元素的数据大小 elemSize1表示的是矩阵中数据类型的大小,即elemSize/channels,

例如:3*4的矩阵,假设其数据类型是CV_8U 即单通道的uchar类型。

这是一个二维矩阵,那么维度为2(M.dims==2)

M.rows=3,M.cols==4

sizeof(uchar)=1,则每一个数据元素的大小为1 M.elemSize()==1 M.elemSize1()==1

M.elemSize()==1,M.elemSize()==1;

CV_8U得到M.depth()=0,M.channels()==1;

因为是二维矩阵,所以step数组只有两个值。,step[0],step[1]分别代表一行的数据大小和一个元素的数据大小,

M.step[0]==4;M.step[1]==1;

M.step1(0)=M.cols=4;

M.step1(1)==1;


若假设上面的矩阵数据类型是CV_8UC3,即三通道。

M.dims==2;

M.channels=3;

M.depth()==0;

M.elemSize()==3(每个元素包含3个uchar类型的值)

M.elemSize1()==1(elemSize/channels)

M.step[0]==M.cols*M.elemSize()==12

M.step[1]==M.channels()*M.elemSize1()==M.elemSize()==3;

M.step(0)==M.cols*M.channels()==12=M.step[0]/M.elemSize1()==12/1;

M.step(1)=M.channels()==3==M.step[1]/elemSize1()==3/1==1;


1、elemSize 和channels什么关系:

channels则从数据类型中可以直接看到

elemSize=elemSize1*channels;

而enelSize1则即数据类型中的元素的类型的所占的空间的大小。



2、elemSize和elemSize1什么关系:

2、M.elemSize1()=szeof(元素类型)   即elemSize表示矩阵中数据类型的大小,即elemSize/channels的大小

M.elemSize=M.elemSize1()*M.channels()=M.step[M.dims-1]

channels即列里还有几个元素

elemSize1 即存储类型的占用的size

elemSize:一列中占的总的size 即elemSize1()*channels();



3、step和step1什么关系:

step中有几个是与维度有关的。

而step(1)与step[1]的对应关系则是:

M.step1(0)==M.step[0]/M.elemSize1();

M.step1(1)==M.step[1]/M.elemSize1();

M.step1(2)==M.step[2]/M.elemSize1()=channels;

而M.step[0],M.step[1],step[2]的计算则如下:

M.step[0]==4*6*M.elemSize();

M.step[1]==6*M.elemSize();

M.step[2]==M.elemSize();




例如3*4*6矩阵,则CV_16SC4


M.dims=3;

M.channels()==4;

M.elemSize1()==sizeof(short)==2;

M.rows=M.rows==-1;                好像有一项规定就是当大于二维的时候的行和列都定义为-1...................................................

  • size 矩阵的大小,size(cols,rows),如果矩阵的维数大于2,则是size(-1,-1)

M.elemSize()==M.elemSize1()*M.channels()=M.step[M.dims-1]==M.step[2]==2*4==8;

M.step[0]==4*6*M.elemSize()=192=4*6*8;

M.step[1]==6*M.elemSize()=6*8==48;

M.step[2]==M.elemSize()==8;

M.step1(0)==M.step[0]/M.elemSize1()==192/2==96;

M.step1(1)==M.step[1]/M.elemSize1()==48/2=24;

M.step1(2)==M.step[2]/M.elemSize1()==8/2=4=channels;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值