搜档网
当前位置:搜档网 › 人脸识别C 程序代码 - 副本概要

人脸识别C 程序代码 - 副本概要

人脸识别C  程序代码 - 副本概要
人脸识别C  程序代码 - 副本概要

// AppDesignDlg.cpp : implementation file

//

#include "stdafx.h"

#include "AppDesign.h"

#include "AppDesignDlg.h"

#include

#include

#include "Select.h"

#include "CvvImage.h"

#define MAX_POINT 200

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

using namespace std;

CvCapture * m_Video; // opencv库的指针,从视频获取图像

int nFrmNum=0; //定义第nFrmNum帧,初始化为0,自动增值,nFrmNum是帧控件的关联变量,帧控件的ID为IDC_FRAMNUM

////定义几个重要的全局变量

int nTrainFaces =0; // 训练图像的数目,即人脸库中有n张人脸

int nEigens =0; // 自己取的主要特征值数目(在提取特征脸的时候用到的参数)

IplImage** faceImgArr =0; // 指向训练人脸和测试人脸的指针(在学习和识别阶段指向不同)

CvMat* personNumTruthMat=0; // 人脸图像的ID号

IplImage* pAvgTrainImg =0; // 训练人脸数据的平均值

IplImage** eigenVectArr =0; // 投影矩阵,也即主特征向量

CvMat* eigenValMat =0; // 特征值

CvMat* projectedTrainFaceMat=0; // 训练图像的投影

CvMat* trainPersonNumMat=0;

/*以下是自定义函数的声明,具体定义会在下方,cv开头的是OPENCV自带的库函数*/ void learn();

int loadFaceImgArr(char *filename);

void recognize2(IplImage *img);

void doPCA();

void storeTrainingData();

int loadTrainingData(CvMat** pTrainPersonNumMat);

int findNearestNeighbor(float* projectedtestFace);

//用字符串时一定要把using namespace std;写在前面,否则不能用,下面是用于显示的字符串CvHaarClassifierCascade* cascade=NULL;

//OPENcv的分类器文件进行人脸检测,此函数是一个匹配函数,根据不同的分类器(tree、stump)进行不同的匹配,返回整形值,具体参考

https://www.sodocs.net/doc/6b2300461.html,/doc/6988305.html或

https://www.sodocs.net/doc/6b2300461.html,/p-192656933.html,是人脸检测中用到的一个很重要的函数

/*以下是MFC框架代码,在我们用鼠标进行搭建框架的时候自动生成*/

class CAboutDlg : public Cdialog

{

public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support

//}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CAppDesignDlg dialog

CAppDesignDlg::CAppDesignDlg(CWnd* pParent /*=NULL*/) : CDialog(CAppDesignDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CAppDesignDlg)

// NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

pCapture = NULL;

m_totalfrm = 0;

m_curfrm = 0;

m_stop = false;

loadxml=false;

m_src = NULL;

m_times =0;

}

void CAppDesignDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAppDesignDlg)

//DDX_Control(pDX, IDC_PROGRESS1, m_progress);

//}}AFX_DATA_MAP

DDX_Control(pDX, IDC_PROGRESS1, m_progress);

}

BEGIN_MESSAGE_MAP(CAppDesignDlg, CDialog)

//{{AFX_MSG_MAP(CAppDesignDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BUTTON1, OnOpenFile)

ON_WM_TIMER()

ON_BN_CLICKED(IDC_BUTTON5, OnStop)

ON_WM_CTLCOLOR()

//}}AFX_MSG_MAP

ON_BN_CLICKED(IDC_BUTTON2, &CAppDesignDlg::OnBnClickedButton2)

ON_BN_CLICKED(IDC_BUTTON3, &CAppDesignDlg::OnBnClickedButton3)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CAppDesignDlg message handlers

BOOL CAppDesignDlg::OnInitDialog()

{

CDialog::OnInitDialog();

// Add "About..." menu item to system menu.

// IDM_ABOUTBOX must be in the system command range.

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

CString strAboutMenu;

strAboutMenu.LoadString(IDS_ABOUTBOX);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// Set the icon for this dialog. The framework does this automatically

// when the application's main window is not a dialog

SetIcon(m_hIcon, TRUE); // Set big icon

SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

return TRUE; // return TRUE unless you set the focus to a control

}

void CAppDesignDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// If you add a minimize button to your dialog, you will need the code below

// to draw the icon. For MFC applications using the document/view model,

// this is automatically done for you by the framework.

void CAppDesignDlg::OnPaint() // OnPaint是WM_PAINT消息的消息处理函数, 是CWnd的

类成员,负责响应WM_PAINT消息

{

if (IsIconic())

{

CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialog::OnPaint();

}

}

// The system calls this to obtain the cursor to display while the user drags

// the minimized window.

HCURSOR CAppDesignDlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

/*这个程序的思路是,每33毫秒,就调用opencv获取摄像头的图像资料,并更新到界面上,让用户看起来是录像,实时的感觉,其实就是每33毫秒更新一次图片,然后载入头像资料进行识别*/

/*“打开摄像头”控件的相关代码OnOpenFile()*/

void CAppDesignDlg::OnOpenFile()// OnOpenFile()是“打开摄像头”这个控件的控制事

件,也就是其函数,m_Video是控件的变量

{

/* 调用opencv打开视频*/

m_Video = cvCaptureFromCAM(-1); // cvCaptureFromCAM(-1)是opencv的库函数,用来从视频中获取图像,直接调用,这里也是界面与摄像头的接口

if (!m_Video)

{

AfxMessageBox("无法打开摄像头"); // AfxMessageBox这个函数是MFC中弹出消息框的

函数,直接调用

return;

}

//cascade是级联

if(!cascade)

{

string cascade_name = "haarcascade_frontalface_alt.xml";

cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name.c_str(), 0, 0, 0);

}

/*启动计时器*/

SetTimer(1,33,NULL);

}

/*****************上面的内容基本都是MFC的框架代码,下面函数开始是自定义的函数了****************************/

//在控件中显示图片,第一个参数是要显示的图片,第二个参数是控件的ID

void CAppDesignDlg::show_pic(IplImage *t,int nID) // int nID在这

里是形参,而

不是具体的

ID

