#include <stdio.h>
#include <string.h>
#include "cv.h"
#include "cvaux.h"
#include "highgui.h" using namespace cv; //globle variables
int nTrainFaces = ; // number of trainning images
int nEigens = ; // number of eigenvalues
IplImage** faceImgArr = ; // array of face images
CvMat* personNumTruthMat = ; // array of person numbers
IplImage* pAvgTrainImg = ; // the average image
IplImage** eigenVectArr = ; // eigenvectors
CvMat* eigenValMat = ; // eigenvalues
CvMat* projectedTrainFaceMat = ; // 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(); int main( int argc, char** argv )
{
if((argc != ) && (argc != )){
printUsage();
return -;
} if( !strcmp(argv[], "train" )){
learn();
} else if( !strcmp(argv[], "test") ){
recognize();
} else {
printf("Unknown command: %s\n", argv[]);
}
return ;
} void printUsage(){
printf("Usage: eigenface <command>\n",
" Valid commands are\n"
" train\n"
" test\n"
);
} void learn(){
int i; // load training data
nTrainFaces = loadFaceImgArray("train.txt");
if( nTrainFaces < ){
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);
for(i = ; i < nTrainFaces; i ++){
cvEigenDecomposite(
faceImgArr[i],
nEigens,
eigenVectArr,
, ,
pAvgTrainImg,
projectedTrainFaceMat->data.fl + i*nEigens
);
} // store the recognition data as an xml file
storeTrainingData();
} int loadFaceImgArray(char* filename){
FILE* imgListFile = ;
char imgFilename[];
int iFace, nFaces = ; // open the input file
imgListFile = fopen(filename, "r"); // count the number of faces
while( fgets(imgFilename, , imgListFile) ) ++ nFaces;
rewind(imgListFile); // allocate the face-image array and person number matrix
faceImgArr = (IplImage **)cvAlloc( nFaces*sizeof(IplImage *) );
personNumTruthMat = cvCreateMat( , nFaces, CV_32SC1 ); // store the face images in an array
for(iFace=; 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);
} fclose(imgListFile); return nFaces;
} void doPCA(){
int i;
CvTermCriteria calcLimit;
CvSize faceImgSize; // set the number of eigenvalues to use
nEigens = nTrainFaces - ; // allocate the eigenvector images
faceImgSize.width = faceImgArr[]->width;
faceImgSize.height = faceImgArr[]->height;
eigenVectArr = (IplImage**)cvAlloc(sizeof(IplImage*) * nEigens);
for(i=; i<nEigens; i++){
eigenVectArr[i] = cvCreateImage(faceImgSize, IPL_DEPTH_32F, );
} // allocate the eigenvalue array
eigenValMat = cvCreateMat( , nEigens, CV_32FC1 ); // allocate the averaged image
pAvgTrainImg = cvCreateImage(faceImgSize, IPL_DEPTH_32F, ); // set the PCA termination criterion
calcLimit = cvTermCriteria( CV_TERMCRIT_ITER, nEigens, ); // compute average image, eigenvalues, and eigenvectors
cvCalcEigenObjects(
nTrainFaces,
(void*)faceImgArr,
(void*)eigenVectArr,
CV_EIGOBJ_NO_CALLBACK,
,
,
&calcLimit,
pAvgTrainImg,
eigenValMat->data.fl
);
} void storeTrainingData(){
CvFileStorage* fileStorage;
int i; // create a file-storage interface
fileStorage = cvOpenFileStorage( "facedata.xml", , CV_STORAGE_WRITE); // store all the data
cvWriteInt( fileStorage, "nEigens", nEigens);
cvWriteInt( fileStorage, "nTrainFaces", nTrainFaces );
cvWrite(fileStorage, "trainPersonNumMat", personNumTruthMat, cvAttrList(, ));
cvWrite(fileStorage, "eigenValMat", eigenValMat, cvAttrList(,));
cvWrite(fileStorage, "projectedTrainFaceMat", projectedTrainFaceMat, cvAttrList(,));
cvWrite(fileStorage, "avgTrainImg", pAvgTrainImg, cvAttrList(,)); for(i=; i<nEigens; i++){
char varname[];
sprintf( varname, "eigenVect_%d", i);
cvWrite(fileStorage, varname, eigenVectArr[i], cvAttrList(,));
} //release the file-storage interface
cvReleaseFileStorage( &fileStorage );
} void recognize(){
int i, nTestFaces = ; // the number of test images
CvMat* trainPersonNumMat = ; // the person numbers during training
float* projectedTestFace = ; // 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=; i<nTestFaces; i++){
int iNearest, nearest, truth; // project the test image onto PCA subspace
cvEigenDecomposite(
faceImgArr[i],
nEigens,
eigenVectArr,
, ,
pAvgTrainImg,
projectedTestFace
); iNearest = findNearestNeighbor(projectedTestFace);
truth = personNumTruthMat->data.i[i];
nearest = trainPersonNumMat->data.i[iNearest]; printf("nearest = %d, Truth = %d\n", nearest, truth);
}
} int loadTrainingData(CvMat** pTrainPersonNumMat){
CvFileStorage* fileStorage;
int i; // create a file-storage interface
fileStorage = cvOpenFileStorage( "facedata.xml", , CV_STORAGE_READ );
if( !fileStorage ){
fprintf(stderr, "Can't open facedata.xml\n");
return ;
} nEigens = cvReadIntByName(fileStorage, , "nEigens", );
nTrainFaces = cvReadIntByName(fileStorage, , "nTrainFaces", );
*pTrainPersonNumMat = (CvMat*)cvReadByName(fileStorage, , "trainPersonNumMat", );
eigenValMat = (CvMat*)cvReadByName(fileStorage, , "eigenValMat", );
projectedTrainFaceMat = (CvMat*)cvReadByName(fileStorage, , "projectedTrainFaceMat", );
pAvgTrainImg = (IplImage*)cvReadByName(fileStorage, , "avgTrainImg", );
eigenVectArr = (IplImage**)cvAlloc(nTrainFaces*sizeof(IplImage*));
for(i=; i<nEigens; i++){
char varname[];
sprintf( varname, "eigenVect_%d", i );
eigenVectArr[i] = (IplImage*)cvReadByName(fileStorage, , varname, );
} // release the file-storage interface
cvReleaseFileStorage( &fileStorage ); return ;
} int findNearestNeighbor(float* projectedTestFace){
double leastDistSq = DBL_MAX;
int i, iTrain, iNearest = ; for(iTrain=; iTrain<nTrainFaces; iTrain++){
double distSq = ; for(i=; i<nEigens; i++){
float d_i = projectedTestFace[i] -
projectedTrainFaceMat->data.fl[iTrain*nEigens + i];
distSq += d_i*d_i;
} if(distSq < leastDistSq){
leastDistSq = distSq;
iNearest = iTrain;
}
} return iNearest;
}

