OpenCV-Core学习日志:Mat要点总结

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必须是三维的行或列矩阵

上一篇:【Leetcode刷题篇】Leetcode221 最大正方形


下一篇:wsawsd