OPENCV中的PCA、CvvImage、IplImage和CvMat的相互转化

1. PCA

         //初始化数据
        CvMat* pData = cvCreateMat( 总的样本数, 每个样本的维数, CV_32FC1 );  //每一行表示一个样本
        CvMat* pMean = cvCreateMat(1, 样本的维数, CV_32FC1);
        CvMat* pEigVals = cvCreateMat(1, 样本的维数, CV_32FC1); //pEigVals中的每个数表示一个特征值
        CvMat* pEigVecs = cvCreateMat( 样本的维数, 样本的维数, CV_32FC1);  //每一行表示一个特征向量
 
        //PCA处理,计算出平均向量pMean,特征值pEigVals和特征向量pEigVecs
        cvCalcPCA( pData, pMean, pEigVals, pEigVecs, CV_PCA_DATA_AS_ROW );
 
        //选出前P个特征向量(主成份),然后投影,结果保存在pResult中            
        CvMat* pResult = cvCreateMat( 总的样本数, PCA变换后的样本维数(即主成份的数目), CV_32FC1 );
        cvProjectPCA( pData, pMean, pEigVecs, pResult );
 
        //重构,结果保存在pRecon中
        CvMat* pRecon = cvCreateMat( 总的样本数, 每个样本的维数, CV_32FC1 );
        cvBackProjectPCA( pResult, pMean, pEigVecs, pRecon );
 
        //重构误差的计算
        //计算pRecon和pData的"差"就可以了.
 
        附:读取矩阵pData中第i行的第j个元素的方法:cvmGet( pData, i, j ).
 

2. CvvImage

      利用CvvImage可以方便地在MFC中画图(DrawToHdc函数),但是在调用Copyof这个函数时,要写成
      CvvImage img;
      IplImage src;
      img.Copyof( src, src->nChannels),
      否则,如果写成img.Copyof(src),src是单通道的话,会出现错误!
      CvvImage不仅能处理3通道,也能处理单通道。

3. IplImage和CvMat的相互转化

     IplImage* img = cvLoadImage( "d:\1.jpg" ); 
     CvMat matHearder;
     CvMat* mat = cvGetMat( img, &matHearder );
 
      int i;
      for( i = 0; i < 10; i++  )
           printf( "%d  ", (u_char)img->imageData[i] );
      printf( "n" );
 
      for( i = 0; i < 10; i++  )
           printf( "%d  ", mat->data.ptr[i] );
     注意:(1)有些函数并不会自动将IplImage转化为CvMat,如pca和svd的相关函数。
             (2)上述转换后mat中元素的范围为[0,255],img的范围是[-128,127].
             (3)要把img中的数据转换成无符号整数时,需要强制类型转换 u_char;

你可能感兴趣的:(mfc)