{

CDC *pDC = GetDlgItem(nID)->GetDC();

HDC hDC= pDC->GetSafeHdc();

CRect rect;

GetDlgItem(nID)->GetClientRect(&rect);

CvvImage img;

img.CopyOf(t,3);

img.DrawToHDC(hDC,&rect);

ReleaseDC(pDC);

/*获得图像兴趣区域,并且保存为tmp.jpg,pImg是待处理图像,CvRect roi是确定一个矩形区域roi */

void GetSubImage(IplImage *pImg, CvRect roi)

{

//基于给定的矩形设置图像的ROI,即获取感兴趣的图像

cvSetImageROI(pImg,roi);

//保存图像到指定文件tmp.jpg

cvSaveImage("tmp.jpg",pImg);

//释放图像pImg中被设定的感兴趣区域ROI,与cvSetImageROI相对应。

cvResetImageROI(pImg);

}

//这个函数主要是识别开始检测到的人脸,是人脸识别的入口函数

void RecgnizeRoi(IplImage *img,char *a)

{

int i, nTestFaces=0; // 测试的人脸数

float* projectedTestFace=0; //训练的人脸数???

projectedTestFace=(float*)cvAlloc(nEigens*sizeof(float)); //cvAlloc是opencv中用于内存管理的函数

//for (i=0;i

//{

int iNearest, nearest, truth; // 定义iNearest为最相似的图片

/// cvEigenDecomposite()函数作用是将人脸图像通过Eigenface变换矩阵,投射到子空间中,只有将待识别图像投影到PCA空间,然后才能识别。函数的具体作用以及函数中的7个参数参见https://www.sodocs.net/doc/6b2300461.html,/linzhao/archive/2012/01/05/2312758.html。

cvEigenDecomposite(img,nEigens,eigenVectArr, 0, 0, pAvgTrainImg, projectedTestFace);

//得到最相似的图片

iNearest=findNearestNeighbor(projectedTestFace);

nearest=trainPersonNumMat->data.i[iNearest];

//}

// char *itoa(int value, char *string, int radix);作用是把一整数转换为字符串。value:

待转化的整数;radix: 是基数的意思,即先将value转化为radix进制的数,范围介于2-36,比如10表示10进制,16表示16进制;* string: 保存转换后得到的字符串,和函数返回值相同,也就是说,最后的图片存储称a

itoa(nearest,a,10);

}

//检测和识别的入口,头像识别核心代码

void CAppDesignDlg::Detect_Draw(IplImage *pImg)

{

bool bFirstFace = TRUE;

string strFirstFace = "";

//一个颜色数组,这个数组定义了一些颜色值用这些颜色依次圈出不同的人脸,在最后画圆来圈出人脸的那句代码中cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );中的color的数值。

static CvScalar colors[] =

{

{{0,0,255}}, //蓝色

{{0,128,255}},

{{0,255,255}},

{{0,255,0}},

{{255,128,0}},

{{255,255,0}},

{{255,0,0}},

{{255,0,255}}

};

//先把识别到的学号初始化为空

namelist=""; 源代码不知道有没有

//调用opencv创建存储空间(为NAMELIST)

CvMemStorage* storage = cvCreateMemStorage(0);

double scale = 1.8;

//函数IplImage* cvCreateImage( CvSize size, int depth, int channels ); 创建头并分配数据,参数意义:size 图像宽、高;depth 图像元素的位深度;channels每个元素(像素)通道数.可以是1, 2, 3 或 4.通道是交叉存取的

IplImage* gray = cvCreateImage( cvSize(pImg->width,pImg->height), 8, 1 );

//仍然是这个函数,对目标图进行设置和分配空间(gray是原图)

IplImage* small_img = cvCreateImage( cvSize( cvRound (pImg->width/scale),

//int cvRound (double value)对一个double型的数进行四舍五入,并返回一个整型数!

cvRound (pImg->height/scale)),

8, 1 );

int i;

//灰度化,cvCvtColor是Opencv里的颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间的转换,也可以转换为灰度图像。具体参见https://www.sodocs.net/doc/6b2300461.html,/doc/6950611.html。

cvResize( gray, small_img, CV_INTER_LINEAR );

//直方图均衡,函数原型为void cvEqualizeHist( const CvArr* src, CvArr* dst ); 用来使灰度图象直方图均衡化。具体见https://www.sodocs.net/doc/6b2300461.html,/doc/1548261.html。cvEqualizeHist( small_img, small_img );

//删除存储空间,与上面创建空间对应。

cvClearMemStorage( storage );

//如果识别成功,就标识出来。

if( cascade ) 又是级联

{

//人脸检测函数,cvHaarDetectObjects函数用来检测图像中的目标,具体见https://www.sodocs.net/doc/6b2300461.html,/doc/6835188.html。

/*级联分类器训练中采用的检测目标的尺寸*/);//检测人脸返回矩形人脸/*使用针对某目标物体训练的级联分类器在图像中找到包含目标物体的矩形区域,并且将这些区域作为一序列的矩形框返回。

CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,

1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,

cvSize(40, 40) );

for( i = 0; i < (faces ? faces->total : 0); i++ )

{

CvRect* r,通过方形左上角坐标和方形的高和宽来确定一个矩形区域,nt x; /* 方形的左上角的x-坐标*/ ;int y; /* 方形的左上角的y-坐标*/ ;int width; /* 宽*/ ;int height; /* 高*/

CvRect* r = (CvRect*)cvGetSeqElem( faces, i ); //访问人脸库中的第i个元素

CvPoint pt1, pt2; //OpenCV的基本数据类型之一,表示坐标为整数的二维点

r->x = r->x * scale;

r->y = r->y * scale;

r->width = r->width * scale;

r->height = r->height * scale;

pt1.x = r->x;

pt1.y = r->y;

pt2.x = r->x + r->width;

pt2.y = r->y + r->height;

//矩形将人脸框起来。cvRectangle是OpenCV里面的绘图函数,四个参数分

别代表(图像,矩形的两个点,线条颜色,线条粗细,线条类型,小数点位数)

cvRectangle( pImg, pt1, pt2, colors[i%8], 3, 8, 0);

GetSubImage(gray, *r);//获取图片

//读入图像,参数分别为(被读入图像的文件名(包括后缀),指定读入图像的颜色和深度,CV_LOAD_IMAGE_GRAYSCALE是单通道),具体见https://www.sodocs.net/doc/6b2300461.html,/doc/6949440.html。

IplImage *gray1=cvLoadImage("tmp.jpg",CV_LOAD_IMAGE_GRAYSCALE); //创建头并分配数据(图像宽,高,depth 图像元素的位深度,每个元素(像素)通道数)

IplImage *dst=cvCreateImage(cvSize(96,96),8,1);

//函数cvResize 重新调整图像src(或它的ROI),使它精确匹配目标dst(或其ROI)cvResize(gray1,dst,CV_INTER_NN); // ·CV_INTER_NN - 最近-邻居插补的修改方法

char a[20]="";

//识别检测到的人脸,调用了之前定义的函数

RecgnizeRoi(dst,a);

// 应该是有关输出的对齐方式的

CvFont font1;

CvPoint wp;

wp.x = pt1.x ;

wp.y = pt1.y-10 ;

cvInitFont(&font1, CV_FONT_ITALIC, 0.75F, 0.75F, 0, 3, 8);

//将识别结果显示出来

//函数cvPutText 将具有指定字体的和指定颜色的文本加载到图像中。加载到图像中的文本被感兴趣的矩形框圈定。(输入图像,显示字符串,第一个字符左下角的坐标,字体结构初始化,文本的字体颜色)

cvPutText(pImg, a, wp, &font1, colors[2]);

}

//在控件上显示出识别了几个人

CString str;

//Format是CString类的一个成员函数,它通过格式操作使任意类型的数据转换成一个字符串。https://www.sodocs.net/doc/6b2300461.html,/doc/6843942.html。

str.Format("%d",faces->total);

//返回窗口中指定参数ID的子元素的句柄,可以通过返回的句柄对窗口内的子元素进行操作。

GetDlgItem(IDC_PEOPLENUM)->SetWindowText(str);

}

//系统释放存储空间

cvReleaseImage( &gray );

cvReleaseImage( &small_img );

}

每33毫秒调用一下这个模块

//定时器函数,nIDEvent是定时器标识符

void CAppDesignDlg::OnTimer(UINT nIDEvent)

{

IplImage* image;

IplImage* motion = 0;

/*调用opencv 提取视频图像数据*/

//读取摄像头一帧,cvQueryFrame(m_Video)从摄像头或者文件中抓取并返回一帧image=cvQueryFrame(m_Video);

/*帧数计算器*/

//下面四行代码是将帧数显示在控件上

/*帧数计算器*/

nFrmNum++;

CString str; //str就是那个变化的帧值,同str几个人是一样一样的

/*把帧数在界面显示出来*/

str.Format("%d",nFrmNum); //显示函数

//返回窗口中指定参数ID的子元素的句柄,可以通过返回的句柄对窗口内的子元素进行操作。上面共识别几个人的那个控件也用到了这条语句,功能是一样的。

GetDlgItem(IDC_FRAMNUM)->SetWindowText(str);

// cvGetTickCount()是测量运行时间的函数,在程序段的开始和结束时两次使用cvGetTickCount(),然后将两次的差除以cvGetTickFrequency()后就可以获得程序段的以微秒us为单位的运行时间,而*1000表示精确到ms

double tt =(double)cvGetTickCount();

//如果加载了训练结果,则可以开始检测识别了,调用函数Detect_Draw, Detect_Draw这个函数是头像识别函数

if(loadxml)

Detect_Draw(image);

//得到没帧的时间消耗

tt=(double)cvGetTickCount()-tt;

str.Format("%lf",tt/(cvGetTickFrequency()*1000.));

//把处理耗时显示在界面上

GetDlgItem(IDC_TIME)->SetWindowText(str);

// 把识别到的人的学号显示在界面的列表中

GetDlgItem(IDC_NAMELIST)->SetWindowText(namelist);

//控件上显示图片

/*把摄像头的图像显示到图片空间上*/

show_pic(image,IDC_SHOWIMG);

CDialog::OnTimer(nIDEvent);/ /OnTimer(UINT nIDEvent)是定时器的函数,为什么要在这里写这句?

}

//这个暂停按钮的代码

void CAppDesignDlg::OnStop()

{

// TODO: Add your control notification handler code here

m_stop=!m_stop;

if (m_stop)

{

KillTimer(1); //销毁定时器

} else {

SetTimer(1,33,NULL); //创建定时器,这里是一个33毫秒触发1次的定时器

}

}

//继续

void CAppDesignDlg::OnOK()

{

// TODO: Add extra validation here

cvReleaseCapture( &pCapture );

CDialog::OnOK();

}

//控制控件的显示颜色,OnCtlColor有关参见https://www.sodocs.net/doc/6b2300461.html,/doc/4057655.html。pDC是一个CDC指针,是用来绘图和显示的

