opencv矩阵操作_第1页
opencv矩阵操作_第2页
opencv矩阵操作_第3页
opencv矩阵操作_第4页
opencv矩阵操作_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、通用矩阵乘法void cvGEMM( const CvArr* srcl, const CvArr* src2, double alpha, const CvArr* src3, double beta, CvArr* dst, int tABC=0 );#define cvMatMulAdd( srcl, src2, src3, dst ) cvGEMM( srcl, src2, 1, src3, 1, dst, 0 )#define cvMatMul( srcl, src2, dst ) cvMatMulAdd( srcl, src2, 0, dst ) srcl第一输入数组src2第二输

2、入数组src3第三输入数组(偏移量),如果没有偏移量,可以为空(NULL)。dst输出数组tABCT操作标志,可以是0或者下面列举的值的组合:CV_GEMM_A_T -转置 srclCV_GEMM_B_T - 转置 src2CV_GEMM_C_T - 转置 src3例如,CV_GEMM_A_T+CV_GEMM_C_T 对应alpha*srclT*src2 + beta*src3T函数cvGEMM执行通用矩阵乘法:dst = alpha*op(srcl) *op(src2) + beta*op (src3),这里 op (X)是 X 或者 XT所有的矩阵应该有相同的数据类型和协调的矩阵大小。支持

3、实数浮点矩阵或者复 数浮点矩阵。编辑Transform对数组每一个元素执行矩阵变换void cvTransform( const CvArr* src, CvArr* dst, const CvMat* transmat, const CvMat* shi.ftvec=NULL );src输入数组dst输出数组transmat变换矩阵shiftvec可选偏移向量函数cvTransform对数组src每一个元素执行矩阵变换并将结果存储到dst:dst(I)=transmat*src (I) + shiftvec或者dst(I)k=sumj(transmat(k, j)*src(I)j) + sh

4、iftvec(k)N-通道数组src的每一个元素都被视为一个元向量,使用一个MXN的变换 矩阵transmat和偏移向量shiftvec把它变换到一个M-通道的数组dst的 一个元素中。这里可以选择将偏移向量shiftvec嵌入到transmat中。这样 的话transmat应该是MXN+1的矩阵,并且最右边的一列被看作是偏移向量。输入数组和输出数组应该有相同的位深(depth)和同样的大小或者R0I大小。 transmat和shiftvec应该是实数浮点矩阵。该函数可以用来进行ND点集的儿何变换,任意的线性颜色空间变换,通道转换 等。MulTransposed计算数组和数组的转置的乘积voi

5、d cvMulTransposed( const CvArr* src, CvArr* dst, int order, const CvArr* deIta二NULL );src输入矩阵dst目标矩阵order乘法顺序delta一个可选数组,在乘法之前从src中减去该数组。函数cvMulTransposed计算src和它的转置的乘积。函数求值公式:如果 order二0dst二(src-delta)(src-delta)T否则dst=(src-delta)T*(src-delta)编辑Trace返回矩阵的迹CvScalar cvTrace ( const CvArr* mat );mat输入矩阵

6、函数cvTrace返回矩阵mat的对角线元素的和。tr(src)=工 mat(2; 2)91编辑Transpose矩阵的转置void cvTranspose( const CvArr* src, CvArr* dst );ttdefine cvT cvTransposesrc输入矩阵dst目标矩阵函数cvTranspose对矩阵src求转置:dst(i, j)=src(j, i)注意,假设是复数矩阵不会求得复数的共辘。共辘应该是独立的:查看的cvXorS 例子代码。编辑Det返回矩阵的行列式值double cvDet ( const CvArr* mat );mat输入矩阵函数cvDet返回方

7、阵mat的行列式值。对小矩阵直接计算,对大矩阵用高斯 (GAUSSIAN)消去法。对于对称正定(positive-determined)矩阵也可以用SVD函 数来求,U二V二NULL ,然后用w的对角线元素的乘积来计算行列式。编辑Invert查找矩阵的逆矩阵或伪逆矩阵double cvlnvert( const CvArr* src, CvArr* dst, int method二CV_LU );define cvlnv cvlnvertsrc输入矩阵dst目标矩阵method求逆方法:CV_LU -最佳主元选取的高斯消除法CV_SVD -奇异值分解法(SVD)CV_SVD_SYM -正定对称

