您的位置:首页 > 运维架构

opencv矩阵和图像操作函数

2017-06-29 10:20 337 查看
表列出了一些操作矩阵图像的函数,其中的大部分对于图像处理非常有效。它们实现了图像处理中的基本操作,例如对角化、矩阵变换以及一些更复杂的诸如计算图像的统计操作表:矩阵和图像基本操作

函数名称

描述
cvAbs
计算数组中所有元素的绝对值
cvAbsDiff
计算两个数组差值的绝对值
函数名称
描述
cvAbsDiffS
计算数组和标量差值的绝对值
cvAdd
两个数组的元素级的加运算
cvAddS
一个数组和一个标量的

元素级的相加运算
cvAddWeighted
两个数组的元素级的加权

相加运算(alpha融合)
cvAvg
计算数组中所有元素的平均值
cvAvgSdv
计算数组中所有元素的

绝对值和标准差
cvCalcCovarMatrix
计算一组n维空间向量的协方差
cvCmp
对两个数组中的所有元

素运用设置的比较操作
cvCmpS
对数组和标量运用设置的比较操作
cvConvertScale
用可选的缩放值转换数组元素类型
cvConvertScaleAbs
计算可选的缩放值的绝对值之

后再转换数组元素的类型
cvCopy
把数组中的值复制到另一个数组中
cvCountNonZero
计算数组中非0值的个数
cvCrossProduct
计算两个三维向量的向量积(叉积)
cvCvtColor
将数组的通道从一个颜色空间

转换另外一个颜色空间
cvDet
计算方阵的行列式
cvDiv
用另外一个数组对一个数

组进行元素级的除法运算
cvDotProduct
计算两个向量的点积
cvEigenVV
计算方阵的特征值和特征向量
cvFlip
围绕选定轴翻转
cvGEMM
矩阵乘法
cvGetCol
从一个数组的列中复制元素
cvGetCols
从数据的相邻的多列中复制元素值
cvGetDiag
复制数组中对角线上的所有元素
cvGetDims
返回数组的维数
cvGetDimSize
返回一个数组的所有维的大小
cvGetRow
从一个数组的行中复制元素值
cvGetRows
从一个数组的多个相邻的

行中复制元素值
cvGetSize
得到二维的数组的尺寸,

以CvSize返回
cvGetSubRect
从一个数组的子区域复制元素值
cvInRange
检查一个数组的元素是否在

另外两个数组中的值的范围内
cvInRangeS
检查一个数组的元素的值是

否在另外两个标量的范围内
[align=center] [/align]
  

函数       名称
描述
cvInvert
求矩阵的转置
cvMahalonobis
计算两个向量间的马氏距离
cvMax
在两个数组中进行元素级

的取最大值操作
cvMaxS
在一个数组和一个标量中

进行元素级的取最大值操作
cvMerge
把几个单通道图像合并为

一个多通道图像
cvMin
在两个数组中进行元素级

的取最小值操作
cvMinS
在一个数组和一个标量中

进行元素级的取最小值操作
cvMinMaxLoc
寻找数组中的最大最小值
cvMul
计算两个数组的元素级的乘积
cvNot
按位对数组中的每一个元素求反
cvNorm
计算两个数组的正态相关性
cvNormalize
将数组中元素进行规一化
cvOr
对两个数组进行按位或操作
cvOrS
在数组与标量之间进行按位或操作
cvReduce
通过给定的操作符将二维

数组约简为向量
cvRepeat
以平铺的方式进行数组复制
cvSet
用给定值初始化数组
cvSetZero
将数组中所有元素初始化为0
cvSetIdentity
将数组中对角线上的元素

设为1,其他置0
cvSolve
求出线性方程组的解
cvSplit
将多通道所组分割成

多个单通道数组
cvSub
两个数组元素级的相减
cvSubS
元素级的从数组中减去标量
cvSubRS
元素级的从标量中减去数组
cvSum
对数组中的所有元素求和
cvSVD
二维矩阵的奇异值分解
cvSVBkSb
奇异值回代计算
cvTrace
计算矩阵迹
cvTranspose
矩阵的转置运算
cvXor
对两个数组进行按位异或操作
cvXorS
在数组和标量之间进行

