cvEigenVV 函数的使用

void cvEigenVV( CvArr* mat, CvArr* evects, CvArr* evals, double eps=0 );
mat
输入对称方阵。在处理过程中将被改变。
evects
特征向量输出矩阵, 连续按行存储  (按行?)
evals
特征值输出矩阵,按降序存储(当然特征值和特征向量的排序是同步的)。
eps
对角化的精确度 (典型地, DBL_EPSILON=≈10-15 就足够了)

其中的lowindex和highindex都有默认值为-1,eps默认值为0 

#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
#include <stdio.h>

void PrintMatrix(CvMat *Matrix,int Rows,int Cols);

double Array1[]={2,3,0,3,5,-1,0,-1,2};

int main()
{
     CvMat *Matrix1=cvCreateMat(3,3,CV_64FC1);
     CvMat *EigenValue_Row=cvCreateMat(3,1,CV_64FC1);
     CvMat *EigenValue=cvCreateMat(3,3,CV_64FC1);
     CvMat *EigenVector=cvCreateMat(3,3,CV_64FC1);
     CvMat *EigenVector_Invert=cvCreateMat(3,3,CV_64FC1);
     CvMat *ResultMatrix=cvCreateMat(3,3,CV_64FC1);
     cvSetData(Matrix1,Array1,Matrix1->step);
     cvSetZero(EigenValue);

     cvEigenVV(Matrix1,EigenVector,EigenValue_Row,DBL_EPSILON);

     printf("\nThe EigenValue_Row is:\n");
     PrintMatrix(EigenValue_Row,EigenValue_Row->rows,EigenValue_Row->cols);

     printf("\nThe EigenVector is:\n");
     PrintMatrix(EigenVector,EigenVector->rows,EigenVector->cols);

     printf("\nThe EigenValue is:\n");
     cvSet2D(EigenValue,0,0,cvGet2D(EigenValue_Row,0,0));
     cvSet2D(EigenValue,1,1,cvGet2D(EigenValue_Row,1,0));
     cvSet2D(EigenValue,2,2,cvGet2D(EigenValue_Row,2,0));
     PrintMatrix(EigenValue,EigenValue->rows,EigenValue->cols);

     cvTranspose(EigenVector,EigenVector);
     cvmMul(EigenVector,EigenValue,ResultMatrix);
     cvInvert(EigenVector,EigenVector_Invert,CV_LU);
     cvmMul(ResultMatrix,EigenVector_Invert,ResultMatrix);

     printf("\nTo validate Matrix\n");
     PrintMatrix(ResultMatrix,ResultMatrix->rows,ResultMatrix->cols);

     system("pause");

}

void PrintMatrix(CvMat *Matrix,int Rows,int Cols)
{
    for(int i=0;i<Rows;i++)
     {
        for(int j=0;j<Cols;j++)
         {
             printf("%.2f ",cvGet2D(Matrix,i,j).val[0]);
         }
         printf("\n");
     }
}
结果输出:


利用matlab 得到的结果是:

A =

     2     3     0
     3     5    -1
     0    -1     2

[v,d]=eigs(A)

v =

   -0.5071   -0.3162    0.8018
   -0.8452    0.0000   -0.5345
    0.1690   -0.9487   -0.2673


d =

    7.0000         0         0
         0    2.0000         0
         0         0    0.0000
我们可以看到利用matlab 得到的结果 与opencv 得到的结果不是很一样



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值