8、矩阵的SVD方法函数cvlnvert对矩阵src求逆并将结果存储到dst。如果是LU方法该函数返回src的行列式值(src必须是方阵)。如果是0, 矩阵不求逆,dst用0填充。如果SVD方法该函数返回src的条件数的倒数(最小奇异值和最大奇异值的比 值),如果src全为0则返回0。如果src是奇异的,SVD方法计算一个 伪逆矩阵。Solve求解线性系统或者最小二乘法问题int cvSolve( const CvArr* srcl, const CvArr* src2, CvArr* dst, int method二CV_LU );srcl输入矩阵 src2线性系统的右部dst输出解答metho

9、d解决方法(矩阵求逆):CV_LU -最佳主元选取的高斯消除法CV_SVD -奇异值分解法(SVD)CV_SVD_SYM -对正定对称矩阵的SVD方法函数cvSolve解决线性系统或者最小二乘法问题(后者用SVD方法可以解 决):dst = arg min |srcl X src2|如果使用CV_LU方法。如果srcl是非奇异的,该函数则返回1 ,否则返回 0 ,在后一种情况下dst是无效的。编辑SVD对实数浮点矩阵进行奇异值分解void cvSVD( CvArr* A, CvArr* W, CvArr* U二NULL, CvArr* V-NULL, int flags二0 );AMXN的输入

10、矩阵W结果奇异值矩阵(MXN或者NXN)或者向量(NX1).U可选的左部正交矩阵(MXMor MXN)如果CV_SVD_U_T被指定,应该 交换上面所说的行与列的数目。V可选右部正交矩阵(NXN)flags操作标志;可以是0或者下面的值的组合:CV_SVD_MODIFY_A通过操作可以修改矩阵srcl。这样处理速度会 比较快OCV_SVD_U_T意味着会返回转置矩阵U ,指定这个标志将加快处理 速度。 CV_SVD_V_T意味着会返回转置矩阵V ,指定这个标志将加快处理 速度。函数cvSVD将矩阵A分解成一个对角线矩阵和两个正交矩阵的乘积:A = UWVT这里w是一个奇异值的对角线矩阵,它可以

11、被编码成奇异值的一维向量,1;和v 也是一样。所有的奇异值都是非负的并按降序存储。(U和V也相应的存储)。SVD算法在数值处理上已经很稳定,它的典型应用包括:当A是一个方阵、对称阵和正矩阵时精确的求解特征值问题,例如,当A 时一个协方差矩阵时。在这种情况下W将是一个特征值的的向量,并且 U二V是矩阵的特征向量(因此,当需要计算特征向量时U和V只需要讣 算其中一个就可以了)。精确的求解病态线性系统。超定线性系统的最小二乘求解。上一个问题和这个问题都可以用指定 CV_SVD 的 cvSolve 方法。精确计算矩阵的不同特征,如秩(非零奇异值的数口),条件数(最大奇异 值和最小奇异值的比例),行列式

12、值(行列式的绝对值等于奇异值的乘积). 上述的所有这些值都不要求计算矩阵U和V。编辑SVBkSb奇异值回代算法(back substitution)void cvSVBkSb( const CvArr* W, const CvArr* U, const CvArr* V, const CvArr* B, CvArr* X, int flags );W奇异值矩阵或者向量u左正交矩阵(可能是转置的)V右正交矩阵(可能是转置的)B原始矩阵A的伪逆的乘法矩阵。这个是可选参数。如果它被省略则假定 它是一个适当大小的单位矩阵(因此X将是A的伪逆的重建)X目标矩阵:奇异值回代算法的结果flags操作标志,和

13、刚刚讨论的cvSVD的标志一样。函数cvSVBkSb为被分解的矩阵A和矩阵B讣算回代逆(back substitution) (参见cvSVD说明):X=V*W-1*UT*B这里W-l(i, i)=l/W(i, i)如果 W(i, i) epsilon*sumiW(i, i), 否则:0.epsilon是一个依赖于矩阵数据类型的的很小的数。该函数和cvSVD函数被用 来执行cvlnvert和cvSolve,用这些函数(svd & bksb)的原因是初级函数(low-level)函数可以避免高级函数(inv & solve)计算中内部分配的临时 矩阵。编辑EigenWil算对称矩阵的特征值和特征

