cvCalcEigenDecomposite——opencv内置PCA算法

 

cvCalscEigenObject()函数,包含于<cvAux.h>中。在PCA人脸识别的程序中,属于核心算法。

先翻译一段注解,原文来自:

http://www710.univ-lyon1.fr/~bouakaz/OpenCV-0.9.5/docs/ref/OpenCVRef_ObjectRecognition.htm

 

void cvCalcEigenObjects( int nObjects, void* input, void* output, int ioFlags, int ioBufSize, void* userData,

CvTermCriteria* calcLimit, IplImage* avg, float* eigVals )

输入为目标向量,计算正交特征基向量(orthonormal eigen basis)和目标平均值。

nObjects:
目标的数量。
input:
IplImage队列(数组)的指针,或者根随ioFlag的值变化的读回调函数(read callback function)

函数。
output:
对于目标的队列(数组)的指针,或者根随参数值变化的写回调函数(write callback functions)。
ioFlags:

ioBuffSize:
buffsize,0为未知大小。
userData:
指向回调函数(callback function)必须数据结构体的指针。
calcLimit:
终止迭代计算目标特征的条件。
avg:
avg。
eigVals:
以降序排列的特征值的行向量指针。可以为0。

 

cvCalcEigenObject计算出正交特征基(eigen face,而且是正交的,第二点是我猜的),以及输入目标的平均值。根据ioFlags参数,此函数可用在直接访问和回调函数两种模式下。根据calcLimit的参数,计算会在前maxIters主要特征目标被提取后结束(这句话有点绕,应该就是提取了前int_max_iter个特征值,),另一种结束的情况是:目前特征值同最s大特征值的比值降至calcLimit的epsilon值之下。


clacLimit的type参数必须为CV_TERMCRIT_NUMB, CV_TERMCRIT_EPS,

or CV_TERMCRIT_NUMB | CV_TERMCRIT_EPS。
函数返回maxIter&epsilond的真值。

平均值avg
计算得到的特征目标,排序是根据相应的特征值降序而得。

 

程序中这个函数的例子是这样的。

 // compute average image, eigenvalues, and eigenvectors
 cvCalcEigenObjects(
  nTrainFaces,
  (void*)faceImgArr,
  (void*)eigenVectArr,
  CV_EIGOBJ_NO_CALLBACK,
  0,
  0,
  &calcLimit,
  pAvgTrainImg,
  eigenValMat->data.fl);

参数第一个不用说。faceImgArr,是IplImage**,存有nTrainFaces个训练用人脸。eigenVectArr同样也是IplImage**,是需要计算的特征脸(eigenface),每个大小和训练脸相同,取前nEigens个储存。

这段代码有助于理解。

for(i=0; i<nEigens; i++)
  eigenVectArr[i] = cvCreateImage(faceImgSize, IPL_DEPTH_32F, 1);

后面3个参数,表明不需要回调函数。

calcLimit是一个迭代算法终止准则

赋值如下calcLimit = cvTermCriteria( CV_TERMCRIT_ITER, nEigens, 1);

它的类型定义如下:

typedef struct CvTermCriteria

{

  int type;  int max_iter;    //最大迭代次数

  double epsilon;    //结果精确性

}

看刚才翻译的那段已经说明:

根据calcLimit的参数,计算会在前maxIters主要特征目标被提取后结束(这句话有点绕,应该就是提取了前int_max_iter个特征值),另一种结束的情况是:目前特征值同最大特征值的比值降至calcLimit的epsilon值之下。在这个迭代算法终止条件的约束下,于是就产生了nEigen个特征脸(object's eigen vector)

程序后两个参数,一个是平均目标,另一个是存nEigen个特征值的向量。

 

核心已经包含在opencv里面了,我们通过这个函数可以方便地调用这个算法、高效地实现目的。

 

 

 

 

 

 

PCA(Eigenface)方法是人脸识别的主流方法之一。cvEigenDecomposite()函数作用是将人脸图像通过Eigenface变换矩阵,投射到子空间中。子空间中的人脸向量,是一个1×nEigens(nEigens由自己取得)的行向量,极大地降低了数据维度,便于下一步的聚类、识别。结合具体例子,尽量清楚地跟大家讨论这个函数的用途。

 

 

函数说明如下:

EigenDecomposite

Calculates all decomposition coefficients for input object

计算输入目标的所有的分解系数

void cvEigenDecomposite( IplImage* obj, int nEigObjs, void* eigInput,
                         int ioFlags, void* userData, IplImage* avg, float* coeffs );

 

obj
Input object.
输入目标
nEigObjs
Number of eigen objects.
自选eigen数量
eigInput
Pointer either to the array of IplImage input objects or to the read callback function according to the value of the parameter ioFlags.
eigenface向量组成的变换矩阵,数据结构属于IplImage队列,或者根据ioFlag参数值变化的回调函数。
ioFlags
Input/output flags.
userData
Pointer to the structure that contains all necessary data for the callback functions.
avg
Averaged object.
coeffs
Calculated coefficients; an output parameter.
这是唯一一个输出,即人脸在子空间的投影,,,(decomposition coefficients... 数学不太好- -)

The function cvEigenDecomposite calculates all decomposition coefficients for the input object using the previously calculated eigen objects basis and the averaged object. Depending onioFlags parameter it may be used either in direct access or callback mode.

 

在程序中,cvCalcEigenObject()只需要在训练时使用,依据训练样本,计算Eigenface的变换矩阵。如本页的装饰图片所示。

而cvEigenDecomposite(),既需要产生训练样本的投影,又需要产生测试脸的投影。

  cvEigenDecomposite(
   faceImgArr[i],
   nEigens,
   eigenVectArr,
   0, 0,
   pAvgTrainImg,
   projectedTestFace);

这里是对于每张测试脸faceImgArr[i],产生投影。训练时得到训练样本投影脸的函数调用方法如下:

 for(i=0; i<nTrainFaces; i++)
 {
  //int offset = i * nEigens;
  cvEigenDecomposite(
   faceImgArr[i],
   nEigens,
   eigenVectArr,
   0, 0,
   pAvgTrainImg,
   projectedTrainFaceMat->data.fl + i*offset);
 }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值