人眼识别

 
 
/*这个程序调用opencv自带的分类器对200张图片进行了人眼检测,借助于人眼在人脸的半部分的先验知识,通过设置阈值,当检测到的某个准眼睛区域的下边界在人脸图像的某个范围之内时认为这个准眼睛区域不是真正的眼睛区域,结果凡是分类器争取检测出来的眼睛都保留了,而识别错误的准眼睛区域都被滤去了。在我的电脑上,识别率是72.5%。试验用的人脸数据库是从google上下的,叫BioID-FaceDatabase-V1.2。每次都会呈现两张图片,分别是没有阈值处理的图片和进行了阈值处理后的图片。*/
#include "highgui.h"
#include "cv.h"
#include "string.h"
#include "stdio.h"
int main ( int argc , char ** argv )
{
//return 0; //char* file_dir = "1"; char img_index_c[10]; //char filename[100]; char* cascadename_face = "D:\\软件\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml"; char* cascadename_eye = "D:\\软件\\opencv\\sources\\data\\haarcascades\\haarcascade_eye.xml"; CvMemStorage* storage = cvCreateMemStorage(0); CvMemStorage* storage_eye = cvCreateMemStorage(0); CvHaarClassifierCascade* cascade_face = (CvHaarClassifierCascade*)cvLoad(cascadename_face, 0, 0, 0); CvHaarClassifierCascade* cascade_eye = (CvHaarClassifierCascade*)cvLoad(cascadename_eye, 0, 0, 0); for (int img_index = 0; img_index<200; ++img_index) { printf("%d\n", img_index); sprintf(img_index_c, "d", img_index); //printf("%s\n",img_index_c); //strcpy(filename, file_dir); //strcat(filename, img_index_c); //strcat(filename, ".jpg"); //printf("%s\n",filename); IplImage* image = cvLoadImage("1.jpg", 1);//1.jpg为人脸图像
IplImage * image_copy = cvCreateImage ( cvSize ( image -> width , image -> height ), image -> depth , image -> nChannels );
cvCopy ( image , image_copy , NULL );
cvNamedWindow ( "image" , CV_WINDOW_AUTOSIZE );
cvNamedWindow ( "image_copy" , CV_WINDOW_AUTOSIZE );
cvClearMemStorage ( storage );
CvSeq * objects = NULL ;
objects = cvHaarDetectObjects ( image , cascade_face , storage , 1.1 , 2 , 0 , cvSize ( 0 , 0 ));
//cvShowImage("image",image);
//cvWaitKey(0);
for ( int rect_index = 0 ; rect_index < ( objects == NULL ? 0 : objects -> total ); ++ rect_index )
{
CvRect * rect = ( CvRect * ) cvGetSeqElem ( objects , rect_index );
//cvRectangle(image,cvPoint(rect->x,rect->y),cvPoint(rect->x+rect->width,rect->y+rect->height),CV_RGB(255,0,0),1,8,0);
IplImage * face = cvCreateImage ( cvSize ( rect -> width , rect -> height ), image -> depth , image -> nChannels );
cvSetImageROI ( image , * rect );
cvCopy ( image , face , NULL );
cvResetImageROI ( image );
cvClearMemStorage ( storage_eye );
CvSeq * objects_eye = NULL ;
objects_eye = cvHaarDetectObjects ( face , cascade_eye , storage_eye , 1.1 , 3 , 0 , cvSize ( 0 , 0 ));
for ( int eye_index = 0 ; eye_index < ( objects_eye == NULL ? 0 : objects_eye -> total ); ++ eye_index )
{
CvRect * rect_eye = ( CvRect * ) cvGetSeqElem ( objects_eye , eye_index );
cvRectangle ( image_copy , cvPoint ( rect -> x + rect_eye -> x , rect -> y + rect_eye -> y ),
cvPoint ( rect -> x + rect_eye -> x + rect_eye -> width , rect -> y + rect_eye -> y + rect_eye -> height ), CV_RGB ( 255 , 0 , 0 ), 1 , 8 , 0 );
int eye_center_x = rect_eye -> x + rect_eye -> width / 2 ;
int eye_center_y = rect_eye -> y + rect_eye -> height / 2 ;
rect_eye -> x = eye_center_x - 15 ;
rect_eye -> y = eye_center_y - 10 ;
rect_eye -> width = 30 ;
rect_eye -> height = 20 ;
if ( rect_eye -> y + rect_eye -> height > face -> height * 9 / 16 ) continue ;
cvRectangle ( image , cvPoint ( rect -> x + rect_eye -> x , rect -> y + rect_eye -> y ),
cvPoint ( rect -> x + rect_eye -> x + rect_eye -> width , rect -> y + rect_eye -> y + rect_eye -> height ), CV_RGB ( 255 , 0 , 0 ), 1 , 8 , 0 );
}
//cvNamedWindow("face",CV_WINDOW_AUTOSIZE);
//cvShowImage("face",face);
//cvWaitKey(0);
}
cvShowImage ( "image" , image );
cvShowImage ( "image_copy" , image_copy );
cvWaitKey ( 0 );
}
return 0 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值