矩阵和图像操作(5)

cvDet

 
 
  1. double cvDet(const CvArr* mat); 

cvDet()用于计算一个方阵的行列式。这个数组可以是任何数据类型,但它必须是单通道的,如果是小的矩阵,则直接用标准公式计算。然而对于大型矩阵,这样就不是很有效,行列式的计算使用高斯消去法。

值得指出的是,如果已知一个矩阵是对称正定的,也可以通过奇异值分解的策略来解决。欲了解更多信息,请参阅"cvSVD"一节。但这个策略是将U和V设置为NULL,然后矩阵W的乘积就是所求正定矩阵。

cvDiv

 
 
  1. void cvDiv(  
  2. const CvArr* src1,  
  3. const CvArr* src2,  
  4. CvArr* dst,  
  5. double scale = 1 
  6. ); 

cvDiv是一个实现除法的简单函数;它用src2除以src1中对应元素,然后把最终的结果存到dst中。如果mask非空,那么dst中的任何与mask中0元素相对应的元素都不改变。如果对数组中所有元素求倒数,则可以设置src1为NULL,函数将假定src1是一个元素全为1的数组。

cvDotProduct

 
 
  1. double cvDotProduct(  
  2.     const CvArr* src1,  
  3.     const CvArr* src2  
  4. ); 

【58~60】

这个函数主要计算两个N维向量 的点积[Lagrange1773]。与叉积函数相同,点积函数也不太关注向量是行或者是列的形式。src1和src2都应该是单通道的数组,并且数组的数据类型应该一致。

cvEigenVV

 
 
  1. double cvEigenVV(  
  2.     CvArr* mat,  
  3.     CvArr* evects,  
  4.     CvArr* evals,  
  5.     double eps = 0 
  6. ); 

对对称矩阵mat,cvEigenVV()会计算出该矩阵的特征值和相应的特征向量。函数实现的是雅可比方法[Bronshtein97],对于小的矩阵是非常高效的 ,雅可比方法需要一个停止参数,它是最终矩阵中偏离对角线元素最大尺寸 。可选参数eps用于设置这个值。在计算的过程中,所提供的矩阵mat的数据空间被用于计算,所以,它的值会在调用函数后改变。函数返回时,你会在evects中找到以行顺序保存的特征向量。对应的特征值被存储到evals中。特征向量的次序以对应特征值的重要性按降序排列。该cvEigenVV()函数要求所有三个矩阵具有浮点类型。

正如cvDet()(前述),如果被讨论的向量是已知的对称和正定矩阵 ,那么最好使用SVD计算mat的特征值和特征向量。

cvFlip

 
 
  1. void cvFlip(  
  2.     const CvArr* src,  
  3.     CvArr* dst = NULL,  
  4.     int flip_mode = 0 
  5. ); 

本函数是将图像绕着在X轴或Y轴或者绕着X轴或Y轴上同时旋转。当参数flip_mode被设置为0的时候,图像只会绕X轴旋转。【61】

flip_mode被设置为正值时(例如,+1),图像会围绕Y轴旋转,如果被设置成负值(例如,-1),图像会围绕X轴和Y轴旋转。

在Win32运行视频处理系统时,你会发现自己经常使用此功能来进行图像格式变换,也就是坐标原点在左上角和左下角的变换。

cvGEMM

 
 
  1. double cvGEMM(  
  2.     const CvArr* src1,  
  3.     const CvArr* src2,  
  4.     double alpha,  
  5.     const CvArr* src3,  
  6.     double beta,  
  7.     CvArr* dst,  
  8.     int tABC = 0 
  9. ); 

广义矩阵乘法(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

 
 
  1. CvMat* cvGetCol(  
  2.     const CvArr* arr,  
  3.     CvMat* submat,  
  4.     int col  
  5. );  
  6. CvMat* cvGetCols(  
  7.     const CvArr* arr,  
  8.     CvMat* submat,  
  9.     int start_col,  
  10.     int end_col  
  11. ); 

cvGetCol()函数被用作提取矩阵中的某一列,并把它以向量的形式返回(即只有一列的矩阵)。在这种情况下,矩阵指针submat将被修改为指向arr中的特定列,必须指出的是,该指针在修改过程中并未涉及内存的分配或数据的复制;submat的内容仅仅是作了简单修改以使它正确地指出arr中所选择的列。它支持所有数据类型。

cvGetCols()函数的工作原理与cvGetCols完全一致,区别只在于前者将选择从start_col到end_col之间的所有列。这两个函数都返回一个与被调用的特定列或者多列(即,submat)相对应的头指针。

cvGetDiag

 
 
  1. CvMat* cvGetDiag(  
  2.     const CvArr* arr,  
  3.     CvMat*submat,  
  4.     int diag0 
  5. ); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值