cvDet
- double cvDet(const CvArr* mat);
cvDet()用于计算一个方阵的行列式。这个数组可以是任何数据类型,但它必须是单通道的,如果是小的矩阵,则直接用标准公式计算。然而对于大型矩阵,这样就不是很有效,行列式的计算使用高斯消去法。
值得指出的是,如果已知一个矩阵是对称正定的,也可以通过奇异值分解的策略来解决。欲了解更多信息,请参阅"cvSVD"一节。但这个策略是将U和V设置为NULL,然后矩阵W的乘积就是所求正定矩阵。
cvDiv
- void cvDiv(
- const CvArr* src1,
- const CvArr* src2,
- CvArr* dst,
- double scale = 1
- );
cvDiv是一个实现除法的简单函数;它用src2除以src1中对应元素,然后把最终的结果存到dst中。如果mask非空,那么dst中的任何与mask中0元素相对应的元素都不改变。如果对数组中所有元素求倒数,则可以设置src1为NULL,函数将假定src1是一个元素全为1的数组。
cvDotProduct
- double cvDotProduct(
- const CvArr* src1,
- const CvArr* src2
- );
【58~60】
这个函数主要计算两个N维向量 的点积[Lagrange1773]。与叉积函数相同,点积函数也不太关注向量是行或者是列的形式。src1和src2都应该是单通道的数组,并且数组的数据类型应该一致。
cvEigenVV
- double cvEigenVV(
- CvArr* mat,
- CvArr* evects,
- CvArr* evals,
- double eps = 0
- );
对对称矩阵mat,cvEigenVV()会计算出该矩阵的特征值和相应的特征向量。函数实现的是雅可比方法[Bronshtein97],对于小的矩阵是非常高效的 ,雅可比方法需要一个停止参数,它是最终矩阵中偏离对角线元素最大尺寸 。可选参数eps用于设置这个值。在计算的过程中,所提供的矩阵mat的数据空间被用于计算,所以,它的值会在调用函数后改变。函数返回时,你会在evects中找到以行顺序保存的特征向量。对应的特征值被存储到evals中。特征向量的次序以对应特征值的重要性按降序排列。该cvEigenVV()函数要求所有三个矩阵具有浮点类型。
正如cvDet()(前述),如果被讨论的向量是已知的对称和正定矩阵 ,那么最好使用SVD计算mat的特征值和特征向量。
cvFlip
- void cvFlip(
- const CvArr* src,
- CvArr* dst = NULL,
- int flip_mode = 0
- );
本函数是将图像绕着在X轴或Y轴或者绕着X轴或Y轴上同时旋转。当参数flip_mode被设置为0的时候,图像只会绕X轴旋转。【61】
flip_mode被设置为正值时(例如,+1),图像会围绕Y轴旋转,如果被设置成负值(例如,-1),图像会围绕X轴和Y轴旋转。
在Win32运行视频处理系统时,你会发现自己经常使用此功能来进行图像格式变换,也就是坐标原点在左上角和左下角的变换。
cvGEMM
- double cvGEMM(
- const CvArr* src1,
- const CvArr* src2,
- double alpha,
- const CvArr* src3,
- double beta,
- CvArr* dst,
- int tABC = 0
- );
广义矩阵乘法(generalized matrix multiplicatipm,GEMM)在OpenCV中是由cvGEMM()来实现的,可实现矩阵乘法、转置后相乘、比例缩放等。最常见的情况下,cvGEMM()计算如下:
其中A,B和C分别是矩阵src1,src2和src3,α和β是数值系数,op()是附在矩阵上的可选转置。参数src3可以设置为空。在这种情况下,不会参与计算。转置将由可选参数tABC来控制,它的值可以是0或者(通过布尔OR操作)CV_GEMM_A_T、CV_GEMM_B_T和CV_GEMM_C_T的任何组合(每一个标志都有一个矩阵转换相对应)。
过去的OpenCV包含cvMatMul()和cvMatMulAdd()方法,但是,它们很容易和cvMul()混淆,其实它们的功能是完全不一样的(即两个数组的元素与元素相乘)。这个函数以宏的形式继续存在,它们直接调用cvGEMM()。两者对应关系如表3-7所示。
表3-7:cvGEMM()一般用法的宏别名
cvMatMul(A,B, D) |
cvGEMM(A,B,1,NULL,0,D,0) |
cvMatMulAdd(A,B,C,D) |
cvGEMM(A,B,1,C,1,D,0) |
只有大小符合约束的矩阵才能进行乘法运算,并且所有的数据类型都应该是浮点型。cvGEMM()函数支持双通道矩阵,在这种情况下,它将双通道视为一个复数的两个部分。
cvGetCol和cvGetCols
- CvMat* cvGetCol(
- const CvArr* arr,
- CvMat* submat,
- int col
- );
- CvMat* cvGetCols(
- const CvArr* arr,
- CvMat* submat,
- int start_col,
- int end_col
- );
cvGetCol()函数被用作提取矩阵中的某一列,并把它以向量的形式返回(即只有一列的矩阵)。在这种情况下,矩阵指针submat将被修改为指向arr中的特定列,必须指出的是,该指针在修改过程中并未涉及内存的分配或数据的复制;submat的内容仅仅是作了简单修改以使它正确地指出arr中所选择的列。它支持所有数据类型。
cvGetCols()函数的工作原理与cvGetCols完全一致,区别只在于前者将选择从start_col到end_col之间的所有列。这两个函数都返回一个与被调用的特定列或者多列(即,submat)相对应的头指针。
cvGetDiag
- CvMat* cvGetDiag(
- const CvArr* arr,
- CvMat*submat,
- int diag= 0
- );