1.基础成员
(1)类型成员
int flags:与深度和通道数等相关
int depth():CV_[位数8/16/32/64][类型U/S/F]
int type():CV_[位数8/16/32/64][类型U/S/F][前缀C][通道数1/2/3/4/(X)]
int channels():通道数
(2)维度成员
int dims:维数且恒≥2
Matsize size:size[k]=p[k]=第k维点数,cout<<size有效
dims=3时{面数,行数,列数},dims=2时{行数,列数}
MatStep step:step[k]=p[k]=第k维跨度,cout<<step在dims=2时有效且等于step[0]
dims=3时{面跨度,行跨度,点跨度},dims=2时{行跨度,点跨度}
buf[2]={行跨度,点跨度}但dims>2时buf[0]=buf[1]=0
int total(), step1(k):点总数,第k维度基元数且等于step[k]/elemSize1()
------------------------------------------------------------------------------------------
int cols, rows:列数和行数但dims>2都为-1
Size size():{次维度点数或列数,首维度点数或行数}
int elemSize(), elemSize1():首维度跨度或点跨度,基元字节数
(3)地址成员
uchar *data:首地址
uchar *datastart:ROI首地址
uchar *dataend:尾地址
uchar *datalimit:保留尾地址(调用resize+reserve+pop_back等会使用)
(4)其它成员
(1)checkVector(num, dp=-1, requireContinuoues=true)=int
1)基要求:depth==dp&&isContinuous==requireContinuoues
2)对矩阵:(cols==1&&channels=num)||(cols==num&&channels==1))
3)对体阵:channels==1&&((planes>0&&rows==1)||(planes==1&&rows>0))
4)返回值:满足要求返回total*channels/num,不满足要求返回-1
(2)isContinous()=bl:内存是否连续分布
(3)isEmpty()=bl:是否为空矩阵
(4)isSubmatrix()=bl:是否为子矩阵,对adjustROI无效(即返回0)
(5)reshape(chns, rows=0)=mat:修改通道数和行数,0表示不修改
2.类型转换
(1)Mat到CvMat(浅复制):cvmat(mat),行数列数类型步长及首地址全一致
(2)CvMat到Mat(浅复制):用cvmat的行数列数类型步长及首地址创建mat
(3)Mat到Matx(深复制):matx(mat),若要浅复制做采用CvMat到Mat方法
(4)Matx到Mat(深复制):mat(matx),由于Matx本身的特性无法实现浅复制
(5)Matx与CvMat:cvMat(rows, cols, type, data=0),注意不支持特殊步长
(6)创建CvMat:cvCreateMat(rows, cols, type),注意不支持特殊步长
3.创建与赋值
(1)构造函数
Mat([dims,] sizes, type[, scalar])●Mat([dims,] sizes, type, data, steps=0)
Mat()●Mat(rows, cols, type[, scalar])●Mat(size, type[, scalar])
Mat(rows, cols, type, data, step=AUTO_STEP)●Mat(size, type, data, step=AUTO_STEP)
(2)静态函数
zeros(dims, sizes, type)●zeros(rows, cols, type)●zeros(size, type)
ones(dims, sizes, type)●ones(rows, cols, type)●ones(size, type)
eye(rows, cols, type)●eye(size, type) diag(mat1D)
(3)重建函数:create(dims, sizes)●create(rows, cols)●create(size)
(4)赋值函数
1)赋不同值:Mat_<type>(m,n)<<A11…Amn;mat<< A11…Amn;初始化列表(C++11);
2)赋相同值:mat=val;setTo(val, mask=noArray())
(5)Mat_<type>:以上函数移除type参数
4.访问与遍历
(1)访问数值:at<type>(pt)●at(i,j)●at(k,i,j)●at(ids)●at(vec),对于Mat_<type>可直接用运算符(xxx)
(2)访问地址:ptr<type>(i)●ptr(i,j)●ptr(k,i,j)●ptr(ids)●ptr(vec)
(3)用迭代器:begin<type>和end<type>,对Mat_<type>无模板参数
(4)用lambda:forEach<type>(lambda),lambda的函数参数类型至少包含Type
(5)手动地址:基于地址成员和维度成员可算出某点和某基元的地址
5.访问子区域
(1)单行和单列:row(i)=mat,col(j)=mat
(2)多行和多列:rowRange(a,b)=mat,colRange(c,d)=mat,子区域包含a和c不包含b和d
(3)特定子区域:mat(Rect(i,j,w,h)),mat(Range(a,b), Range(c,d)),子区域边界包含情况同上
(4)原位子区域:adjustROI(top, bttm, left, riht)=mat,正负值分别裁剪和扩展边界但最大到母图
(5)获取母图信息:locateROI(parentSize, orgInParent)=void
6.复制与增减
(1)复制:clone()=mat,copyTo(mat[,mask])=void,diag(d)=mat上三角d>0主对角d=0下三角d<0s
(2)转换:convertTo(mat, type, a, b)=void,assignTo(mat,type)=void
(3)增删:push_back(mat)=void添加mat到尾(可能重分配),pop_back(n)删除尾n行(无需重分配)
(4)扩展:resize(n[,scalar])修改为n行(可能重分配),reserve(n)修改为n预留行(n大于行数重分配)
7.运算符重载
(1)四则运算:+,-,*(矩阵乘法),/
(2)关系运算:<,<=,>,>=,==,!=
(3)按位运算:~,&,|,^
(4)赋值运算:=,+=,-=,*=,/=,&=,^=,|=
(5)其它运算:(),cout<<,cin>>,ostream<<,instream>>
8.偏数学函数
(1)矩阵运算:t()=mat,inv(method)=mat,mul(mat1)=mat2
(2)向量运算:dot(mat)=val必须是行或列矩阵,cross(mat1)=mat2必须是三维的行或列矩阵