/*这个程序调用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 ;}
人眼识别
最新推荐文章于 2023-07-26 17:00:52 发布