pWnd是一个cWnd指针,指向控件(不确定)

nCtlColor则是用来区别不同的调用的

HBRUSH CAppDesignDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

if (pWnd->GetDlgCtrlID() == IDC_FRAMNUM)

{

pDC->SetTextColor(RGB(255,0, 0)); //帧控件的字体颜色

}

if (pWnd->GetDlgCtrlID() == IDC_TIME)

{

pDC->SetTextColor(RGB(255, 0, 0)); //时间控件的字体颜色

}

// TODO: Return a different brush if the default is not desired

return hbr;

}

//训练样本的函数

void CAppDesignDlg::Train()

{

int i;

//文件解析,得到文件列表或者称,加载训练图像集

nTrainFaces为训练图像的数目;导入faceImgArr(指向训练人脸的指针),解析得到train.txt nTrainFaces=loadFaceImgArr("train.txt");

if(nTrainFaces<2)

{

fprintf(stderr,"Need 2 or more training faces\n","Input file contains only %d\n", nTrainFaces);

return;

}

//设置进度条,m_progress是进度条的关联参数,1和nTrainFaces分别是起始和结束的位置

m_progress.SetRange(1, nTrainFaces);

//PCA 提取特征,进行主成分分析

/*int nTrainFaces =0; // 训练图像的数目,即人脸库中有n张人脸

int nEigens =0; // 自己取的主要特征值数目(在提取特征脸的时候用到的参数)

IplImage** faceImgArr =0; // 指向训练人脸和测试人脸的指针(在学习和识别阶段指向不同)

CvMat* personNumTruthMat=0; // 人脸图像的ID号

IplImage* pAvgTrainImg =0; // 训练人脸数据的平均值

IplImage** eigenVectArr =0; // 投影矩阵,也即主特征向量

CvMat* eigenValMat =0; // 特征值

CvMat* projectedTrainFaceMat=0; // 训练图像的投影

CvMat* trainPersonNumMat=0;*/

doPCA();

// projectedTrainFaceMat是训练图像的投影;cvCreateMat是创建矩阵函数,参数分别为(矩阵行数,矩阵列数,元素类型),下面的分别是(训练图像数目,特征值数目,32位数据)projectedTrainFaceMat=cvCreateMat(nTrainFaces,nEigens,CV_32FC1);

for (i=0;i

{

//将PCA特征保存到投影矩阵

cvEigenDecomposite()函数作用是将人脸图像通过Eigenface变换矩阵,投射到子空间中。子空间中的人脸向量,是一个1×nEigens(nEigens由自己取得)的行向量,极大地降低了数据维度,便于下一步的聚类、识别。具体见https://www.sodocs.net/doc/6b2300461.html,/linzhao/archive/2012/01/05/2312758.html。

cvEigenDecomposite(faceImgArr[i],nEigens,eigenVectArr,0,0,

pAvgTrainImg,projectedTrainFaceMat->data.fl+i*nEigens);

m_progress.SetPos(i+1); //进度条的位置加1

Sleep(100); //程序暂停1毫秒

}

//将训练结果保存到文件

storeTrainingData();

}

//解析文件列表,就是读文件//加载txt文件的列举的图像

int loadFaceImgArr(char *filename)

{

FILE* imgListFile=0;

char imgFilename[512];

int iFace, nFaces=0;

//open the input file

imgListFile=fopen(filename,"r");

// 统计人脸数

while(fgets(imgFilename,512,imgListFile)) ++nFaces;

//fgets: read a line of file's strings to store in imgFilename

//function fgets stops if meets a line break or read number of parameter 2

rewind(imgListFile);//get the pointer to the start position of a file

// 分配人脸图像存储空间和人脸ID号存储空间

faceImgArr=(IplImage**)cvAlloc(nFaces*sizeof(IplImage*));

personNumTruthMat=cvCreateMat(1,nFaces,CV_32SC1);

for (iFace=0;iFace

{

//读取图片的路径名称// 从文件中读取序号和人脸名称

fscanf(imgListFile,"%d %s",personNumTruthMat->data.i+iFace,imgFilename);

//将图片保存在数组中// 加载人脸图像

faceImgArr[iFace]=cvLoadImage(imgFilename,CV_LOAD_IMAGE_GRAYSCALE);

}

fclose(imgListFile);

return nFaces;

}

//PCA提取人脸特征

void doPCA()

{

int i;

CvTermCriteria calcLimit; //CvTermCriteria criteria:停止迭代的标准,传入;

CvSize faceImgSize; //人脸框的大小

//set the number of eigenvalues to use

nEigens=nTrainFaces-1; //特增值的数目

//分配内存空间

faceImgSize.width=faceImgArr[0]->width; // faceImgArr测试人脸的宽

faceImgSize.height=faceImgArr[0]->height; // faceImgArr测试人脸的高

eigenVectArr=(IplImage**)cvAlloc(sizeof(IplImage*)*nEigens); //分配个数为住特征值个数

//按照设定的特征值,从小到大,依次给主特征向量分配内存空间(测试人脸框的大小,深度,通道数)

for (i=0;i

eigenVectArr[i]=cvCreateImage(faceImgSize,IPL_DEPTH_32F,1);

//分配主特征值存储空间

eigenValMat=cvCreateMat(1,nEigens,CV_32FC1);

// 分配平均图像存储空间(人脸框的大小,深度,通道数)

pAvgTrainImg=cvCreateImage(faceImgSize,IPL_DEPTH_32F,1);

//设定PCA分析结束条件

calcLimit=cvTermCriteria(CV_TERMCRIT_ITER,nEigens,1);

// 计算平均图像,特征值,特征向量

cvCalcEigenObjects(nTrainFaces, (void*)faceImgArr, (void*)eigenVectArr,

CV_EIGOBJ_NO_CALLBACK, 0, 0, &calcLimit, pAvgTrainImg, eigenValMat->data.fl);

}

//保存训练结果函数

void storeTrainingData()

{

CvFileStorage* fileStorage;

int i;

//create a file-storage interface cvOpenFileStorage:为读写数据打开文件存储器

fileStorage=cvOpenFileStorage("facedata.xml",0,CV_STORAGE_WRITE);

//存储特征值,投影矩阵,平均矩阵等训练结果

cvWriteInt(fileStorage,"nEigens",nEigens); 特征值数目

cvWriteInt(fileStorage,"nTrainFaces",nTrainFaces); 训练图像数目

cvWrite(fileStorage,"trainPersonNumMat",personNumTruthMat,cvAttrList(0,0)); 人脸图像ID号

cvWrite(fileStorage,"eigenV alMat",eigenValMat,cvAttrList(0,0)); 特征值

cvWrite(fileStorage,"projectedTrainFaceMat",projectedTrainFaceMat,cvAttrList(0,0)); 训练图像的投影

cvWrite(fileStorage,"avgTrainImg",pAvgTrainImg,cvAttrList(0,0));训练人脸数据的平均值

for (i=0;i

{

char varname[200];

sprintf(varname,"eigenVect_%d",i); //把格式化的数据写入varname中//将目标写入文件存储器中

cvWrite(fileStorage,varname,eigenVectArr[i],cvAttrList(0,0));

}

//release the file-storage interface

cvReleaseFileStorage(&fileStorage);

}

//加载训练数据,与上面的void storeTrainingData()对应,先保存然后加载,“载入已训练数

据”

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

{

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;

}

//查找最相似的寻找最接近的图像

int findNearestNeighbor(float* projectedTestFace)

{

double leastDistSq=DBL_MAX; //定义最小距离,并初始化为无穷大

int i, iTrain, iNearest=0;

for (iTrain=0;iTrain

{

double distSq=0;

for (i=0;i

{

// Mahalanobis算法计算的距离

float d_i=projectedTestFace[i]- projectedTrainFaceMat->data.fl[iTrain*nEigens+i];

distSq+=d_i*d_i; // Euclidean算法计算的距离

}

if (distSq

{

leastDistSq=distSq;

iNearest=iTrain;

}

}

return iNearest;

}

/* “训练”控件的代码*/

void CAppDesignDlg::OnBnClickedButton2()

{

// TODO: 在此添加控件通知处理程序代码

Train();

AfxMessageBox("训练完成!");

}

/* “载入已训练数据”控件的代码*/

void CAppDesignDlg::OnBnClickedButton3()

{

// TODO: 在此添加控件通知处理程序代码

if(!loadTrainingData(&trainPersonNumMat)){

AfxMessageBox("数据加载失败!");

}

else{

AfxMessageBox("数据加载完成!");

loadxml=true;

}

}

人脸表情识别

图像处理与模式识别 ------人脸表情识别介绍摘要:人脸表情是我们进行交往和表达情绪的一种重要手段,不经过特殊训练,人类对其面部表情往往很难掩饰,所以,通过对人脸表情进行分析,可以获得重要的信息。人脸表情识别是人机交互的智能化实现的一个重要组成部分,也是模式识别、图像处理领域的一个重要研究课题,近几年来,受到了越来越多的科研人员的关注。 本文综述了国内外近年来人脸表情识别技术的最新发展状况,对人脸表情识别系统所涉及到的关键技术: 人脸表情特征提取,做了详细分析和归纳。 关键词:人脸定位;积分投影;人脸表情识别;流形学习;局部切空间排列Abstract:Facial expression is a kind of important means that we communicate and express the special training, People often difficult to conceal their facial , by the analyzing facial expression, we can obtain important information. Facial expression recognition is an important component that the implementation of human-computer interaction, and an important research topic in the field of pattern recognition, image processing, in recent years, more and more researchers focus on this topic. In this paper,we present the latest development of this area,and give a detailed analysisand summary for facial

面部识别的理论概述

通过人的面部特征去再认的能力,也就是对于面部区别性特征的视觉加工能力是人类社会相互作用的基础。人们对于面部识别能力的发展一直有着浓厚的兴趣,尤其是关于儿童的知觉能力何时才能达到成人水平这个问题更是认知心理学所关注的重点。尽管所有的实验研究都显示出在儿童早期的面部识别能力从童年期到青春期一直在持续地快速发展,但最近的一些研究得出了新的结论。儿童在实验环境中对面部记忆的再认能力会显著的提高,大约经过5年时间也就是在青春期晚期达到成人水平。这不仅仅是记忆现象,在进行知觉面部差异的任务中,5岁儿童和成人几乎表现出了同样的水平。在这里我们要说明的问题是为什么这种延迟发展会在儿童执行任务中发生。从文献中,我们确定了两个基本的理论,第一是面部特殊知觉理论,学者们认为一个非常重要的因素是持续不断发展的面部特殊知觉机制;第二是认知的一般发展理论,认为在儿童早期面部知觉能力就已经成熟,在以后任务执行中所有的发展都反应在全面认知机制的提高上,例如视觉注意、外显记忆能力等等。我们所感兴趣的是面部识别的认知机制,这里介绍了两种理论,分别是布鲁斯-杨面孔识别认知模型和交互激活与竞争模型。 一、面部识别的发展理论 (一)面部特有知觉发展理论 尽管我们承认婴儿早期知觉的发展,但是面部特有知觉发展理论者认为面部知觉本身的发展要持续到儿童期晚期, 这是因为对于面部经验的不断延伸所导致的。面部编码能力的持续提高直接源于在知觉任务(如面部识别)中能力的提高以及记忆的提高,例如,对于新面孔提供了更多的有利编码的因素,或在与干扰物比较时能提取得更准确。 关于面部知觉本质的变化,有三种不同的观点[1] 。一种观点认为是因为在整体/构造加工过程中的进步(因此被称作整 体加工过程)。关于这种面部识别的“特殊”方式的准确本质还不能全部明了,但是以下两个方面已经被研究者广泛认可:(a )对于整个面部信息具有很强的知觉整合;(b )当面部空间特征偏离基本的一级结构时,将以“二级”方式进行加工(例如, 两眼,高于鼻子,高于嘴)。另一种理论认为知觉整合和对空 间信息的编码是两个相互独立的部分。第三种理论提出针对 所有的面部信息包括空间信息具有专门的整合表征系统。重要的是,后两种理论都赞同整体加工在刺激物倒置时更敏感。 对于成人而言,整体加工与几个标准范式相联系。面部 产生不成比例的倒转时将影响再认记忆[2,3]。如果物体在学习 和测验时都倒置,那么关于这种物体的记忆将比在垂直条件下的记忆要差,但是倒置效应对面部(25%减量)比对其他许多种类的物体的影响更大。权威的假设认为这种现象的发生是因为整体加工操作只适用于垂直的面部,研究支持了这样的结论——当使一个人的脸的上半部分和另一个人的脸的下半部分结合在一起时,这种组合的影响将使其知觉为一个“新人”,并且比在不组合的条件下去认出上半部分的脸更困难。在整体—部分效应中的孤立的条件下对于面部部分的记忆(比尔德鼻子与约翰的鼻子)比与原来整个面部有联系(比尔德鼻子在比尔的脸上与约翰的鼻子在比尔的脸上)的条件下的记忆更差。在部分与整体这两个变量间,对于面部的部分(比尔的鼻子)记忆,当在整个面部空间改变(比尔的鼻子在比尔的德脸上而眼睛分的更开)的条件下比在未改变整个面部空间的条件下的记忆更差,这个结论与大多数其他证实在具有准确空间的垂直面部下具有更好的敏感性的研究相一致。在垂直面部上产生的整体效应在面部倒置、合成脸和其他物体包括房子、车、狗出现时,不论是新手还是内行,都会消失或者减少。 对于儿童而言,一个早期发展理论认为整体加工最早在 10个月左右就出现了。最近的一些研究提出[1],在儿童早期,整体加工的一些方面就已经成熟,但是其余的关于面部经验 的扩充方面将持续发展直至青春期。并且明确提出关于整体加工的哪些方面将发展,包括Carey 和Diamond 的“神秘因素”,及Mondloch et al 提出的对于面部特征空间的敏感性。关于面部特有知觉发展理论的第二种说法——“面部空 间”也将得到发展,它也被命名为多纬度的空间。空间编码的自然属性将区分不同的脸,每一个个体是一个点,且中心是通常的面部。面部空间已经用来解释若干成人面部识别的特性,比如典型与特色脸效应、漫画讽刺效应、对有吸引力脸的偏好 和适应余波[4]。同时,其他种类的效应——比起个体专有种类 第24卷第2期2011年2月 长春理工大学学报(社会科学版) Journal of Changchun University of Science and Technology (Social Sciences Edition )Vol.24No.2 Feb.2011 面部识别的理论概述 [摘要]目前关于面部识别能力的发展理论仍处于争论之中,其中具有代表性的两种理论分别是面部特有知觉发展理论和一般认知发展理论。在此对这两种理论进行了详细论述。同时,介绍目前面部识别领域中两个主要的认知模型,分别是布鲁斯—杨的面孔识别认知模型和伯顿与布鲁斯的交互激活与竞争模型。未来的研究仍将围绕着面部知觉的数量或质量随着年龄增加是否有变化而进行。[关键词]面部识别;整体加工;结构编码[中图分类号]G40-06 [文献标识码]A [作者简介]王海静(1984-),女,硕士,研究方向为学前儿童心理发展与教育。王海静王志丹(西北师范大学教育学院学前教育系,甘肃兰州,730070)(西北师范大学教育学院心理系,甘肃兰州,730070)

开题报告:人脸识别

北方工业大学 本科毕业设计(论文)开题报告书 题目:基于直方图差值比较方法的人脸识别系统指导教师: 专业班级: 学号: 姓名: 日期:2013年3月20日

一、选题的目的、意义 近些年来,有关人脸的处理已受到广大研究人员越来越多的重视,如人脸识别、人脸定位、面部表情识别、人脸跟踪等。人脸处理系统在安全系统的身份认证、智能人机接口、图像监控、视频检索等领域有着广泛的应用前景。 此外在进行人工智能的研究中,人们一直想做的事情就是让机器具有像人类一样的思考能力,以及识别事物、处理事物的能力,因此从解剖学、心理学、行为感知学等各个角度来探求人类的思维机制、以及感知事物、处理事物的机制,并努力将这些机制用于实践,如各种智能机器人的研制。 同时,进行人脸图像识别研究也具有很大的使用价依。如同人的指纹一样,人脸也具有唯一性,也可用来鉴别一个人的身份。人脸图像的自动识别系统较之指纹识别系统、DNA鉴定等更具方便性,因为它取样方便,可以不接触目标就进行识别,从而开发研究的实际意义更大。并且与指纹图像不同的是,人脸图像受很多因素的干扰:人脸表情的多样性;以及外在的成像过程中的光照,图像尺寸,旋转,姿势变化等。使得同一个人,在不同的环境下拍摄所得到的人脸图像不同,有时更会有很大的差别,给识别带来很大难度。因此在各种干扰条件下实现人脸图像的识别,也就更具有挑战性。 人脸图像识别除了具有重大的理论价值以及极富挑战性外,还其有许多潜在的应用前景,利用人脸图像来进行身份验证,可以不与目标相接触就取得样本图像,而其它的身份验证手段,如指纹、眼睛虹膜等必须通过与目标接触或相当接近来取得样木,在某些场合,这些识别手段就会有不便之处。

基于matlab的人脸识别源代码

function varargout = FR_Processed_histogram(varargin) %这种算法是基于直方图处理的方法 %The histogram of image is calculated and then bin formation is done on the %basis of mean of successive graylevels frequencies. The training is done on odd images of 40 subjects (200 images out of 400 images) %The results of the implemented algorithm is 99.75 (recognition fails on image number 4 of subject 17) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @FR_Processed_histogram_OpeningFcn.,.. 'gui_OutputFcn', @FR_Processed_histogram_OutputFcn.,.. 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

人脸识别技术的应用背景及研究现状

1.人脸识别技术的应用 随着社会的不断进步以及各方面对于快速有效的自动身份验证的迫切要求,生物特征识别技术在近几十年中得到了飞速的发展。作为人的一种内在属性,并且具有很强的自身稳定性及个体差异性,生物特征成为了自动身份验证的最理想依据。当前的生物特征识别技术主要包括有:指纹识别,视网膜识别,虹膜识别,步态识别,静脉识别,人脸识别等。与其他识别方法相比,人脸识别由于具有直接,友好,方便的特点,使用者无任何心理障碍,易于为用户所接受,从而得到了广泛的研究与应用。除此之外,我们还能够对人脸识别的结果作进一步的分析,得到有关人的性别,表情,年龄等诸多额外的丰富信息,扩展了人脸识别的应用前景。当前的人脸识别技术主要被应用到了以下几个方面:(1)刑侦破案公安部门在档案系统里存储有嫌疑犯的照片,当作案现场或通过其他途径获得某一嫌疑犯的照片或其面部特征的描述之后,可以从数据库中迅速查找确认,大大提高了刑侦破案的准确性和效率。 (2)证件验证在许多场合(如海口,机场,机密部门等)证件验证是检验某人身份的一种常用手段,而身份证,驾驶证等很多其他证件上都有照片,使用人脸识别技术,就可以由机器完成验证识别工作,从而实现自动化智能管理。 (3)视频监控在许多银行,公司,公共场所等处都设有24小时的视频监控。当有异常情况或有陌生人闯入时,需要实时跟踪,监控,识别和报警等。这需要对采集到的图像进行具体分析,且要用到人脸的检测,跟踪和识别技术。 (4)入口控制入口控制的范围很广,既包括了在楼宇,住宅等入口处的安全检查,也包括了在进入计算机系统或情报系统前的身份验证。 (5)表情分析根据人脸图像中的面部变化特征,识别和分析人的情感状态,如高兴,生气等。此外,人脸识别技术还在医学,档案管理,人脸动画,人脸建模,视频会议等方面也有着巨大的应用前景。 2.人脸识别技术在国外的研究现状 当前很多国家展开了有关人脸识别的研究,主要有美国,欧洲国家,日本等,著名的研究机构有美国MIT的Media lab,AI lab,CMU的Human-Computer I nterface Institute,Microsoft Research,英国的Department of Engineerin g in University of Cambridge等。综合有关文献,目前的方法主要集中在以下几个方面: (1)模板匹配 主要有两种方法,固定模板和变形模板。固定模板的方法是首先设计一个或几个参考模板,然后计算测试样本与参考模板之间的某种度量,以是否大于阈值来判断测试样本是否人脸。这种方法比较简单,在早期的系统中采用得比较

表情识别技术综述

表情识别技术综述 摘要:表情识别作为一种人机交互的方式,成为研究的热点。基于对表情识别的基本分析,文章重点介绍了面部表情识别的国内外研究情况和面部表情特征的提取方法。 关键词:表情识别;特征提取;表情分类。 前言:进入21世纪,随着计算机技术和人工智能技术及其相关学科的迅猛发展,整个社会的自动化程度不断提高,人们对类似于人和人交流方式的人机交互的需求日益强烈。计算机和机器人如果能够像人类那样具有理解和表达情感的能力,将从根本上改变人与计算机之间的关系,使计算机能够更好地为人类服务。表情识别是情感理解的基础,是计算机理解人们情感的前提,也是人们探索和理解智能的有效途径。如果实现计算机对人脸表情的理解与识别将从根本上改变人与计算机的关系,这将对未来人机交互领域产生重大的意义。 正文:一、面部表情识别的国内外研究情况 面部表情识别技术是近几十年来才逐渐发展起来的,由于面部表情的多样性和复杂性,并且涉及生理学及心理学,表情识别具有较大的难度,因此,与其它生物识别技术如指纹识别、虹膜识别、人脸识别等相比,发展相对较慢,应用还不广泛。但是表情识别对于人机交互却有重要的价值,因此国内外很多研究机构及学者致力于这方面的研究,并己经取得了一定的成果。 进入90年代,对面部表情识别的研究变得非常活跃,吸引了大量的研究人员和基金支持。美国、日本、英国、德国、荷兰、法国等经济发达国家和印度、新加坡都有专门的研究组进行这方面的研究。其中MIT的多媒体实验室的感知计算组、CMu、Ma州大学的计算机视觉实验室、Standford大学、日本城蹊大学、大阪大学、ArR研究所的贡献尤为突出。 国内的清华大学、哈尔滨工业大学、中科院、中国科技大学、南京理工大学、北方交通大学等都有专业人员从事人脸表情识别的研究,并取得了一定的成绩。在1999年的国家自然科学基金中的“和谐人机环境中情感计算理论研究”被列为了重点项目。同时中国科学院自动化所、心理所以及国内众多高校也在这方面取得了一定的进展。2003年,在北京举行了第一届中国情感计算与智能交互学术会议,会议期间集中展示了国内各研究机构近几年来从认知、心理、模式识别、系统集成等多种角度在情感计算领域取得的研究成果,一定程度上弥补了我国这方面的空白。国家“863”计划、“973”项目、国家自然科学基金等也都对人脸表情识别技术的研究提供了项目资助。 二、面部表情特征的提取方法 表情特征提取是表情识别系统中最重要的部分,有效的表情特征提取工作将使识别的性能大大提高,当前的研究工作也大部分是针对表情特征的提取。 目前为止的人脸面部表情特征提取方法大都是从人脸识别的特征提取方法别演变而来,所用到的识别特征主要有:灰度特征、运动特征和频率特征三种阎。灰度特征是从表情图像的灰度值上来处理,利用不同表情有不同灰度值来得到识别的依据。运动特征利用了不同表情情况下人脸的主要表情点的运动信息来进行识别。频域特征主要是利用了表情图像在不同的频率分解下的差别,速度快是其显著特点。在具体的表情识别方法上,分类方向主要有三个:整体识别法和局部识别法、形变提取法和运动提取法、几何特征法和容貌特征法。 整体识别法中,无论是从脸部的变形出发还是从脸部的运动出发,都是将表情人脸作为一个整体来分析,找出各种表情下的图像差别。其中典型的方法有:基于特征脸的主成分分析(prineipalComponentAnalysis,pCA)法、独立分量分析法(Indendent ComPonent Analysis,ICA)、Fisher线性判别法(Fisher’s Linear Discriminants,FLD)、局部特征分析(LoealFeatureAnalysis,LFA)、Fishe诞动法(Fisher^ctions)、隐马尔科夫模型法(HideMarkovModel,HMM)和聚类分析法。

人脸识别文献综述

文献综述 1 引言 在计算机视觉和模式识别领域,人脸识别技术(Face Recognition Technology,简称FRT)是极具挑战性的课题之一。近年来,随着相关技术的飞速发展和实际需求的日益增长,它已逐渐引起越来越多研究人员的关注。人脸识别在许多领域有实际的和潜在的应用,在诸如证件检验、银行系统、军队安全、安全检查等方面都有相当广阔的应用前景。人脸识别技术用于司法领域,作为辅助手段,进行身份验证,罪犯识别等;用于商业领域,如银行信用卡的身份识别、安全识别系统等等。正是由于人脸识别有着广阔的应用前景,它才越来越成为当前模式识别和人工智能领域的一个研究热点。 虽然人类能够毫不费力的识别出人脸及其表情,但是人脸的机器自动识别仍然是一个高难度的课题。它牵涉到模式识别、图像处理及生理、心理等方面的诸多知识。与指纹、视网膜、虹膜、基因、声音等其他人体生物特征识别系统相比,人脸识别系统更加友好、直接,使用者也没有心理障碍。并且通过人脸的表情/姿态分析,还能获得其他识别系统难以获得的一些信息。 自动人脸识别可以表述为:对给定场景的静态或视频序列图像,利用人脸数据库验证、比对或指认校验场景中存在的人像,同时可以利用其他的间接信息,比如人种、年龄、性别、面部表情、语音等,以减小搜索范围提高识别效率。自上世纪90年代以来,人脸识别研究得到了长足发展,国内外许多知名的理工大学及TT公司都成立了专门的人脸识别研究组,相关的研究综述见文献[1-3]。 本文对近年来自动人脸识别研究进行了综述,分别从人脸识别涉及的理论,人脸检测与定位相关算法及人脸识别核心算法等方面进行了分类整理,并对具有典型意义的方法进行了较为详尽的分析对比。此外,本文还分析介绍了当前人脸识别的优势与困难。 2 人脸识别相关理论 图像是人们出生以来体验最丰富最重要的部分,图像可以以各种各样的形式出现,我们只有意识到不同种类图像的区别,才能更好的理解图像。要建立一套完整的人脸识别系统(Face Recognetion System,简称FRS),必然要综合运用以下几大学科领域的知识: 2.1 数字图像处理技术 数字图像处理又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机

人脸识别

人脸识别项目 一、目的 用有监督学习机制设计并实现模式识别方法,用于进行人脸面部特征识别,如性别(男性、女性)、年龄(儿童、青少年、成年、老年)、佩戴眼镜(是、否)、戴帽子(是、否)、表情(微笑、严肃)等。 二、内容 人脸识别是模式识别的一个重要的应用领域。其识别过程包括:特征提取与选取、分类(包括训练与测试)、分类器性能评估。 三、数据 四个文本文件: faceR: 训练数据,100个属性(其中第一个属性是编号,其余99个是本征脸(eigenface) 属性参数,共2000个人脸的数据。 faceS: 测试数据,100个属性(其中第一个属性是编号,其余99个是本征脸(eigenface) 属性参数,共2000个人脸的数据。 faceDR: 对faceR文件中的每一个人脸数据的说明。 faceDS: 对faceS文件中的每一个人脸数据的说明。 提示:由于数据是真实数据,会有以下情况: 1)有缺失数据(如1228, 1808, 4056, 4135, 4136, and 5004),建议将有缺失数据的人脸记录不予考虑 2)有错误数据,建议对有错误的人脸记录不予考虑 原始数据:各个人脸的原始图象数据在目录rawdata中 四、要求 1)将数据导入MATLAB 2)确定分类的目标(可以是下面的一个目标,或多个目标的组合) a)性别(男性、女性) b)年龄(儿童、青少年、成年、老年) c)佩戴眼镜(是、否) d)戴帽子(是、否) e)表情(微笑、严肃)等。 3)选用一种分类算法(距离分类器、Bayes分类器、SVM、ANN 或Decision Trees),先用faceR中的数据对分类器进行训练,然后用faceS中的数据对训练好的分类器 的性能(分类准确率)作出评估。当然,有些分类算法需要验证数据,可以根据需 要从faceR或faceS中随机抽取验证数据,验证数据的数据量应该不少于500个人 脸记录。 4)用MATLAB编程实现模式识别的整个过程(可以直接调用相关的函数)。 5)完成项目报告,具体内容包括: a)模式识别问题的说明,重要是说明分类的目标 b)模式识别过程的说明:采用何种分类算法,改算法的基本原理,是否进行了特 征提取或特征选取,程序的基本流程框图,训练的结果,测试的结果,分类器

