cvSub()是一个简单的减法函数,它对数组src2和src1对应的元素进行减法运算,然后把结果赋给dst。如果数组mask非空,那么dst中元素对应位置的mask中的0元素不会因此而改变。相关的函数cvSubS()执行相类似的功能,但它会对src的每一个元素减去一个常量value。函数cvSubRS()的功能和cvSubS()相似,但不是src的每个元素减去一个常量,而是常量减去的src中的每一元素。
cvSum
- CvScalar cvSum(
- CvArr* arr
- );
【75】
cvSum()计算数组arr各个通道的所有的像素的总和。注意,函数的返回类型是CvScalar,这意味着cvSum()提供多通道数组计算。在这种情况下,每个通道的和都会赋给类型为CvScalar的返回值中相应的分量。
cvSVD
- void cvSVD(
- CvArr* A,
- CvArr* W,
- CvArr* U = NULL,
- CvArr* V = NULL,
- int flags = 0
- );
奇异值分解(SVD)是将一个m×n的矩阵A按如下公式分解:
其中,W是一个对角矩阵,U和V分别是m×m和n×n的酉矩阵。当然,矩阵W也是一个m×n的矩阵,所以在这里的"对角线"是指任何行数和列数不相等的位置的元素值一定是0。因为W必须是对角矩阵,OpenCV允许它表示为一个m×n阶矩阵或一个n×1向量(在这种情况下,该向量将只包含对角线上的"奇异"值)。
对于函数cvSVD()来说,U和V是可选参数,如果它们的值设置为NULL,则不会返回它们的内容。最后的参数flags可以是表3-14所示三个选项中任何一个或全部(视情况进行布尔型或计算合并)。
表3-14:cvSVD()中flags参数的取值
参数 | 结果 |
CV_SVD_MODIFY_A | 允许改变矩阵A |
CV_SVD_U_T | 返回UT而不是U |
CV_SVD_V_T | 返回VT而不是V |
cvSVBkSb
- void cvSVBkSb(
- const CvArr* W,
- const CvArr* U,
- const CvArr* V,
- const CvArr* B,
- CvArr* X,
- int flags = 0
- );
这个函数一般不会被直接调用。与刚才所描述的cvSVD()一起,本函数构成了基于SVD的方法cvInvert()和cvSolve()的基础。也就是说,如果你想自己实现矩阵求逆,可用这两个函数(这可以为你节省在cvInvert()或cvSolve()中为临时矩阵分配的一大堆内存空间)。【75】
函数cvSVBkSb()对矩阵A进行反向替代计算,A已分解为矩阵U,W和V(即SVD)的结构中描述出来。矩阵X的结果可由如下公式计算得出:
矩阵B是可选的,如果设置为NULL,它将会被忽略。当 时矩阵W*中的对角线元素定义如下:
ε这个值是一个奇异性阈值,一个非常小的数值,通常与W的对角线元素的总和成正比(即 )。
cvTrace
- CvScalar cvTrace( const CvArr* mat );
矩阵的迹是对角线元素的总和。在OpenCV中,该功能在函数cvGetDiag()基础上实现,因此输入的数组不需要是方阵。同样支持多通道数组,但是数组mat必须是浮点类型。
cvTranspose与cvT
- void cvTranspose(
- const CvArr* src,
- CvArr* dst
- );
cvTranspose()将src中每一个元素的值复制到dst中行号与列号相调换的位置上。这个函数不支持多通道数组;然而,如果你用两通道数组表示复数,那么记住一点:cvTranspose()不执行复共轭(依靠函数cvXorS()是实现该功能的一个快速方法,它可以直接翻转数组中虚数部分中的符号位)。宏cvT()是函数cvTranspose()的缩写。
cvXor和cvXorS
- void cvXor(
- const CvArr* src1,
- const CvArr* src2,
- CvArr* dst,
- const CvArr* mask=NULL
- );
- void cvXorS(
- const CvArr* src,
- CvScalar value,
- CvArr* dst,
- const CvArr* mask=NULL
- );
【76】
这两个函数在数组src1上按位进行异或(XOR)运算。在函数cvXor()中,dst的每个元素是由src1和src2中对应的元素按位进行异或运算所得到的。在函数cvXorS()中,是与常量value进行按位异或运算。再次说明,如果参数mask非空,则只计算与mask中非0值相对应的dst元素。
计算支持所有的数据类型,但src1和src2在函数cvXor()中必须是相同的数据类型。如果数组的元素是浮点类型的,那么使用浮点数的二进制表示。
cvZero
- void cvZero( CvArr* arr );
这个函数会将数组中的所有通道的所有元素的值都设置为0。