人脸识别源代码Open cv的更多相关文章

  1. OpenCV图像处理以及人脸识别

    OpenCV基础 OpenCV是一个开源的计算机视觉库.提供了很多图像处理常用的工具 批注:本文所有图片数据都在我的GitHub仓库 读取图片并显示 import numpy as np import ...

  2. 可学习的多人人脸识别程序(基于Emgu CV)

    源代码下载(需要安装Emgu CV,安装方法请百度) 很多朋友使用Emgu CV遇到CvInvoke()的报错,我找到一种解决方法. 把EmguCV目录下bin里面的所有dll复制到C:\WINDOW ...

  3. 基于Emgu CV+百度人脸识别,实现视频动态 人脸抓取与识别

    背景 目前AI 处于风口浪尖,作为 公司的CTO,也作为自己的技术专研,开始了AI之旅,在朋友圈中也咨询 一些大牛对于AI 机器学习框架的看法,目前自己的研究方向主要开源的 AI 库,如:Emgu C ...

  4. C# net Emgu.CV.World 人脸识别 根据照片将人脸抠图出来。

    Emgu.CV.World 人脸识别 根据照片将人脸抠图出来.效果如下: 应用范围:配合摄像头,抓取的图像,抠出人脸照片,这样人脸照片的大小会很小,传输速度快.这样识别速度也就快. 目前我正在做百度人 ...

  5. Visual C++ 经典的人脸识别算法源代码

    说明:VC++ 经典的人脸识别算法实例,提供人脸五官定位具体算法及两种实现流程. 点击下载

  6. 吴裕雄--天生自然python学习笔记:python 用 Open CV通过人脸识别进行登录

    人脸识别登录功能的基本原理是通过对比两张图片的差异度来判断两张图片是 否是同 一人的面部 . 对比图片 差异度 的算法有很多种,本例中使用“颜色直方图” 算法来实现对人脸图像的识别. 下面为比较 im ...

  7. 吴裕雄--天生自然python学习笔记:python 用 Open CV 进行人脸识别

    要对特定图像进行识别,最关键的是要有识别对象的特征文件, OpenCV 己内置 了人脸识别特征文件,我们只需使用 OpenCV 的 CascadeClassifier 类即可进行识别 . 创建 Cas ...

  8. OpenCV人脸识别LBPH算法源码分析

    1 背景及理论基础 人脸识别是指将一个需要识别的人脸和人脸库中的某个人脸对应起来(类似于指纹识别),目的是完成识别功能,该术语需要和人脸检测进行区分,人脸检测是在一张图片中把人脸定位出来,完成的是搜寻 ...

  9. 关于opencv中人脸识别主函数的部分注释详解。

    近段时间在搞opencv的视频人脸识别,无奈自带的分类器的准确度,实在是不怎么样,但又能怎样呢?自己又研究不清楚各大类检测算法. 正所谓,功能是由函数完成的,于是自己便看cvHaarDetectObj ...