按位异或操作
cvZero
将所有数组中的元素置为0
有很多函数有mask,代表掩码,如果某位mask是0,那么对应的src的那一位就不计算,mask要和矩阵/ROI/的大小相等 
大多数函数支持ROI,如果图像ROI被设置,那么只处理ROI部分 
少部分函数支持COI,如果COI设置,只处理感兴趣的通道

矩阵逻辑运算 
voidcvAnd(const CvArr* src1, const CvArr* src2, CvArr* dst, constCvArr* mask=NULL);// 

void cvAndS(const CvArr* src, CvScalar value, CvArr* dst, constCvArr* mask=NULL);// 

void cvOr(const CvArr* src1, const CvArr* src2, CvArr* dst, constCvArr* mask=NULL);// 

void cvOrS(const CvArr* src, CvScalar value, CvArr* dst, constCvArr* mask=NULL);// 

void cvXor(const CvArr* src1, const CvArr* src2, CvArr* dst, constCvArr* mask=NULL);// 

void cvXorS(const CvArr* src, CvScalar value, CvArr* dst, constCvArr* mask=NULL);// 

void cvNot(const CvArr* src,CvArr*dst);//矩阵取反

 

矩阵算术运算 
绝对值 
voidcvAbs(const CvArr* src,CvArr* dst); 

void cvAbsDiff(const CvArr* src1,const CvArr* src2, CvArr*dst);//两矩阵相减取绝对值 
void cvAbsDiffS(const CvArr* src, CvArr*dst,CvScalar value);//矩阵减去一个数取绝对值 
加减 
voidcvAdd(const CvArr* src1,const CvArr* src2,CvArr* dst,const CvArr*mask = NULL);//两数组相加,dst(I)=src1(I)+src2(I)
if mask(I)!=0 

void cvAddS(const CvArr* src,CvScalar value,CvArr*dst,const CvArr*mask = NULL);//数组和一个数相加,dst(I)=src(I)+value
if mask(I)!=0 

void cvAddWeighted(const CvArr* src1,double alpha,const CvArr*src2,double beta,double gamma,CvArradded to each sum*dst);//带权相加相当于dst(x,y)
= α? src1(x,y) + β ? src2(x,y) + γ 

void cvSub(const CvArr* src1, const CvArr* src2, CvArr* dst, constCvArr* mask=NULL);//矩阵减法,dst(I)=src1(I)-src2(I)
if mask(I)!=0 

void cvSubS(const CvArr* src, CvScalar value, CvArr* dst, constCvArr* mask=NULL);//矩阵减数,dst(I)=src(I)-value
if mask(I)!=0 

void cvSubRS(const CvArr* src, CvScalar value, CvArr* dst, constCvArr* mask=NULL);//数减矩阵,dst(I)=value-src(I)
if mask(I)!=0 
乘除 
voidcvDiv(const CvArr* src1, const CvArr* src2, CvArr* dst, doublescale=1);//scale*src1(i)/src2(i),如果src1=NULL,则计算scale/src2(i) 

void cvMul(const CvArr* src1,const CvArr* src2,CvArr* dst,doublescale=1);//两矩阵元素之间的简单乘法,一般的矩阵点乘用cvGEMM(); 
次方 
voidcvPow(const CvArr* src, CvArr* dst, doublepower);//为每个src的数求power次方 
指数 
voidcvExp(const CvArr* src, CvArr*dst);//dst(I)=EXP(src(I)) 
对数 
voidcvLog(const CvArr* src, CvArr* dst);//

 

线性代数计算 
加&乘 
voidcvScaleAdd(const CvArr* src1, CvScalar scale, const CvArr* src2,CvArr* dst);//src1和scale的乘积加上src2 

