数组就是一维矩阵,很多操作是相同的,这里放到一起。重点是列出和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);/