人眼识别

本文介绍了一个使用OpenCV进行人脸及眼睛检测的程序。该程序采用阈值过滤技术提高识别准确性,通过对200张图片的测试,实现了72.5%的识别率。文中详细展示了如何加载图像、应用分类器以及进行阈值处理的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*这个程序调用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、付费专栏及课程。

余额充值