opencv求特征值和特征向量

IplImage:表示图片。
 cvTermCriteria:用来决定学习演算法何时结束。
 cvSize:用来表示图片大小。

 cvCvtColor:用来转换图片的色彩空间。
 cvLoadImage:载入一张图片。
 cvCreateImage:依照IplImage结构配置记忆体。
 cvCalcEigenObjects:计算传入影响阵列的eigen vector(特征向量)、  eigen value(特征根)、image average(影像平均值)
 cvEigenDecomposite:透过eigen vector和原始影像集来解析每张图  片降维后对应的系数coefficients。
 cvEigenProjection:投影图片在特征空间。
 cvSaveImage:存储图片。
 cvReleaseImage:释放记忆体
 宣告eigenObjects 用來存储载入的图片。
 IplImage **objects = new IplImage*[nEigens];
 将文件夹中的图片读入objects(灰度的)
 IplImage* tmpImg;
 for(int i=0;i<this->FileListBox1->Count;i++)
 {
  tmpImg = cvLoadImage(this->FileListBox1-        >FileName.c_str(),CV_LOAD_IMAGE_COLOR);
  objects[i]=cvCreateImage( cvSize(tmpImg-        >width,tmpImg->height),IPL_DEPTH_8U,1);
  cvCvtColor(tmpImg,objects[i],CV_BGR2GRAY);
  this->FileListBox1->ItemIndex++;
 }

 

 接下來,在计算eigenvector之前,我们要先配置一些记忆体空间给变数  eigenObjects,让计算出来的eigenvector可以存放在变数  eigenObjects中。
CvSize size = cvSize(objects[0]->width,objects[0]->height);  
for(int k = 0; k < nEigens; k++)
  eigenObjects[k]=
  cvCreateImage=(size,IPL_DEPTH_32F,1);

配置记忆体空间,用来存放训练样本图片的平均值。
avg = cvCreateImage(size, IPL_DEPTH_32F, 1);指定PCA要训练到何时才能结束,CV_TERMCRIT_EPS表示精确度到0.05就可以结束,CV_TERMCRIT_ITER表示迭代nEigens次就可以结束。(nEigens=nTrainFaces-1,nTrainFaces表示xunl)
CvTermCriteria cri=cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, nEigens, 0.05);

接下来我们就可以用cvCalcEigenObjects计算eigenface//Calculate EigenFaces, and put in eigenObjects
cvCalcEigenObjects(
nTrainFaces-1 ,objects,eigenObjects, 0,0,0, &cri, avg, eigVals);
在上面方法中,我们必须传入-1的个数值(nTrainFaces-1),objects训练样本,cri训练终止条件,avg用來存储图片集平均值的变数,eigVals用来存储计算出来的eigenvalue。

接下来,因为要对图片集objects里面的每张图片分別处理。所以有一個for循环。我们先用cvEigenDecomposite求出cofficients


再用求出的系数当做input传给cvEigenProjection方法,计算投影图片。因此最后得到人脸投影在特征空间(eigenspace)上的结果,存在out变数中,这就是我们要找的eigenface
(我们可以用cvSaveImage方法将eigenface存成图片)
for(int k = 0; k < nTrainFaces; k++)
{
    float  *coeffs = new float[kValueUses];
    IplImage *out = cvCreateImage
              (size,IPL_DEPTH_8U, 1);
    //compute coefficients
    cvEigenDecomposite(objects[k],
    kValueUses ,eigenObjects, 0,0, avg, coeffs);
    //image reconstruction
    cvEigenProjection( eigenObjects,
    kValueUses, 0, 0, coeffs, avg, out);
    cvSaveImage(filename, out);

}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wangyadong/archive/2008/11/06/3236350.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值