参考网址:
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 的大小
所以,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;