OpenCV矩阵操作

矩阵类的成员函数可以进行很多基本的矩阵操作,在之前已经介绍过。除此之外,也有很多操作被表示为“友元”函数,它们的输入为矩阵类型,或者输出为矩阵类型,或者输入输出同为矩阵类型。下面将对这些函数及其参数进行详细介绍。

目录

cv::abs()和cv::absdiff

cv::add()

cv::addWeighted()

cv::bitwise_and()

cv::bitwise_not()

cv::bitwise_or()

cv::bitwise_xor()

cv::calcCovarMatrix()

cv::cartToPolar()

cv::checkRange()

cv::compare()

cv::completeSymm()

cv::convertScaleAbs()

cv::countNonZero()

cv::cvarrToMat()

cv::dct()

cv::dft()

cv::cvtColor()

cv::determinant()

cv::divide()

cv::eigen()

cv::exp()

cv::flip()

cv::gemm()

cv::hconcat()

cv::idct()

cv::idft()

cv::inRange()

cv::invert()

cv::log()

cv::LUT()

cv::magnitude()

cv::Mahalanobis()

cv::max()

cv::mean()

cv::meanStdDev()

cv::merge()

cv::min()

cv::minMaxIdx()

cv::minMaxLoc()

cv::mixChannels()

cv::mulSpectrums()

cv::multiply()

cv::mulTransposed()

cv::norm()

cv::normalize()

cv::perspectiveTransform()

cv::phase()

cv::polarToCart()

cv::pow()

cv::randu()

cv::randn()

cv::randShuffle()

cv::reduce()

cv::repeat()

cv::scaleAdd()

cv::setIdentity()

cv::solve()

cv::solveCubic()

cv::solvePoly()

cv::sort()

cv::sortIdx()

cv::split()

cv::sqrt()

cv::subtract()

cv::sum()

cv::theRNG()

cv::trace()

cv::transform()

cv::transpose()


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,表示和输入矩阵类型相同。

原理:dst(I) = saturate(src1(I) + src2(I))(最简单的情况)

对于简单的情况:矩阵运算可得到相同的结果:dst = src1+src2

也支持:dst += src1,相当于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。

原理:dst(I) = saturate(src1(I) * alpha + src2(I) * beta + gamma)

cv::bitwise_and()

void cv::bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray())

作用:逐元素按位与操作,将结果放于dst中。

原理:dst(I) = src1(I) \wedge src2(I)

如果不适用掩码,相当于:dst = src1 \& src2

cv::bitwise_not()

void cv::bitwise_not(InputArray src, OutputArray dst, InputArray mask=noArray())

作用:逐元素按位反转操作,将结果放于dst中。

原理:dst(I) = \sim src(I)

如果不适用掩码,相当于:dst = !src

cv::bitwise_or()

void cv::bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray())

作用:逐元素按位或操作,将结果放于dst中。

原理:dst(I) = src1(I) \vee src2(I)

如果不适用掩码,相当于:dst = src1 \mid src2

cv::bitwise_xor()

void cv::bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray())

作用:逐元素按位异或操作,将结果放于dst中。

原理:dst(I) = src1(I) \bigoplus src2(I)

如果不适用掩码,相当于:dst = src1 \^ \: src2

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中。

cv::calcCovarMatrix()可能用到的flag参数值
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,因为:

\sum \, _{normal}^{2}=\mathbb{Z}\begin{bmatrix} v_{0,0}-\bar{v}_{0}& \cdots & v_{m,0}-\bar{v}_{0} \\ \vdots & \ddots &\vdots \\ v_{0,n}-\bar{v}_{n}& \cdots & v_{m,n}-\bar{v}_{n} \end{bmatrix}\begin{bmatrix} v_{0,0}-\bar{v}_{0}& \cdots & v_{m,0}-\bar{v}_{0} \\ \vdots & \ddots &\vdots \\ v_{0,n}-\bar{v}_{n}& \cdots & v_{m,n}-\bar{v}_{n} \end{bmatrix}^{T}

若选用cv::COVER_SCRAMBLED,结果是m×m,因为:

\sum \, _{scrambled}^{2}=\mathbb{Z}\begin{bmatrix} v_{0,0}-\bar{v}_{0}& \cdots & v_{m,0}-\bar{v}_{0} \\ \vdots & \ddots &\vdots \\ v_{0,n}-\bar{v}_{n}& \cdots & v_{m,n}-\bar{v}_{n} \end{bmatrix}^{T}\begin{bmatrix} v_{0,0}-\bar{v}_{0}& \cdots & v_{m,0}-\bar{v}_{0} \\ \vdots & \ddots &\vdots \\ v_{0,n}-\bar{v}_{n}& \cdots & v_{m,n}-\bar{v}_{n} \end{bmatrix}

其中\mathbb{Z}是一个可选比例因子,除非使用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。

原理:magnitude(I) = \sqrt{x(I)^{2} + y(I)^{2}}

           angle(I) = atan2(y(I), x(I))[\cdot 180/\pi ]

注意: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。

cv::compare()使用的cmpop值以及由此产生的比较操作
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,m_{ij} = m_{ji}\: \: \: \: for\: i > j,即将上三角的对称复制到下三角

           若lowerToUpper=true,m_{ij} = m_{ji}\: \: \: \: for\: i < j,即将下三角的对称复制到上三角

cv::convertScaleAbs()

void cv::convertScaleAbs(InputArray src, OutputArray dst, double alpha=1, double beta=0)

作用:① 通过因子alpha来重新调整原图像;

           ② 通过加因子beta来偏移;

           ③ 计算上述所求和的绝对值;

           ④ 将结果饱和映射到一个无符号字符型(8位)。

原理:dst(I) = saturate\_cast<uchar>(\left | src(I) * alpha+ beta \right |)

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)

  • 8
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值