基于VC++的人脸识别系统的设计与实现含源程序

目录 摘要............................................................. III 第1章绪论 (1) 1.1引言 (1) 1.2国内外研究现状与人脸识别的发展阶段 (2) 1.3人脸识别的研究内容 (3) 1.4相关学科 (4) 1.5小结 (5) 第2章人脸检测技术研究 (6) 2.1人脸检测问题分类 (6) 2.2人脸模式特征提取法[11] (8) 2.2.1肤色特征 (8) 2.2.2 灰度特征[12] (8) 2.3人脸检测方法分类 (9) 2.3.1 基于知识的方法 (10) 2.3.2 基于统计模型的人脸检测方法 (11) 2.3.3 基于模板的方法[19] (15) 2.4小结 (16) 第3章基于隐马尔可夫模型HMM的人脸识别 (17) 3.1相关背景概念 (17) 3.2隐马尔可夫模型HMM构成元素[16] (18) 3.3隐马尔可夫模型HMM原理 (19) 3.4隐马尔可夫模型基本算法[1] (20) 3.4.1 前向-后向算法 (20) 3.4.2 维特比算法 (24) 3.4.3 Baum-Welch 算法[1] (25)

3.5隐马尔可夫模型在人脸识别中应用 (28) 3.5.1 人脸图像HMM模型状态的确定 (28) 3.5.2 观察值序列 (29) 3.5.3 基于离散余弦变换(DCT)的特征提取方法 (30) 3.5.4 HMM建模训练和人脸识别工作流程 (32) 3.6改进的隐马尔可夫模型在人脸识别中的应用 (35) 3.6.1 观察向量的提取[15] (35) 3.6.2 人脸参数训练[15] (35) 3.6.3 人脸的识别 (36) 3.7小结 (37) 第4章人脸识别系统设计与试验 (38) 4.1人脸识别系统涉及的软件和硬件 (38) 4.1.1 软件部分 (38) 4.1.2 硬件部分 (42) 4.2人脸识别系统 (43) 4.2.1 用户界面介绍 (43) 4.2.2 主要模块介绍 (43) 4.2.3 程序实现界面 (47) 4.2.4 相关人脸数据库 (48) 4.3人脸识别试验 (51) 4.3.1 用Yale人脸库进行人脸识别试验 (51) 4.3.2 用ORL人脸库进行人脸识别试验 (54) 4.3.3 用自建的人脸库进行人脸识别试验 (56) 结论 (60) 致谢 (61) 参考文献 (62) 附录 (64)