14、向量void cvEigenVV( CvArr* mat, CvArr* evects, CvArr* evals, double eps二0 );mat输入对称方阵。在处理过程中将被改变。evects特征向量输岀矩阵,连续按行存储evals特征值输出矩阵,按降序存储(当然特征值和特征向量的排疗;是同步的)。eps对角化的精确度(典型地,DBL_EPSILON= 10-15就足够了)。函数cvEigenVV讣算矩阵A的特征值和特征向量:mat*evects(i,:)二 evals(i)*evects(i,:)(在 MATLAB 的记法)矩阵A的数据将会被这个函数修改。目前这个函数比函数cvSV

15、D要慢,精确度要低,如果已知A是正定的,(例如, 它是一个协方差矩阵),它通常被交给函数cvSVD来计算其特征值和特征向量, 尤其是在不需要讣算特征向量的情况下 编辑CalcCovarMatrix计算向量集合的协方差矩阵void cvCalcCovarMatrix( const CvArr* vects, int count, CvArr* cov_mat, CvArr* avg, int flags );vects输入向量。他们必须有同样的数据类型和大小。这个向量不一定非是一维 的,他们也可以是二维(例如,图像)等等。count输入向量的数目cov_mat输出协方差矩阵,它是浮点型的方阵。a

16、vg输入或者输岀数组(依赖于标记“flags”)-输入向量的平均向量。 flags操作标志,下面值的组合:CV_COVAR_SCRAMBLED -输出协方差矩阵按下面计算:scale * vects- avg, vects_Y - avg, . . . J * _vects_0_ - avg, vects_1. -avg,.即协方差矩阵是 countXcount.这样一个不 寻常的矩阵用于一组大型向量的快速PCA方法(例如,人脸识别的 EigenFaces技术)。这个混杂(scrambled)矩阵的特征值将和真正的 协方差矩阵的特征值匹配,真正的特征向量可以很容易的从混杂 (scrambled

17、)协方差矩阵的特征向量中计算出来。CV_COVAR_NORMAL -输出协方差矩阵被计算成:scale * rectslO. - avg, vects. - avg, . . . *-avg, vects_l: - avg. .V,也就是说,cov_mat将是一个和每一个输入 向量的元素数目具有同样线性大小的通常协方差矩阵。CV_COVAR_SCRAMBLED 和 CV_COVAR_NORMAL 只能同时指定其中一个。 CV_COVAR_USE_AVG -如果这个标志被指定,该函数将不会从输入向量中 计算avg ,而是用过去的avg向量,如果avg已经以某种方式计算出 来了这样做是很有用的。或