随机推荐

  1. lightoj 1099【dijkstra/BFS】

    题意: 求 1-N 的第二长路,一条路可以重复走 if two or more shortest paths exist, the second-shortest path is the one wh ...

  2. 【源码系列】Eureka源码分析

    对于服务注册中心.服务提供者.服务消费者这个三个主要元素来说,服务提供者和服务消费者(即Eureka客户端)在整个运行机制中是大部分通信行为的主动发起者(服务注册.续约.下线等),而注册中心主要是处理 ...

  3. iOS 利用模态视图实现带黑色蒙版的底部弹窗

    本demo仅适用于iOS8及以上系统. 本文将使用autolayout+storyboard来实现弹窗 第一步.storyboard创建界面 1.打开storyboard 拖一个UIViewcontr ...

  4. ebullient(2018.10.25)

    结论巨好想,每一次操作可以看作把一个b往前移一位,另一个b往后移一位,逆序对个数不改变,判断即可做第一问. 此处代码仅给出第一问做法: #include<cstdio> #include& ...

  5. Java并发编程笔记

    进程:程序的一次运行活动. 线程:程序的一个控制流程.用于执行一个任务.是cpu进行调度的最小单位. 死锁:所有的线程继续执行所需要的资源都被其他线程占用,导致所有线程都不能继续执行. 死锁的情景:1 ...

  6. [題解]luogu_P1120小木棍(搜索)

    好久以前抄的題解,現在重新抄題解做一下 1.對所有木棍從大到小排序,後用小的比較靈活 2.限制加入的木棍單調遞減,因為先/后用長/短木棍等價,反正就是那兩根 3.預處理出重複木棍的位置,防止重複搜索相 ...

  7. django 之 rest framework

    一 二 三 四 五 六 七 八

  8. 洛谷 P2231 [HNOI2002]跳蚤

    https://www.luogu.org/problemnew/show/P2231 题意相当于:有n个位置a[1..n],每个位置可以填[1,m]中任一个整数,问共有多少种填法满足gcd(a[1] ...

  9. YII报错笔记:<pre>PHP Notice &#039;yii\base\ErrorException&#039; with message &#039;Uninitialized string offset: 0&#039; in /my/test/project/iot/vendor/yiisoft/yii2/base/Model.php:778

    YII常见报错笔记 报错返回的代码如下: <pre>PHP Notice 'yii\base\ErrorException' with message 'Uninitialized str ...

  10. TI德州芯片TLV系列和TPS系列芯片区别(转)

    TLV和TPS一般会有pin to pin的对应型号: 一般来讲,TPS精度.准确度和性能会好一些,所以价钱要贵一些: 对应TLV就是一样可以实现上述功能,但是精度和性能等级是稍微低一点的: 具体选择 ...