void cvCrossProduct(const CvArr* src1,const CvArr* src2,CvArr*dst);//计算两个3D向量(单通道)的叉乘运算 
double cvDotProduct(const CvArr* src1, constCvArr* src2);//两个向量点乘 
void cvGEMM(const CvArr* src1, const CvArr*src2, double alpha, const CvArr* src3, double beta, CvArr* dst, inttABC=0);//乘加运算的始祖 
    由通用乘加函数参与定义的两个具体宏 
       cvMatMul(const CvArr* src1,const CvArr* src2,CvArr*dst); 

       cvMatMulAdd(const CvArr* src1,const CvArr* src2,const CvArr*src3,CvArr* dst); 

CvScalar cvTrace(const CvArr* mat);//计算对角线上的元素和 
变换 
voidcvTransform(const CvArr* src, CvArr* dst, const CvMat* transmat,const CvMat* shiftvec=NULL);//dst=transmat · src +shiftvec 

void cvPerspectiveTransform(const CvArr* src, CvArr* dst, constCvMat* mat);//把矩阵每个元素中三个通道当做一个矩阵,乘mat,mat是一个3×3或者4×4的转换矩阵 
转置 
voidcvTranspose(const CvArr* src, CvArr* dst); 

void cvMulTransposed(const CvArr* src, CvArr* dst, int order, constCvArr* delta=NULL, doublescale=1.0);//(src-delta)乘以它的转置再乘以scale 
逆矩阵 
doublecvInvert(const CvArr* src,CvArr* dst,intmethod=CV_LU);//求原矩阵的逆矩阵,默认使用高斯消去法 
    方阵可逆的充要条件是|A|!=0 

   method取值为CV_LU高斯消去法(默认)   CV_SVD 奇异值分解SVD   CV_SVD_SYM对称矩阵的SVD 
行列式 
doublecvDet(const CvArr* mat);//计算方阵行列式,一定是单通道的 
    小型方阵直接计算,大型方阵用高斯消去法计算 
    如果矩阵正定对称,用奇异值分解的方法解决cvSVD(); 
特征向量特征值 
voidcvEigenVV(CvArr* mat, CvArr* evects, CvArr* evals, doubleeps=0);//计算对称矩阵的特征值和特征向量,evects输出特征向量,evals输出特征值,eps雅可比方法停止参数 
    要求三个矩阵都是浮点类型,10×10以下该方法有效,20×20以上的矩阵不能计算出结果,为节约计算量,eps通常设为DBL_EPSILON(10^-15) 

    如果给定的矩阵是对称正定矩阵,那么考虑使用cvSVD(); 
协方差 
voidcvCalcCovarMatrix(const CvArr** vects, int count, CvArr* cov_mat,CvArr* avg, int flags);//给定一组大小和类型相同的向量,向量的个数,计算标记,输出协方差正阵和每个向量的平均值矩阵 
   CV_COVAR_NORMAL    普通计算协方差和平均值,输出的是n×n的协方差阵 
   CV_COVAR_SCRAMBLED    快速PCA“Scrambled”协方差,输出的是m×m的协方差阵 
   CV_COVAR_USE_AVERAGE    平均值是输入的 
   CV_COVAR_SCALE    重新缩放输出的协方差矩阵 
        四个flag通过并运算协同发挥作用,前两个不能并 
CvSize cvMahalonobis(const CvArr* vec1,constCvArr* vec2,CvArr* mat); 

int cvSolve(const CvArr* src1, const CvArr* src2, CvArr* dst, intmethod=CV_LU);//Solves a linear system or least-squaresproblem. 

void cvSVD(CvArr* A, CvArr* W, CvArr* U=NULL, CvArr* V=NULL, intflags=0);//Performs singular value decomposition of a realfloating-point matrix. 

void cvSVBkSb(const CvArr* W, const CvArr* U, const CvArr* V, constCvArr* B, CvArr* X, int flags);//Performs singular value backsubstitution.

 

数组比较 
voidcvCmp(const CvArr* src1, const CvArr* src2, CvArr* dst, intcmp_op);//两矩阵比较运算 
   CV_CMP_EQ - src1(I) 是否相等 
   CV_CMP_GT - src1(I) 是否大于 
   CV_CMP_GE - src1(I) 是否大于等于 
   CV_CMP_LT - src1(I) 是否小于 
   CV_CMP_LE - src1(I) 是否小于等于 
   CV_CMP_NE - src1(I) 是否不等 
        如果判断为假,dst设为0,如果判断为真,dst设为0xff 