18、者如果协方差矩阵是部分讣算出来的-倘若 这样,avg不是输入向量的子集的平均值,而是整个集合的平均向量。 CV_COVAR_SCALE -如果这个标志被指定,协方差矩阵被缩放了。the covariation matrix is scaled.在normal模式下缩放比例是 1. /count,在scrambled模式下缩放比例是每一个输入向量的元素总 和的倒数。缺省地(如果没有指定标志)协方差矩阵不被缩放 (scale二 1) 函数cvCalcCovarMatrix计算输入向量的协方差矩阵和平均向量。该函数可以 被运用到主成分分析中(PCA),以及马氏距离(Mahalanobis dista

19、nce)比较 向量中等等。编辑Mahalanobisil算两个向量之间的马氏距离(Mahal anob is distance)double cvMahalanobis ( const CvArr* vecl, const CvArr* vec2, CvArr* mat );vecl第一个一维输入向量vec2笫二个一维输入向量mat协方差矩阵的逆矩阵函数cvMahalanobis计算两个向量之间的加权距离,其返回结果是:d(veclvec2)=* (vecl(-z) ec2(i) * (feel(7) vec2(j)V灯协方差矩阵可以用函数cvCalcCovarMatrix计算出来,逆矩阵可以

20、用函数 cvlnvert计算出来(CV_SVD方法是一个比较好的选择,因为矩阵可能是奇异 的).编辑CalcPCA对一个向量集做PCA变换void cvCalcPCA( const CvArr* data, CvArr* avg,CvArr* eigenvalues, CvArr* eigenvectors, int flags ); data输入数据,每个向量是单行向量(CV_PCA_DATA_AS_ROW)或者单列向量 (CV_PCA_DATA_AS_COL).avg平均向量,在函数内部计算或者由调用者提供eigenvalues输出的协方差矩阵的特征值eigenvectors输岀的协方差矩

21、阵的特征向量(也就是主分量),每个向量一行flags操作标志,可以是以下儿种方式的组合:CV_PCA_DATA_AS_ROW -向量以行的方式存放(也就是说任何一个向量都 是连续存放的)CV_PCA_DATA_AS_COL -向量以列的方式存放(也就是说某一个向量成分 的数值是连续存放的)(上面两种标志是互相排斥的)CV_PCA_USE_AVG -使用预先计算好的平均值该函数对某个向量集做PCA变换.它首先利用cvCalcCovarMatrix讣算协方差矩 阵然后计算协方差矩阵的特征值与特征向量输出的特征值/特征向量的个数小 于或者等于 M IN (rows (data), cols (dat

22、a).编辑ProjectPCA把向量向某个子空间投影void cvProjectPCA( const CvArr* data, const CvArr* avg, const CvArr* eigenvectors, CvArr* result )data输入数据,每个向量可以是单行或者单列avg平均向量要么它是单行向量那么意味着输入数据以行数据的形式存放, 要么就是单列向量,那么就意味着那么输入向量就是以列的方式存放. eigenvectors特征向量(主分量),每个向量一行.result输岀的分解系数矩阵,矩阵的行数必须与输入向量的个数相等,矩阵的列 数必须小于特征向量的行数.该函数将输入

23、向量向一个正交系(eigenvectors)投影.在讣算点乘之前,输入向 量要减去平均向量:result(i, :) = (data(i, :)-avg)*eigenvectors, / for CV_PCA_DATA_AS_ROW layout编辑BackProjectPCA根据投影系数重构原来的向量void cvBackProjectPCA( const CvArr* proj, const CvArr* avg,const CvArr* eigenvects, CvArr* result );proj输入数据,与cvProjectPCA里面的格式一致avg平均向量如果它是单行向量,那么意

24、味着输出向量是以行的方式存放否 则就是单列向量,那么输出向量就是以列的方式存放.eigenvectors特征向量(主分量),每个向量一行.result输岀的重构岀来的矩阵该函数根据投影系数車构原来的向量:result (i, :)=proj (i, :)*eigenvectors + avg / for CV_PCA_DATA_AS_ROW layout附矩阵操作分配释放矩阵空间综述:oOpenCV有针对矩阵操作的C语言函数.许多其他方法提供了更加 方便的C+接口,其效率与OpenCV 一样.oOpenCV将向量作为1维矩阵处理.。矩阵按行存储,每行有4字节的校整.分配矩阵空间:CvMat*

25、cvCreateMat(int rows, int cols, int type):type:矩阵元素类型.格式为CV_bit_depth (S |U |F) C 例如:CV_8UC1表示8狂无符号单通道矩阵,CV.32SC2表示 32位有符号双通道命阵.例程:CvMat* M 二 cvCreateMat(4, 4, CV.32FC1):释放矩阵空间:CvMat* M 二 cvCreateMat(4, 4, CV.32FC1); cvReleaseMat(&M);复制矩阵:CvMat* Ml = cvCreateMat(4,4, CV_32FC1);CvMat* M2;M2=cvCloneMa

26、t(Ml);初始化矩阵:double a = 1,2,3,4,5,6,7,8,9, 10, 11, 12 ;CvMat Ma=cvMat(3, 4, CV_64FC1, a);另一种方法:CvMat Ma;cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a):初始化矩阵为单位阵:CvMat* M = cvCreateMat(4, 4, CV_32FC1);cvSetldentity(M); /这里似乎肴问题,不成功存取矩阵元素假设需要存取一个2维浮点矩阵的笫(i, j)个元素.间接存取矩阵元素:cvmSet (M, i, j, 2. 0) ; / Set M(i, j

27、)t = cvmGet (M, i, j) ; / Get M(i, j)直接存取,假设使用4-字节校正:CvMat* M= cvCreateMat(4, 4, CV_32FC1);int n= M-cols;float二 Mdatd. fl;datai*n+j = 3. 0;直接存取,校正字节任意:CvMat* M= cvCreateMat(4, 4, CV_32FC1);intstep= Mstep/sizeof(float);float *data 二 M-datafl;(data+i*step)j = 3. 0;单矩阵操作:直接存取一个初始化的矩阵元素:double a16;CvMat

28、 Ma 二 cvMat(3, 4, CV_64FC1, a); ai*4+j = 2.0; / Ma(i, j)=2. 0;矩阵/向量操作矩阵-矩阵操作:CvMat *Ma,*Mc;cvAdd (Ma, Mb, Me);/ Ma+Mb-MecvSub(Ma, Mb, Me);/ Ma-Mb- MecvMatMul (Ma, Mb, Me);/ Ma*Mb一Me按元素的矩阵操作:CvMat *Ma, *Mb, *Mc;cvMul (Ma, Mb, Me);/ Ma. *Mb- MeevDiv (Ma, Mb, Me);/ Ma. /Mb- MeevAddS (Ma, cvScalar (TO.

29、0), Me);/ Ma. -10 - Me向量乘积:double va = 1, 2, 3; double vb = 0, 0, 1;double vc3;CvMat VacvMat(3,CvMat Vb二cvMat(3,CvMat Vc=cvMat(3,1, CV.64FC1, va);1, CV_64FC1, vb);1, CV.64FC1, vc);Va Vb -/ 向量积:Va x Vb -double res=cvDotProduct (&Va, &Vb) ; / 点乘:cvCrossProduct(&Va, &Vb, &Vc);Vcendverbatim注意a vb, vc在向量

30、积中向量元素个数须相同.CvMat *Ma, *Nfb;cvTranspose (Ma, Mb);/ transpose (Ma) -Mb (4s能对自身进行转置)CvScalar t = cvTrace(Ma) ; / trace(Ma) - t.val0double d = cvDet(Ma):/ det(Ma) - dcvlnvert(Ma, Mb);/ inv(Ma) - Mb非齐次线性系统求解:CvMat* ACvMat* xCvMat* b=cvCreateMat(3, 3, CV_32FC1);=cvCreateMat(3, 1, CV_32FC1);=cvCreateMat(3

31、, 1, CV_32FC1);cvSolve(&A, &b, &x);/ solve (Ax=b) for特征值分析(针对对称矩阵):CvMat* ACvMat* ECvMat* 1 cvEigenVV(&A,=cvCreateMat(3, 3, CV_32FC1);=cvCreateMat(3, 3, CV_32FC1);=cvCreateMat(3, 1, CV_32FC1);&E, &1) ;/ 1 = A的特征值(降序排列)/ E 二对应的特征向量(每行)奇异值分解SVD:CvMat* ACvMat* UCvMat* DCvMat* V cvSVD (A, D, U, V,cvCr e

32、at eMat (3, 3, CVcvCr eat eMat (3, 3, CVcvCreat eMat (3, 3, CVcvCreat eMat (3, 3, CV CV_SVD_U_T;CV_SVD_V32FC1);32FC1);32FC1);32FC1);T): / A 二 U D VT标号使得U和V返回时被转置(若没有转置标号,则有问题不成 功!)视频序列操作从视频序列中抓取一帧-OpenCV支持从摄像头或视频文件(AVI)中抓取图像. 从摄像头获取初始化:CvCapture* capture = cvCaptureFromCAM(0) ; / capture from video

33、device #0从视频文件获取初始化:CvCapture* capture 二 cvCaptureFromAVI(inf订e. avi);抓取帧:Ipllmage* img 二 0;if(!cvGrabFrame(capture)/抓取一帧printf(Could not grab a frdmen7);exit(0);img=cvRetrieveFrame(capture):/ 恢复获取的帧图像要从多个摄像头同时获取图像,首先从每个摄像头抓取一帧.在抓取 动作都结束后再恢复帧图像.释放抓取源:cvReleaseCapture(&capture);注意曲设备抓取的图像是由capture函数自

34、动分配和释放的.不要试 图自己释放它.获取/设定帧信息获取设备特性:cvQueryFrame(capture); / this call is necessary to get correct / capture propertiesint frameH= (int) cvGetCaptureProperty (capture,CV_CAP_PROP_FRME_HEIGHT);int frameW= (int) cvGetCaptureProperty(capture,CV_CAP_PROP_FRME_WIDTH);int fps= (int)cvGetCaptureProperty (cap

35、ture, CV_CAP_PROP_FPS); int numFrames = (int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_COUNT);所有帧数似乎只与视频文件有关.用摄像头时不对,奇怪! !获取帧信息:floatposMsec=cvGetCaptureProperty (capture, CV_CAP_PROP_POS_MSEC);int posFrames= (int) cvGetCaptureProperty(capture,CV_CAP_PROP_POS_FRMES);floatposRatio=cvGetCaptureProperty(capture, CV_CA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论