KIA=(p0-pc)/(1-pc)
其中p0=∑xii/N,pc=∑(xi+*x+i)/N2。Xi+是第i行总数,x+i是第i列总数。 行和列是指在交叉表中而言的。
将两种数据进行比对,调整比对精度,再将特征数据与重新提取的数据进行比对,如果二者的差异性在一定范围内,意即KAPPA指数以及其他相似性指数在一定范围内,即可判断为检测成功。
六、程序实现简单人脸识别
由于人脸识别系统是个庞大而复杂的系统,所涉及的学科范围包括计算机图形学、数字图像处理、计算机科学以及地图学(KAPPA指数)等等,使得人脸识别系统利用简单的程序来实现是非常困难的,这里,我将运用简单的代码,利用openCV的知识来实现人脸识别的初步构想,以便读者理解。
1, 运行环境
集成环境:VC6.0,操作系统:windows 7旗舰版,运行环境:openCV
2, C代码
/*test.cpp文件完整代码*/ #include \#include \
#include \#include
staticCvHaarClassifierCascade* cascade = 0; staticCvMemStorage* storage = 0;
voiddetect_and_draw( IplImage* image );
const char* cascade_name =\ //人脸检测要用到的分类器
int _tmain(intargc, _TCHAR* argv[]) {
cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); //加载人脸检测所用的分类器 if( !cascade ) {
fprintf(stderr, \return -1; }
storage = cvCreateMemStorage(0); //动态存储结构,用来存储人脸在图像中的位置 cvNamedWindow( \
11
//const char* filename = \ //待检测图像(包含绝对路径) const char* filename = \景甜.jpg\
IplImage* image = cvLoadImage( filename, 1 ); //加载图像
detect_and_draw( image ); //对加载的图像进行检测 cvWaitKey(0);
cvReleaseImage(&image ); cvDestroyWindow(\return 0; }
voiddetect_and_draw( IplImage* img ) {
staticCvScalar 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}} };
double scale = 1.3;
IplImage* gray = cvCreateImage(cvSize(img->width,img->height), 8, 1 ); IplImage* small_img = cvCreateImage(cvSize( cvRound (img->width/scale), cvRound (img->height/scale)), 8, 1 );
cvCvtColor(img, gray, CV_BGR2GRAY );
cvResize( gray, small_img, CV_INTER_LINEAR ); cvEqualizeHist(small_img, small_img ); cvClearMemStorage( storage );
if( cascade ) {
/*函数cvHaarDetectObjects检测图像中的目标,由OpenCV提供。*/
CvSeq* faces = cvHaarDetectObjects(small_img, cascade, storage, 1.1, 2, 0 , cvSize(30, 30) );
for(inti = 0; i< (faces ? faces->total : 0); i++ )
12
{
CvRect* r = (CvRect*)cvGetSeqElem( faces, i ); CvPoint center; int radius;
center.x = cvRound((r->x + r->width*0.5)*scale); center.y = cvRound((r->y + r->height*0.5)*scale); radius = cvRound((r->width + r->height)*0.25*scale); cvCircle(img, center, radius, colors[i%8], 3, 8, 0 ); } }
cvShowImage( \cvReleaseImage(&gray );
cvReleaseImage(&small_img ); }
/* stdafx.h文件完整代码*/
// stdafx.h : 标准系统包含文件的包含文件, // 或是经常使用但不常更改的 // 特定于项目的包含文件 //
//#pragma once
//#define WIN32_LEAN_AND_MEAN // 从 Windows 头中排除极少使用的资料
//#include
// TODO: 在此处引用程序需要的其他头文件
/* stdafx.cpp文件完整代码*/
// stdafx.cpp : 只包括标准包含文件的源文件 // FaceDetection.pch 将作为预编译头 // stdafx.obj 将包含预编译类型信息
//#include \
// TODO: 在 STDAFX.H 中
// 引用任何所需的附加头文件,而不是在此文件中引用
13
3, 程序运行结果
处理前:
处理后:
14