学习OpenCV2——Mat之矩阵和数组的运算

      数组就是一维矩阵,很多操作是相同的,这里放到一起。重点是列出和Mat有关的操作。

    OpenCV有很多函数有mask,代表掩码,如果某位mask是0,那么对应的src的那一位就不计算,mask要和矩阵/ROI/的大小相等。大多数函数支持ROI,如果图像ROI被设置,那么只处理ROI部分。少部分函数支持COI,如果COI设置,只处理感兴趣的通道。

    如果C++版本和C版本的函数名只差一个cv,则只列C++版本的。否则都列出来。

 

1. Mat类内部方法

    设为A,B为Mat类型,s是Scalar类型,a是一个实数。下面列出关于Mat的常用运算:

  • 矩阵加减: A+B,A-B,A+s,A-s,s+A,s-A,-A.
  • 矩阵乘以实数: A*a,a*A
  • 逐元素乘除: A.mul(B),A/B,a/A
  • 矩阵乘法: A*BmaxVal; Point minPos,m
  • 矩阵倒置: A.t()
  • 矩阵的逆: A.inv()
  • 矩阵比较: A comp B,A comp a,a comp A。这里comp包括 >, >=,==,!=,<=,<。得出的结果是一个单通道8位的矩阵,元素的值为255或0。
  • 矩阵位操作: A logic B, A logic s,s logic A。这里logic包括:&,|,^
  • 向量的差乘和内积: A.cross(B),A.dot(B);

     这里需要注意,为防止溢出,矩阵乘法的矩阵元素类型至少是float,即CV_32F以上。OpenCV除了提供上述提到的直接调用Mat成员函数(如求逆,倒置)的以及使用Mat重载操作符(如加减乘除)的方法外,还提供了外部函数实现这些功能。

 

2. 矩阵的代数运算

矩阵的加减乘除

  矩阵与矩阵

void add(InputArray src1, InputArray src2,OutputArray dst, InputArraymask=noArray(), int dtype=-1)`

void subtract(InputArray src1, InputArraysrc2, OutputArray dst,InputArray mask=noArray(), int dtype=-1)

void multiply(InputArray src1, InputArraysrc2, OutputArray dst, doublescale=1, int dtype=-1 )

void divide(InputArray src1, InputArraysrc2, OutputArray dst, doublescale=1, int dtype=-1)

 

void cvAdd(const CvArr*src1,constCvArr*src2,CvArr* dst,const CvArr* mask =NULL);

void cvSub(const CvArr* src1, constCvArr*src2, CvArr* dst, constCvArr* mask=NULL);

void cvMul(const CvArr* src1,constCvArr*src2,CvArr* dst,doublescale=1);

void cvDiv(const CvArr* src1,constCvArr*src2, CvArr* dst, doublescale=1);


  矩阵与数

void cvAddS(const CvArr*src,CvScalarvalue,CvArr*dst,const CvArr*mask = NULL);

void cvSubS(const CvArr* src,CvScalarvalue, CvArr* dst, constCvArr* mask=NULL);

void cvSubRS(const CvArr* src,CvScalarvalue, CvArr* dst, constCvArr* mask=NULL);

 

  高级混合运算

void addWeighted(InputArray src1,doublealpha, InputArray src2, double beta, double gamma, OutputArray dst, intdtype=-1);

带权值加法,dst= alpha* src1 + beta *src2 + gamma

 

void gemm(InputArray src1, InputArraysrc2,double alpha, InputArray src3, double gamma, OutputArray dst, int flags=0);

矩阵的广义乘法。其中, * src1,src2的type必须是CV_32FC1, CV_64FC1, CV_32FC2, or CV_64FC2 * flag是控制矩阵转置的: *GEMM_1_T转置 src1. * GEMM_2_T 转置 src2. * GEMM_3_T 转置 src3.

  

void scaleAdd(InputArray src1, doublescale,InputArray src2, OutputArray dst)

//dst = scale*src1 + src2

 

矩阵的绝对值

MatExpr abs(const Mat& m)                                    //矩阵逐个元素的绝对值

void absdiff(InputArray src1, InputArraysrc2, OutputArray dst) //两个矩阵之差的绝对值

 

void absdiff(InputArray src1, InputArraysrc2, OutputArray dst)两矩阵相减取绝对值

void cvAbsDiffS(const CvArr* src, CvArr*dst,CvScalarvalue);/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值