- // eigenface.c, by Robin Hewitt, 2007
- //
- // Example program showing how to implement eigenface with OpenCV
- // Usage:
- //
- // First, you need some face images. I used the ORL face database.
- // You can download it for free at
- // www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html
- //
- // List the training and test face images you want to use in the
- // input files train.txt and test.txt. (Example input files are provided
- // in the download.) To use these input files exactly as provided, unzip
- // the ORL face database, and place train.txt, test.txt, and eigenface.exe
- // at the root of the unzipped database.
- //
- // To run the learning phase of eigenface, enter
- // eigenface train
- // at the command prompt. To run the recognition phase, enter
- // eigenface test
- #include
- #include
- #include "cv.h"
- #include "cvaux.h"
- #include "highgui.h"
- //// Global variables
- IplImage ** faceImgArr = 0; // array of face images
- CvMat * personNumTruthMat = 0; // array of person numbers
- int nTrainFaces = 0; // the number of training images
- int nEigens = 0; // the number of eigenvalues
- IplImage * pAvgTrainImg = 0; // the average image
- IplImage ** eigenVectArr = 0; // eigenvectors
- CvMat * eigenValMat = 0; // eigenvalues
- CvMat * projectedTrainFaceMat = 0; // projected training faces
- //// Function prototypes
- void learn();
- void recognize();
- void doPCA();
- void storeTrainingData();
- int loadTrainingData(CvMat ** pTrainPersonNumMat);
- int findNearestNeighbor(float * projectedTestFace);
- int loadFaceImgArray(char * filename);
- void printUsage();
- //////////////////////////////////
- // main()
- //
- void main( int argc, char** argv )
- {
- // validate that an input was specified
- if( argc != 2 )
- {
- printUsage();
- return;
- }
- if( !strcmp(argv[1], "train") ) learn();
- else if( !strcmp(argv[1], "test") ) recognize();
- else
- {
- printf("Unknown command: %s\n", argv[1]);
- printUsage();
- }
- }
- //////////////////////////////////
- // learn()
- //
- void learn()
- {
- int i, offset;
- // load training data
- nTrainFaces = loadFaceImgArray("train.txt");
- if( nTrainFaces < 2 )
- {
- fprintf(stderr,
- "Need 2 or more training faces\n"
- "Input file contains only %d\n", nTrainFaces);
- return;
- }
- // do PCA on the training faces
- doPCA();
- // project the training images onto the PCA subspace
- projectedTrainFaceMat = cvCreateMat( nTrainFaces, nEigens, CV_32FC1 );
- offset = projectedTrainFaceMat->step / sizeof(float);
- for(i=0; i<nTrainFaces; i++)
- {
- //int offset = i * nEigens;
- cvEigenDecomposite(
- faceImgArr[i],
- nEigens,
- eigenVectArr,
- 0, 0,
- pAvgTrainImg,
- //projectedTrainFaceMat->data.fl + i*nEigens);
- projectedTrainFaceMat->data.fl + i*offset);
- }
- // store the recognition data as an xml file
- storeTrainingData();
- }
- //////////////////////////////////
- // recognize()
- //
- void recognize()
- {
- int i, nTestFaces = 0; // the number of test images
- CvMat * trainPersonNumMat = 0; // the person numbers during training
- float * projectedTestFace = 0;
- // load test images and ground truth for person number
- nTestFaces = loadFaceImgArray("test.txt");
- printf("%d test faces loaded\n", nTestFaces);
- // load the saved training data
- if( !loadTrainingData( &trainPersonNumMat ) ) return;
- // project the test images onto the PCA subspace
- projectedTestFace = (float *)cvAlloc( nEigens*sizeof(float) );
- for(i=0; i<nTestFaces; i++)
- {
- int iNearest, nearest, truth;
- // project the test image onto the PCA subspace
- cvEigenDecomposite(
- faceImgArr[i],
- nEigens,
- eigenVectArr,
- 0, 0,
- pAvgTrainImg,
- projectedTestFace);
- iNearest = findNearestNeighbor(projectedTestFace);
- truth = personNumTruthMat->data.i[i];
- nearest = trainPersonNumMat->data.i[iNearest];
- printf("nearest = %d, Truth = %d\n", nearest, truth);
- }
- }
- //////////////////////////////////
- // loadTrainingData()
- //
- int loadTrainingData(CvMat ** pTrainPersonNumMat)
- {
- CvFileStorage * fileStorage;
- int i;
- // create a file-storage interface
- fileStorage = cvOpenFileStorage( "facedata.xml", 0, CV_STORAGE_READ );
- if( !fileStorage )
- {
- fprintf(stderr, "Can't open facedata.xml\n");
- return 0;
- }
- nEigens = cvReadIntByName(fileStorage, 0, "nEigens", 0);
- nTrainFaces = cvReadIntByName(fileStorage, 0, "nTrainFaces", 0);
- *pTrainPersonNumMat = (CvMat *)cvReadByName(fileStorage, 0, "trainPersonNumMat", 0);
- eigenValMat = (CvMat *)cvReadByName(fileStorage, 0, "eigenValMat", 0);
- projectedTrainFaceMat = (CvMat *)cvReadByName(fileStorage, 0, "projectedTrainFaceMat", 0);
- pAvgTrainImg = (IplImage *)cvReadByName(fileStorage, 0, "avgTrainImg", 0);
- eigenVectArr = (IplImage **)cvAlloc(nTrainFaces*sizeof(IplImage *));
- for(i=0; i<nEigens; i++)
- {
- char varname[200];
- sprintf( varname, "eigenVect_%d", i );
- eigenVectArr[i] = (IplImage *)cvReadByName(fileStorage, 0, varname, 0);
- }
- // release the file-storage interface
- cvReleaseFileStorage( &fileStorage );
- return 1;
- }
- //////////////////////////////////
- // storeTrainingData()
- //
- void storeTrainingData()
- {
- CvFileStorage * fileStorage;
- int i;
- // create a file-storage interface
- fileStorage = cvOpenFileStorage( "facedata.xml", 0, CV_STORAGE_WRITE );
- // store all the data
- cvWriteInt( fileStorage, "nEigens", nEigens );
- cvWriteInt( fileStorage, "nTrainFaces", nTrainFaces );
- cvWrite(fileStorage, "trainPersonNumMat", personNumTruthMat, cvAttrList(0,0));
- cvWrite(fileStorage, "eigenValMat", eigenValMat, cvAttrList(0,0));
- cvWrite(fileStorage, "projectedTrainFaceMat", projectedTrainFaceMat, cvAttrList(0,0));
- cvWrite(fileStorage, "avgTrainImg", pAvgTrainImg, cvAttrList(0,0));
- for(i=0; i<nEigens; i++)
- {
- char varname[200];
- sprintf( varname, "eigenVect_%d", i );
- cvWrite(fileStorage, varname, eigenVectArr[i], cvAttrList(0,0));
- }
- // release the file-storage interface
- cvReleaseFileStorage( &fileStorage );
- }
- //////////////////////////////////
- // findNearestNeighbor()
- //
- int findNearestNeighbor(float * projectedTestFace)
- {
- //double leastDistSq = 1e12;
- double leastDistSq = DBL_MAX;
- int i, iTrain, iNearest = 0;
- for(iTrain=0; iTrain<nTrainFaces; iTrain++)
- {
- double distSq=0;
- for(i=0; i<nEigens; i++)
- {
- float d_i =
- projectedTestFace[i] -
- projectedTrainFaceMat->data.fl[iTrain*nEigens + i];
- //distSq += d_i*d_i / eigenValMat->data.fl[i]; // Mahalanobis
- distSq += d_i*d_i; // Euclidean
- }
- if(distSq < leastDistSq)
- {
- leastDistSq = distSq;
- iNearest = iTrain;
- }
- }
- return iNearest;
- }
- //////////////////////////////////
- // doPCA()
- //
- void doPCA()
- {
- int i;
- CvTermCriteria calcLimit;
- CvSize faceImgSize;
- // set the number of eigenvalues to use
- nEigens = nTrainFaces-1;
- // allocate the eigenvector images
- faceImgSize.width = faceImgArr[0]->width;
- faceImgSize.height = faceImgArr[0]->height;
- eigenVectArr = (IplImage**)cvAlloc(sizeof(IplImage*) * nEigens);
- for(i=0; i<nEigens; i++)
- eigenVectArr[i] = cvCreateImage(faceImgSize, IPL_DEPTH_32F, 1);
- // allocate the eigenvalue array
- eigenValMat = cvCreateMat( 1, nEigens, CV_32FC1 );
- // allocate the averaged image
- pAvgTrainImg = cvCreateImage(faceImgSize, IPL_DEPTH_32F, 1);
- // set the PCA termination criterion
- calcLimit = cvTermCriteria( CV_TERMCRIT_ITER, nEigens, 1);
- // compute average image, eigenvalues, and eigenvectors
- 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);
- }
- //////////////////////////////////
- // loadFaceImgArray()
- //
- int loadFaceImgArray(char * filename)
- {
- FILE * imgListFile = 0;
- char imgFilename[512];
- int iFace, nFaces=0;
- // open the input file
- if( !(imgListFile = fopen(filename, "r")) )
- {
- fprintf(stderr, "Can\'t open file %s\n", filename);
- return 0;
- }
- // count the number of faces
- while( fgets(imgFilename, 512, imgListFile) ) ++nFaces;
- rewind(imgListFile);
- // allocate the face-image array and person number matrix
- faceImgArr = (IplImage **)cvAlloc( nFaces*sizeof(IplImage *) );
- personNumTruthMat = cvCreateMat( 1, nFaces, CV_32SC1 );
- // store the face images in an array
- for(iFace=0; iFace<nFaces; iFace++)
- {
- // read person number and name of image file
- fscanf(imgListFile,
- "%d %s", personNumTruthMat->data.i+iFace, imgFilename);
- // load the face image
- faceImgArr[iFace] = cvLoadImage(imgFilename, CV_LOAD_IMAGE_GRAYSCALE);
- if( !faceImgArr[iFace] )
- {
- fprintf(stderr, "Can\'t load image from %s\n", imgFilename);
- return 0;
- }
- }
- fclose(imgListFile);
- return nFaces;
- }
- //////////////////////////////////
- // printUsage()
- //
- void printUsage()
- {
- printf("Usage: eigenface
\n", - " Valid commands are\n"
- " train\n"
- " test\n");
- }
Luật An ninh mạng; Công cụ, phương pháp, kỹ thuật An ninh mạng; Đấu tranh chống luận điệu xuyên tạc đường lối chính sách của Đảng, Nhà nước; bảo vệ lý luận, chính trị, tư tưởng đạo đức Hồ Chí Minh trên không gian mạng; Tuyên truyền gương người tốt việc tốt,...
Thứ Sáu, 6 tháng 6, 2014
Coding nhận dạng mặt người
Sưu tầm, lưu trữ, sau này nghiên cứu tiếp.
Đăng ký:
Đăng Nhận xét (Atom)
Không có nhận xét nào:
Đăng nhận xét