cvCalcEigenDecomposite——opencv内置PCA算法的第二个函数小记。
本文来自:http://www.cnblogs.com/linzhao/archive/2012/01/05/2312758.html
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 on ioFlags 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); }