二 如何进行预处理,人脸图像的人脸识别:
/ /无论是将图像转换为灰度,或使用现有的灰度图像.
IplImage *imageGrey;
if (imageSrc->nChannels == 3) {
imageGrey = cvCreateImage( cvGetSize(imageSrc), IPL_DEPTH_8U, 1 );
/ /从RGB(实际上它是BGR)转换为灰度。
cvCvtColor( imageSrc, imageGrey, CV_BGR2GRAY );
}
else {
/ /只使用输入图像,因为它已经是灰度.
imageGrey = imageSrc;
}
/ /调整的图像的大小是一致的大小,即使宽高比变化.
IplImage *imageProcessed;
imageProcessed = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 1);
/ /使图像具有固定大小.
/ / CV_INTER_CUBIC或CV_INTER_LINEAR的是良好的扩大,
/ //抽取伸缩CV_INTER_AREA是良好的,但糟糕的扩大.
cvResize(imageGrey, imageProcessed, CV_INTER_LINEAR);
/ /给一个标准的亮度和对比度的图像.
cvEqualizeHist(imageProcessed, imageProcessed);
..... Use 'imageProcessed' for Face Recognition ....
if (imageGrey)
cvReleaseImage(&imageGrey);
if (imageProcessed)
cvReleaseImage(&imageProcessed);
三 实现离线瞄准:
/ /告诉PCA退出的时候它有足够的特征脸.
CvTermCriteria calcLimit = cvTermCriteria( CV_TERMCRIT_ITER, nEigens, 1);
/ /计算平均图像,特征向量(特征脸)和特征(比率).
cvCalcEigenObjects(nTrainFaces, (void*)faceImgArr, (void*)eigenVectArr,
CV_EIGOBJ_NO_CALLBACK, 0, 0, &calcLimit,
pAvgTrainImg, eigenValMat->data.fl);
//标准化矩阵的特征值.
cvNormalize(eigenValMat, eigenValMat, 1, 0, CV_L1, 0);
/ /每个training项目的PCA子空间上的图像.
CvMat projectedTrainFaceMat = cvCreateMat( nTrainFaces, nEigens, CV_32FC1 );
int offset = projectedTrainFaceMat->step / sizeof(float);
for(int i=0; i<nTrainFaces; i++) {
cvEigenDecomposite(faceImgArr, nEigens, eigenVectArr, 0, 0,
pAvgTrainImg, projectedTrainFaceMat->data.fl + i*offset);
}
|