void cvCmpS(const CvArr* src, double value, CvArr* dst, intcmp_op);//矩阵和一个数字比较运算

 

矩阵内转换 
类型转换 
voidcvConvertScale(const CvArr* src,CvArr* dst,double scale,doubleshift);//矩阵首先乘以scale再加上shift,然后把src中的数据类型转换成dst类型,但是src和dst通道数需要相等 
void cvConvertScaleAbs(const CvArr* src,CvArr*dst,double scale,double shift);//在src到dst类型转换前,先做绝对值 
void cvCvtColor(const CvArr* src,CvArr* dst, intcode);//图像 颜色空间转换,src要为8U
16U32F,dst的数据类型需要和src相同,通道数看code 

   code格式如:CV_原色彩空间2目的色彩空间    色彩空间要考虑RGB的顺序 
    支持的颜色空间包括:RGB   RGB565   RGB555   
GRAYRGBA   XYZ   YCrCb   HSV   HLS   Luv   BayerRG 
空间转换 
voidcvFlip(const CvArr* src, CvArr* dst=NULL, intflip_mode=0);//图像绕x、y轴旋转。当用在一维数组上时并且flip_mode>0,可以用来颠倒数据排列 
   flip_mode=0:左右对称values ofthe conversion
resul 

   flip_mode>0:上下对称 
   flip_mode<0:中心对称

 

矩阵间操作 
voidcvCopy(const CvArr* src,CvArr* dst,const CvArr*mask=NULL); 

void cvMerge(const CvArr* src0,const CvArr* src1,const CvArr*src2,const CvArr* src3,CvArr* dst);//多个数组合并成一个,类型和尺寸都相同,dst有多个通道,src可以赋值NULL 

void cvSplit(cosnt CvArr* src,CvArr* dst0,CvArr* dst1,CvArr*dst2,CvArr* dst3);//一个多通道数组分解成多个数组,类型尺寸都想同,dst可以赋值NULL 

void cvRepeat(const CvArr* src, CvArr*dst);//在dst中重复叠加src,dst(i,j)=src(i
mod rows(src), j mod cols(src)) 

CvMat* cvReshape(const CvArr* originalarr, CvMat* headerdata, intnew_cn, int new_rows=0);//把一个originalarr(可以是已经有内容的图片),转换为有新的通道数、新的行数的数据(CvMat*只含数据,没有图片头) 
CvArr* cvReshapeMatND(const CvArr* arr, intsizeof_header, CvArr* header, int new_cn, int new_dims, int*new_sizes); 

void cvLUT(const CvArr* src, CvArr* dst, const CvArr*lut);//src是8bit类型的数据,lut是一张一维查找表,拥有256个通道数类型和dst相同的元素,src的某一位置的元素数值n,到lut的n位置查找的内容填入dst的相应src的n元素的位置

统计运算 
最大最小 
voidcvMax(const CvArr* src1, const CvArr* src2, CvArr*dst); 

void cvMaxS(const CvArr* src, double value, CvArr*dst);//找较大值放到dst中 
void cvMin(const CvArr* src1,const CvArr*src2,CvArr* dst); 

void cvMins(const CvArr* src,double value,CvArr*dst);//找较小值放到dst中 
void cvMinMaxLoc(const CvArr* arr, double*min_val, double* max_val, CvPoint* min_loc=NULL, CvPoint*max_loc=NULL, const CvArr* mask=NULL); 

    找出全局某个通道中最大最小的值,和她们的位置,如果不止一个通道,一定要设置COI 
零的个数 
intcvCountNonZero( const CvArr* arr );//统计非零的个数 
是否落在范围内 
voidcvInRange(const CvArr* src,const CvArr* lower,const CvArr*upper,CvArr* dst); 