人脸识别技术综述

人脸识别研究综述 摘要:论文首先介绍了人脸识别技术概念与发展历史,解释人脸识别技术的过程与优缺点;随后对近几年人脸识别技术的研究情况与一些经典的方法进行详细的阐述,最后提出人脸识别技术在生活中的应用与展望。 关键词:人脸识别研究现状应用与展望 一、概念 人脸识别技术是基于人的脸部特征,对输入的人脸图像或者视频流。首先判断其是否存在人脸,如果存在人脸,则进一步的给出每个脸的位置、大小和各个主要面部器官的位置信息。并依据这些信息,进一步提取每个人脸中所蕴涵的身份特征,并将其与已知的人脸进行对比,从而识别每个人脸的身份。 广义的人脸识别实际包括构建人脸识别系统的一系列相关技术,包括人脸图像采集、人脸定位、人脸识别预处理、身份确认以及身份查找等;而狭义的人脸识别特指通过人脸进行身份确认或者身份查找的技术或系统。 二、发展历史 人脸识别的研究历史比较悠久。高尔顿(Galton)早在1888 年和1910 年就分别在《Nature》杂志发表了两篇关于利用人脸进行身份识别的文章,对人类自身的人脸识别能力进行了分析。但当时还不可能涉及到人脸的自动识别问题。最早的AFR1的研究论文见于1965 年陈(Chan)和布莱索(Bledsoe)在Panoramic Research Inc.发表的技术报告,至今已有四十年的历史。近年来,人脸识别研究得到了诸多研究人员的青睐,涌现出了诸多技术方法。 三、过程与优缺点 人脸的识别过程: (1)首先建立人脸的面像档案。即用摄像机采集单位人员的人脸的面像文件或取他们的照片形成面像文件,并将这些面像文件生成面纹(Faceprint)编码贮存起来。 (2)获取当前的人体面像。即用摄像机捕捉的当前出入人员的面像,或取照片输入,并将当前的面像文件生成面纹编码。 (3)用当前的面纹编码与档案库存的比对。即将当前的面像的面纹编码与档案库

