zoukankan      html  css  js  c++  java
  • 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必须是三维的行或列矩阵

  • 相关阅读:
    命名之法 —— 男名、女名、家族(古诗词与古典名著)
    findContours函数参数详解
    推理集 —— 特殊的时间
    推理集 —— 特殊的时间
    分蛋糕问题 —— 9 个烧饼分给 10 个人
    分蛋糕问题 —— 9 个烧饼分给 10 个人
    辩论之术
    辩论之术
    findContours 轮廓查找
    坚持是一种品行
  • 原文地址:https://www.cnblogs.com/dzyBK/p/13917095.html
Copyright © 2011-2022 走看看