矩阵类的成员函数可以进行很多基本的矩阵操作,在之前已经介绍过。除此之外,也有很多操作被表示为“友元”函数,它们的输入为矩阵类型,或者输出为矩阵类型,或者输入输出同为矩阵类型。下面将对这些函数及其参数进行详细介绍。
目录
cv::abs()和cv::absdiff
cv::MatExpr cv::abs(InputArray src)
cv::MatExpr cv::abs(const cv::MatExpr& src)
作用:计算某些矩阵或矩阵的某些表达式的绝对值。
void cv::absdiff(InputArray src1, InputArray src2, OutputArray dst)
作用:计算两个矩阵中每对应元素之间的差值,并将该差值的绝对值放入目标矩阵的相应元素中。
对cv::abs()的调用会转换为对cv::absdiff()或其他函数的调用,并由这些函数处理。如,求m0-m1的绝对值和分别穿参为m0和m1作为src1和src2;求m0的绝对值可以转换成求m0和cv::Scalar::all(0)的差值。
cv::add()
void cv::add(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray(), int dtype=-1)
作用:计算两个数组或数组与标量之间的每个元素的差异。dtype表示输出矩阵类型,默认为-1,表示和输入矩阵类型相同。
原理:(最简单的情况)
对于简单的情况:矩阵运算可得到相同的结果:
也支持:,相当于add(dst, src1, dst)
cv::addWeighted()
void cv::addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)
作用:实现alpha混合,alpha和beta分别是src1和src2的混合强度,一般二者之和为1。
原理:
cv::bitwise_and()
void cv::bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray())
作用:逐元素按位与操作,将结果放于dst中。
原理:
如果不适用掩码,相当于:
cv::bitwise_not()
void cv::bitwise_not(InputArray src, OutputArray dst, InputArray mask=noArray())
作用:逐元素按位反转操作,将结果放于dst中。
原理:
如果不适用掩码,相当于:
cv::bitwise_or()
void cv::bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray())
作用:逐元素按位或操作,将结果放于dst中。
原理:
如果不适用掩码,相当于:
cv::bitwise_xor()
void cv::bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray())
作用:逐元素按位异或操作,将结果放于dst中。
原理:
如果不适用掩码,相当于:
cv::calcCovarMatrix()
void cv::calcCovarMatrix(const Mat* samples, int nsamples, Mat& covar, Mat& mean, int flags, int ctype=CV_64F)
void cv::calcCovarMatrix(InputArray samples, OutputArray covar, InputOutputArray mean, int flags, int ctype=CV_64F)
作用:给定一些向量,假设这些向量表示的点是近似高斯分布的,计算这些点的均值和协方差矩阵,结果分别放在mean和covar中。
flags参数的具体flag值 | 意义 |
---|---|
cv::COVER_NOMAL | 计算均值和协方差 |
cv::COVER_SCRAMBLED | 快速PCA“scrambled” |
cv::COVER_USE_AVERAGE | 输入均值而不是计算均值 |
cv::COVER_SCALE | 重新缩放输出的协方差矩阵 |
cv::COVER_ROWS | 使用样本的行作为输入向量 |
cv::COVER_COLS | 使用样本的列作为输入向量 |
标志cv::COVER_NOMAL和cv::COVER_SCRAMBLED是相互排斥的。
若选用cv::COVER_NOMAL,结果是n×n,因为:
若选用cv::COVER_SCRAMBLED,结果是m×m,因为:
其中是一个可选比例因子,除非使用cv::COVER_SCALE标志,否则它将被设置为1。和cv::COVER_NOMAL一起使用是1.0/m;和cv::COVER_SCRAMBLED一起使用是1.0/n。
cv::cartToPolar()
void cv::cartToPolar(InputArray x, InputArray y, OutputArray , OutputArray angle, bool angleDegrees=false)
作用:计算两个二维向量的大小和角度,即极坐标表示。角度默认用弧度表示,除非angleDegrees=true。
原理:
注意:x和y的尺寸必须相同。设定点(0, 0)的角度为0,角度的计算精确到0.3度。
cv::checkRange()
bool cv::checkRange(InputArray a, bool quiet=true,Point* pos=0, double minVal=-DBL_MAX,double maxVal=DBL_MAX)
作用:检查输入矩阵a中的每一个元素,并确定该元素是否在给定的范围内。
原理:quiet设置为true,若检查到有元素超出范围(NAN和inf值也被算超出范围),则结果返回false,否则返回false。
quiet设置为false, 若检查到有元素超出范围,则抛出异常。
若指针pos不为NULL,则第一个异常值的位置将存储在pos中。
cv::compare()
void cv::compare(InputArray src1, InputArray src2, OutputArray dst, int cmpop)
作用:对src1和src2中的元素逐个进行比较,并将结果存入dst中。
原理:按cmpop指定的规则进行比较,匹配的标记为255,不匹配的标记为0。
cmpop的值 | 比较操作 | 矩阵运算实现 |
---|---|---|
cv::CMP_EQ | src1(I) == src2(I) | dst = src1 == src2 |
cv::CMP_GT | src1(I) > src2(I) | dst = src1 > src2 |
cv::CMP_GE | src1(I) >= src2(I) | dst = src1 >= src2 |
cv::CMP_LT | src1(I) < src2(I) | dst = src1 < src2 |
cv::CMP_LE | src1(I) <= src2(I) | dst = src1 <= src2 |
cv::CMP_NE | src1(I) != src2(I) | dst = src1 != src2 |
cv::completeSymm()
void cv::completeSymm(InputOutputArray m, bool lowerToUpper=false)
作用:给定(二维)矩阵m,通过复制来使矩阵关于主对角线对称。
原理:若lowerToUpper=false,,即将上三角的对称复制到下三角
若lowerToUpper=true,,即将下三角的对称复制到上三角
cv::convertScaleAbs()
void cv::convertScaleAbs(InputArray src, OutputArray dst, double alpha=1, double beta=0)
作用:① 通过因子alpha来重新调整原图像;
② 通过加因子beta来偏移;
③ 计算上述所求和的绝对值;
④ 将结果饱和映射到一个无符号字符型(8位)。
原理:
cv::countNonZero()
int cv::countNonZero(InputArray src)
作用:返回矩阵src中的非0像素数
cv::cvarrToMat()
Mat cv::cvarrToMat(const CvArr* arr, bool copyData =false, bool allowND =true, int coiMode =0, AutoBuffer<double>* buf=0)
作用:将CvMat或IplImage转换成Mat
cv::dct()
void cv::dct(InputArray src, OutputArray dst, int flags=0)