人脸检测综述_孙宁

2006 年 12 月JOURNAL OF CIRCUITS AND SYSTEMS December, 2006 文章编号:1007-0249 (2006) 06-0101-08 人脸检测综述* 孙宁1,2,邹采荣2,赵力1,2 (1. 东南大学学习科学研究中心,江苏南京 210096;2. 东南大学无线电工程系,江苏南京 210096) 摘要:人脸检测研究在近二十年的时间内取得了长足的进步,并且作为安控、人机界面、人类情感研究系统的重要组成部分得到了广泛的应用。该文首先对人脸检测所面临的问题进行了探讨,并将人脸检测方法分为:基于几何特征的方法、基于肤色模型的方法、基于统计理论的方法三个方面进行了阐述。分析了相关的理论及算法,对各个方法的优缺点进行了比较。最后,对人脸检测今后的研究方向进行了讨论。 关键词:人脸检测;人脸识别;机器学习;模式识别; 中图分类号:TP391 文献标识码:A 1 引言 观察一个人的面部可以自然的,无侵犯性的了解到一个人的很多信息,比如:身份,性别,年龄,情感等等。因此,在过去三十多年[1]的时间里人们对人脸检测和人脸识别始终保持着浓厚的研究兴趣。随着近些年来国际形势的变化,特别是9.11事件之后,各国对自身重要设施的安保性能越发重视,也积极研发了一些自动人脸识别系统并投入实用。比如,美国Identix公司的FaceIt[2]系统,该系统基于局部特征分析(LFA),能在不同的光照,肤色,姿态,表情情况下得到良好的检测性能。我国的生物特征认证与安全技术研究中心(CBSR)则在2004年成功研制出了基于人脸、指纹、虹膜三种识别方法的快速通关系统(MRTD)[3],取得了国际先进的整体性能。 任何人脸识别系统首先都需要从输入信息中获取人脸的位置、大小。因此,人脸检测是人脸识别系统的第一个步骤,这一步骤的所获得的精度与速度直接影响整个系统的性能。此外,人脸检测的应用也大大超越了人脸识别系统的范畴,在人脸表情识别系统,基于内容的检索,视频会议,三维人脸模型等方面也有重要的应用价值。 人脸的自动检测是一类具有很大挑战性的问题,其主要难点在于:(1)人脸是一类高度非刚性的目标,存在相貌,表情,肤色等差异,(2)人脸上可能会存在一些附属物,诸如,眼镜,胡须等。(3)人脸的姿态变化万千,并且可能存在遮挡物。(4)待检测图像性质的差异。比如:待检图像的分辨率;摄录器材的质量等;(5)光源的种类和角度。不同种类和角度的光源会对待检测的人脸产生不同性质的反射和不同区域的阴影。 针对以上问题,各国的科研人员作了很多的研究,国外比较著名的有CMU,MIT,UIUC等,国内的有微软亚洲研究院、中科院自动化研究所、清华大学等。此外,每年在国际国内的相关期刊和会议上都有大量的关于人脸检测的论文,其中综述性质的文章对近期人脸检测的研究进展进行总结,对人脸检测的研究方向进行展望。Chellappa、Zhao等人分别于1995和2003年发表的两篇人脸识别的综述论文[4,5],其中列出专门章节将人脸检测作为人脸识别系统的一部分进行了综述。前者总结了上世纪九十年代中期之前人脸检测技术的状况和发展,后者则着重介绍了最新的人脸检测技术的发展情况。2001年,E. Hjelmas等人发表的文章[6]将人脸检测技术分为基于图像的方法和基于特征的方法这两类进行了综述。2002年,M .H. Yang等在IEEE Trans. PAMI上发表了名为:Detecting Faces in Images: A Survey[7]的人脸检测技术综述文章,该文将人脸检测技术分为四类进行了详细介绍,并且针对以往关于人脸检测论文中检测性能估计方面的混乱情况,提出了较明确的估计准则。此外,还给出了许多用于人脸检 * 收稿日期:2005-04-11 修订日期:2005-08-17