void cvInRangeS(const CvArr* src,CvScalar lower,CvScalarupper,CvArr* dst);//判断原数组中的每个数大小是否落在对应的lower、upper数组位置数值的中间 
    if(lower(i)<=src(i) 
平均值标准差 
CvScalarcvAvg(const CvArr* arr,const CvArr* mask =NULL);//计算mask非零位置的所有元素的平均值,如果是图片,则单独计算每个通道上的平均值,如果COI设置了,只计算该COI通道的平均值 
void cvAvgSdv(const CvArr* arr, CvScalar* mean,CvScalar* std_dev, const CvArr*mask=NULL);//计算各通道的平均值,标准差,支持COI

double cvNorm(const CvArr* arr1,const CvArr* arr2=NULL,intnorm_type=CV_L2,const CvArr*mask=NULL);//计算一个数组的各种范数 
    如果arr2为NULL,norm_type为 
       CV_C 求所有数取绝对值后的最大值,CV_L1 求所有数的绝对值的和,CV_L2求所有数的平方和的平方根 
    如果arr2不为NULL,norm_type为 
       CV_C arr1和arr2对应元素差的绝对值中的最大值   CV_L1
arr1和arr2对应元素差的绝对值的和   CV_L2
arr1和arr2的差平方和的平方根 
       CV_RELATIVE_C   CV_RELATIVE_L1   CV_RELATIVE_L2 上面结果除以cvNorm(arr2,NULL,对应的norm_type); 

cvNormalize(const CvArr* src,CvArr* dst,double a=1.0,doubleb=0.0,int norm_type=CV_L2,const CvArr* mask=NULL); 

   CV_C   CV_L1   CV_L2   CV_MINMAX 

cvReduce(const CvArr* src,CvArr* dst,int dim,intop=CV_REDUCE_SUM);//根据一定规则,把矩阵约简为向量 
   dim    决定约简到行还是列   1:约简到单个列,0:约简到单个行,-1:根据dst的CvSize,决定约简到行还是列 
   op    决定按什么规则约简 
       CV_REDUCE_SUM - 行/列的和 
       CV_REDUCE_AVG -    行/列平均值 
       CV_REDUCE_MAX - 行/列中最大值 
       CV_REDUCE_MIN -    行/列中最小值

 

取得设置数组信息 
得到指定行列 
CvMat*cvGetCol(const CvArr* arr,CvMat* submat,int col); 

CvMat* cvGetCols(const CvArr* arr,CvMat* submat,int start_col,intend_col);//取目标矩阵的某列/连续几列,submat和返回值的实际数据还是在原矩阵中,只是修改了头部和数据指针,没有数据拷贝
CvMat* cvGetRow(const CvArr* arr,CvMat*submat,int row); 

CvMat* cvGetRows(const CvArr* arr,CvMat* submat,int start_row,intend_row); 
得到对角线 
CvMat*cvGetDiag(const CvArr* arr,CvMat* submat,intdiag=0);//取矩阵arr的对角线,结果放在向量中,并不要求原矩阵是方阵,diag表示从哪个位置开始取对角线<
105ef
span style="font-family:Arial;"> 
维度大小 
intcvGetDims(const CvArr* arr,int*sizes=NULL);//获取数组的维数和每一维的大小,sizes十一个数组的头指针。图像或者矩阵的维数一定是2,先行数后列数 
int cvGetDimSize(const CvArr* arr,intindex);//获取某一维的大小 
矩阵大小 
CvSizecvGetSize(const CvArr* arr);//返回矩阵和图像的大小。小的结构体一般都是直接返回值而不是重新分配指针,分配指针的效率可能比直接返回值效率更低 
截取矩形矩阵 
CvMat*cvGetSubRect(const CvArr* arr, CvMat* submat, CvRectrect);//从输入的数组中根据输入的矩形截取一块数组中的矩形,返回的CvMat*就是submat 
得到和设置元素        因为效率原因,实际很少会直接用到这些方法,而是根据实际的应用来决定如何操作每一个数 
uchar* cvPtr1D(CvArr* arr,int idx0,int*type);//得到的是指针,所以可以修改,比下面的效率更高 
uchar* cvPtr2D(CvArr* arr,int idx0,int idx1,int*type); 

uchar* cvPtr3D(CvArr* arr,int idx0,int idx1,int idx2,int*type); 

uchar* cvPtrND(CvArr* arr,int* idx,int* type,intcreate_node=1,unsigned* precalc_hashval=NULL);//int*idx是一个数组指针,里面保存着索引 
double cvGetReal1D(const CvArr* arr,intidx0);//得到的是具体值 
double cvGetReal2D(const CvArr* arr,int idx0,intidx1); 

double cvGetReal3D(const CvArr* arr,int idx0,int idx1,intidx2); 

double cvGetRealND(const CvArr* arr,int* idx); 

CvScalar cvGet1D(const CvArr* arr,int idx0); 

CvScalar cvGet2D(const CvArr* arr,int idx0,int idx1); 

CvScalar cvGet3D(const CvArr* arr,int idx0,int idx1,intidx2); 

CvScalar cvGetND(const CvArr* arr,int* idx); 

double cvmGet(const CvMat* mat, int row, intcol);//仅仅用于矩阵单通道浮点数的获取,由于是inline并且没有类型判断,所以效率比较高 
void cvSetReal1D(CvArr* arr, int idx0, doublevalue); 

void cvSetReal2D(CvArr* arr, int idx0, int idx1, doublevalue); 

void cvSetReal3D(CvArr* arr, int idx0, int idx1, int idx2, doublevalue); 

void cvSetRealND(CvArr* arr, int* idx, double value); 

void cvSet1D(CvArr* arr, int idx0, CvScalar value); 

void cvSet2D(CvArr* arr, int idx0, int idx1, CvScalarvalue); 

void cvSet3D(CvArr* arr, int idx0, int idx1, int idx2, CvScalarvalue); 

void cvSetND(CvArr* arr, int* idx, CvScalar value); 

void cvmSet(CvMat* mat, int row, int col, doublevalue);//仅仅用于设置单通道浮点类型的矩阵 
void cvClearND(CvArr* arr, int*idx);//把多维数组的某位置设置为0 

void cvSet(CvArr* arr, CvScalar value, const CvArr*mask=NULL);//把数组每个元素都设为value 

void cvSetZero(CvArr* arr);//对普通矩阵,每位都设为0;对稀疏矩阵,删除所以元素

 

一般算数运算 
intcvRound(double value ); int cvFloor( double value ); int cvCeil(double value);//求和double最(上/下)接近的整数 
float cvSqrt(floatvalue);//求平方根 
float cvInvSqrt(floatvalue);//求平方根倒数 
float cvCbrt(floatvalue);//求立方根 
float cvCbrt(floatvalue);//求两个向量的夹角 
int cvIsNaN(doublevalue);//判断是否是合法数 
int cvIsInf(doublevalue);//判断是否无穷 
void cvCartToPolar(const CvArr* x, const CvArr*y, CvArr* magnitude, CvArr* angle=NULL, intangle_in_degrees=0);// 

void cvPolarToCart(const CvArr* magnitude, const CvArr* angle,CvArr* x, CvArr* y, int angle_in_degrees=0);// 

void cvSolveCubic(const CvArr* coeffs, CvArr*roots);//求三次方方程解,coeffs作为三次方程的系数,可以是三元(三次方系数为1)或者四元

 

随机数生成 
CvRNGcvRNG(int64 seed=-1);//生成随机数生成器 
unsigned cvRandInt(CvRNG* rng); 

double cvRandReal(CvRNG* rng); 

void cvRandArr(CvRNG* rng, CvArr* arr, int dist_type, CvScalarparam1, CvScalar param2);// 

   dist_type决定生成随机数组中的分布   CV_RAND_UNI均匀分布   CV_RAND_NORMAL正态/高斯分布 
   param1:均匀分布中的下界(包含),正态分布中的平均值 
   param2:均匀分布中的上界(不包含),正态分布中的偏差

 

分布转换 
voidcvDFT(const CvArr* src, CvArr* dst, int flags, intnonzero_rows=0); 

int cvGetOptimalDFTSize(int size0); 

void cvMulSpectrums(const CvArr* src1, const CvArr* src2, CvArr*dst, int flags); 

void cvDCT(const CvArr* src, CvArr* dst, intflags);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: