ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-11-02 23:01:39  阅读:306  来源: 互联网

标签:Core rows mat dims cols OpenCV type 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必须是三维的行或列矩阵

标签:Core,rows,mat,dims,cols,OpenCV,type,Mat
来源: https://www.cnblogs.com/dzyBK/p/13917095.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有