基于MATLAB的人脸识别

基于MATLAB的人脸识别

————————————————————————————————作者: ————————————————————————————————日期:

图像识别 题目:基于MATLAB的人脸识别 院系:计算机科学与应用系 班级: 姓名: 学号: 日期:

设计题目基于MATLAB的人脸识别设 计技术参数 测试数据库图片10张训练数据库图片20张图片大小1024×768 特征向量提取阈值 1 设计要求综合运用本课程的理论知识,并利用MATLAB作为工具实现对人脸图片的预处理,运用PCA算法进行人脸特征提取,进而进行人脸匹配识别。 工作量 两周的课程设计时间,完成一份课程设计报告书,包括设计的任务书、基本原理、设计思路与设计的基本思想、设计体会以及相关的程序代码; 熟练掌握Matlab的使用。 工作计划第1-2天按要求查阅相关资料文献,确定人脸识别的总体设计思路; 第3-4天分析设计题目,理解人脸识别的原理同时寻求相关的实现算法;第5-8天编写程序代码,创建图片数据库,运用PCA算法进行特征提取并编写特征脸,上机进行调试; 第9-12天编写人脸识别程序,实现总体功能; 第13-14天整理思路,书写课程设计报告书。 参考资料1 黄文梅,熊佳林,杨勇编著.信号分析与处理——MATALB语言及应用.国防科技大学出版社,2000 2 钱同惠编著.数字信号处理.北京:机械工业出版社,2004 3 姚天任,江太辉编著.数字信号处理.第2版.武汉:武汉理工大学出版社,2000 4 谢平,林洪彬,王娜.信号处理原理及应用.机械工业出版社,2004 5刘敏,魏玲.Matlab.通信仿真与应用.国防工业出版社,2005 6 楼顺天.基于Matlab7.x 的系统分析与设计.西安电子科技大学,2002 7孙洪.数字信号处理.电子工业出版社,2001 目录 引言?错误!未定义书签。 1 人脸识别技术?错误!未定义书签。 1.1人脸识别的研究内容?错误!未定义书签。 1.1.1人脸检测(Face Detection)........... 错误!未定义书签。

人脸识别程序源代码

1.利用OpenCV进行人脸检测 人脸检测程序主要完成3部分功能,即加载分类器、加载待检测图象以及检测并标示。本程序使用OpenCV中提供的“haarcascade_frontalface_alt.xml”文件存储的目标检测分类,用cvLoad函数载入后,进行强制类型转换。OpenCV中提供的用于检测图像中目标的函数是cvHaarDetectObjects,该函数使用指针对某目标物体(如人脸)训练的级联分类器在图象中找到包含目标物体的矩形区域,并将这些区域作为一序列的矩形框返回。分类器在使用后需要被显式释放,所用的函数为cvReleaseHaarClassifierCascade。这些函数原型请参看有关OpenCV手册。 2.程序实现 1)新建一个Visual C++ MFC项目,取名为“FaceDetection”,选择应用程序类型为“单文档”。将菜单中多余的项去掉,并添加一项“人脸检测”,其ID为“ID_FaceDetected”,并生成该菜单项的消息映射函数。 2)在“FaceDetectionView.h”头文件中添加以下灰底色部分程序代码:

3)在“FaceDetectionView.cpp”文件中添加以下灰底色部分程序代码:

需要注意的是,本程序运行时应将分类器文件置于程序目录下,如果运行的是生成的E XE文件,则应将分类器文件与该EXE文件放在同一个目录下。 三、程序运行结果 运行该程序,选择人脸检测菜单项,弹出文件打开对话框,选择要检测的图像文件,程序就会将检测到的人脸用圆圈标示出来,如图3所示。本程序能顺利检测出大部分人脸,但由于光照、遮挡和倾斜等原因,部分人脸不能正确检测,另外,也有一些非人脸部分由于具有人脸的某些特征,也被当成了人脸,这些都是本程序需要改进的部分。

人脸自动识别方法综述_周杰

