cvCalcEigenDecomposite——opencv内置PCA算法的第二个函数

来源:互联网 发布:注册一个淘宝客公司 编辑:程序博客网 时间:2024/05/21 10:42

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 parameterioFlags.
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);
}