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