人脸自动识别方法综述 周 杰,卢春雨,张长水,李衍达 (清华大学自动化系,北京100084) 摘 要: 人脸自动识别是模式识别、图像处理等学科的一大研究热点,近几年来关于人脸识别的研究取得了很大进展.本文重点对近三、四年来人脸识别的研究进行综述并对各种方法加以评论. 关键词: 人脸自动识别;人脸检测;人脸定位 中图分类号: TP39114 文献标识码: A 文章编号: 0372-2112(2000)04-0102-05 A Su rvey of Automa tic Human Face Recognition ZHOU Jie,LU Chun -yu,ZHANG Chang -shui,LI Yan -da (De partment o f Automation ,Tsinghua Unive rsit y ,Be ijing 100084,China) Abstract: Automatic human face recogni tion is attractive in pattern recogniti on and i mage processing.In this paper we gave a survey of automatic human face recogni tion,mainly ai ming at the latest progress. Key words: automatic hu man face recognition;face detection;face localization 1 引言 随着社会的发展,各个方面对快速有效的自动身份验证的要求日益迫切.由于生物特征是人的内在属性,具有很强的自身稳定性和个体差异性,因此是身份验证的最理想依据.这其中,利用人脸特征进行身份验证又是最自然直接的手段,相比其它人体生物特征它具有直接、友好、方便的特点,易于为用户所接受[1]. 人脸识别是人类视觉最杰出的能力之一,它的研究涉及模式识别、图像处理、生理学、心理学、认知科学,与基于其它生物特征的身份鉴别方法以及计算机人机感知交互领域都有密切联系,因此早在六七十年代即引起了研究者的强烈兴趣.进入九十年代,由于各方面对人脸识别系统的迫切需求,人脸识别的研究重新变得非常热门.目前美国等国有许多研究组在从事人脸识别的研究,这些研究受到军方、警方及大公司的高度重视和资助,美国军方每年还专门组织人脸识别比赛以促进这一领域的发展.在国内,也开始有一些学校从事人脸识别相关的研究.近几年来关于人脸识别的研究取得了很大进步,国际上发表有关论文的数量大幅增长,IEEE 的PAM I 汇刊还于1997年7月出版了人脸识别专辑,每年的国际会议上关于人脸识别的专题也屡屡可见.而目前人脸识别综述的文章还是截止到1994年,因此我们认为非常有必要对近几年的研究工作进行一下总结.在本文中我们将对人脸识别方法进行综述,其中主要介绍近三、四年的研究工作,之前的研究工作请参看文[2,3]. 2 人脸自动识别系统 人脸自动识别系统包括两个主要技术环节(如图1所 示):首先是人脸检测和定位,即从输入图像中找到人脸及人脸存在的位置,并将人脸从背景中分割出来,然后才是对归一化的人脸图像进行特征提取与识别 . 图1 人脸自动识别系统构成 这两个环节的研究独立性很强.由于在很多特定情况下人脸检测与定位的工作比较简单,因此/特征提取与识别0环节得到了更为广泛和深入的研究;而近几年来随着人们越来越关心各种复杂情形下的人脸自动识别系统,人脸检测与定位才得到了较多的重视. 评价一个人脸自动识别系统的标准,一个是误识率即将某人错识别为其他人,另一个是虚警率即将其他人识别为这个人.这二者之间是存在矛盾的,所以在实际问题中往往需要进行某种折衷.如,在安全性要求较高的计算机登录系统中,必须要求虚警率要尽可能低,而误识率则可以高一些,这样只是增加合法用户的等录时间,并不会降低计算机系统的安全性.这一点同样适用于特征提取与识别环节,但是对于人脸检测与定位,我们一般则要求误识率要尽可能低,因为这样才可以保证所要识别的人不会在这一步就丢失. 收稿日期:1999-03-15;修订日期:1999-07-06基金项目:自然科学基金(No.69775009)资助课题 第4期2000年4月电 子 学 报ACTA ELECTRONICA SINICA Vol.28 No.4 April 2000

人脸表情识别综述

人脸表情识别综述 一、人脸表情识别技术目前主要的应用领域包括人机交互、安全、机器人制造、医疗、通信和汽车领域等 二、1971年,心理学家Ekman与Friesen的研究最早提出人类有六种主要情感,每种情感以唯一的表情来反映人的一种独特的心理活动。这六种情感被称为基本情感,由愤怒(anger)、高兴(happiness)、悲伤(sadness)、惊讶(surprise)、厌恶(disgust)和恐惧(fear)组成 人脸面部表情运动的描述方法---人脸运动编码系统FACS (Facial Action Coding System),根据面部肌肉的类型和运动特征定义了基本形变单元AU(Action Unit),人脸面部的各种表情最终能分解对应到各个AU上来,分析表情特征信息,就是分析面部AU的变化情况 FACS有两个主要弱点:1.运动单元是纯粹的局部化的空间模板;2.没有时间描述信息,只是一个启发式信息 三、人脸表情识别的过程和方法 1、表情库的建立:目前,研究中比较常用的表情库主要有:美国CMU机器人研究所和心理学系共同建立的 Cohn-Kanade AU-Coded Facial Expression Image Database(简称CKACFEID)人脸表情数据库;日本ATR 建立的日本女性表情数据库(JAFFE),它是研究亚洲人表情的重要测试库 2、表情识别: (1)图像获取:通过摄像头等图像捕捉工具获取静态图像或动态图像序列。 (2)图像预处理:图像的大小和灰度的归一化,头部姿态的矫正,图像分割等。 →目的:改善图像质量,消除噪声,统一图像灰度值及尺寸,为后序特征提取和分类识别打好基础 主要工作→人脸表情识别子区域的分割以及表情图像的归一化处理(尺度归一和灰度归一) (3)特征提取:将点阵转化成更高级别图像表述—如形状、运动、颜色、纹理、空间结构等,在尽可能保证稳定性和识别率的前提下,对庞大的图像数据进行降维处理。 →特征提取的主要方法有:提取几何特征、统计特征、频率域特征和运动特征等 1)采用几何特征进行特征提取主要是对人脸表情的显著特征,如眼睛、眉毛、嘴巴等的位置变化进行定位、测量,确定其大小、距离、形状及相互比例等特征,进行表情识别 优点:减少了输入数据量 缺点:丢失了一些重要的识别和分类信息,结果的精确性不高

人脸识别介绍

人脸识别技术是生物识别技术的一种,它结合了图像处理、计算机图形学、模式识别、可视化技术、人体生理学、认知科学和心理学等多个研究领域。从二十世纪六十年代末至今,人脸识别算法技术的发展共经历了如下四个阶段: 1. 基于简单背景的人脸识别 这是人脸识别研究的初级阶段。通常利用人脸器官的局部特征来描述人脸。但由于人脸器官没有显著的边缘且易受到表情的影响,因此它仅限于正面人脸(变形较小)的识别。 2. 基于多姿态/表情的人脸识别 这是人脸识别研究的发展阶段。探索能够在一定程度上适应人脸的姿态和表情变化的识别方法,以满足人脸识别技术在实际应用中的客观需求。 3. 动态跟踪人脸识别 这是人脸识别研究的实用化阶段。通过采集视频序列来获得比静态图像更丰富的信息,达到较好的识别效果,同时适应更广阔的应用需求。 4. 三维人脸识别 为了获得更多的特征信息,直接利用二维人脸图像合成三维人脸模型进行识别,即将成为该领域的一个主要研究方向。 人脸识别技术的研究范围主要包括以下几个方面: 1. 人脸检测:在输入的图像中寻找人脸区域。 2. 人脸的规范化:校正人脸在尺度、光照和旋转等方面的变化。 3. 特征提取:从人脸图像中映射提取一组能反映人脸特征的数值表示样本。 4. 特征匹配:将待识别人脸与数据库中的已知人脸比较,得出相关信息。 人脸识别流程 1图像预处理 1.1 图像去噪 一般来说,自然界中的噪声可以看成是一种随机信号。根据图像获取的途径人脸图像获取 人脸检测 定位人脸区域 预处理 特征抽取 人脸特征 对比识别 结果 人脸特征库

不同,噪声的融入也有多种方式: 1. 图像是直接以数字形式获取的,那么图像数据的获取机制会不可避免地 引入噪声信号; 2. 在图像采集过程中,物体和采集装置的相对运动。或采集装置的抖动, 也会引入噪声,使图像变的模糊不清; 3. 在图像数据的电子传输过程中,也不同程度的引入噪声信号。 这些噪声信号的存在,严重的情况会直接导致整幅图像的不清晰,图象中的景物和背景的混乱。对于用于人脸识别的图像。由于噪声的引入,将不可避免地造成识别率的下降。对图像噪声的消除可以通过两个途径:空间域滤波或频率域滤波。消除噪声的方法很多,对于不同的噪声应该采用不同的除噪方法。主要的方法是:线性滤波、中值滤波、维纳滤波以及小波去噪等。 1.2 增强对比度 为了使人脸在图像中更为突出以便于下一步的特征提取,增强图像对比度是很有必要的。增强对比度有很多种方法,常见的有直方图均衡化和“S ”形变换等方法。 “S ”形变换方法将灰度值处于某一范围(人脸特征范围)内的像素灰度分布差距拉开,从而保证了对比度的提高,但此方法降低了其他灰度值的对比度。而直方图均衡化则是将像素的灰度分布尽量展开在所有可能的灰度取值上,这样的方法同样能使得图像的对比度提高。 将彩色图像转化成灰度图像是人脸识别方法中常见的处理过程,虽然转化过程丢失了一部分色彩信息,但是灰度图像拥有更小的存储空间和更快的计算速度。文献[1]给出了一种能够将RGB 色彩转换成灰度级且适于突出人脸区域对比度的转换模型:()5.0144.0587.0299.0,+?+?+?=b g r y x f ;其中f 代表灰度值,r ,g ,b 分别表示Red,Green,Blue 分量的值。 文献[2]通过将人脸彩色图像从RGB 色彩空间转换到RIQ 色彩空间,得到了更适于频谱分析的特征分量。

相关主题