人脸检测创新实验结题书Word文件下载.docx
- 文档编号:19708343
- 上传时间:2023-01-09
- 格式:DOCX
- 页数:12
- 大小:1.01MB
人脸检测创新实验结题书Word文件下载.docx
《人脸检测创新实验结题书Word文件下载.docx》由会员分享,可在线阅读,更多相关《人脸检测创新实验结题书Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
二、实验要求:
1、实现单张照片的人脸检测和标记;
2、熟悉怎么使用WindowsAPI函数设计窗口界面,实现人脸检测功能;
3、了解WindowsAPI编程的方法与技能的;
4、掌握VC和openCV的基础知识;
3、实验原理:
[一].人脸检测算法原理:
Viola-Jones人脸检测方法
该算法的主要特征:
1.提出积分图像(integralimage),从而可以快速计算Haar-like特征。
2.利用Adaboost学习算法进行特征选择和分类器训练,把弱分类器组
合成强分类器。
3.采用分类器级联提高效率。
[二].openCV检测原理
因为openCV中已经有预先训练好的一些物体识别文件(haar分类器),所以我们组决定不在自己训练,因为这需要大量的经过处理的图片,任务过去繁重。
第二步,我们使用detect_and_draw()函数来识别、标记人脸,其中代码函数中有一个颜色向量的数组colors[],可以不同颜色标记人脸;
分类器在灰度图上进行检测,所以RGB图首先通过cvCvtClolor()转化成灰度图,还可以用cvResize()调整大小,然后通过cvEqualizeHist()进行直方均衡;
cvHaarDetectObjects()以不同的窗口扫描输入的图形寻找人脸,人脸检测会有多次重复,这里默认3次,我们才认为人脸确实存在,防止误检验。
主要步骤为:
1.加载分类器。
用cvLoad函数读入xml格式的文件。
2.读入待检测图像。
读入图片、视频或者调用摄像头采集。
3.检测并标示人脸,显示人脸检测数目和用时。
四、实验内容与步骤(部分代码):
1、首先,在VS2010平台下建立win32项目,设计基本对话框样式和功能按钮;
(1)三个按钮:
btn[0]=CreateWindow(TEXT("
button"
),TEXT("
单张照片识别"
),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,40,40,100,30,hWnd,(HMENU)0,hInstance,NULL);
btn[1]=CreateWindow(TEXT("
摄像识别"
),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,40,80,100,30,hWnd,(HMENU)1,hInstance,NULL);
btn[2]=CreateWindow(TEXT("
视频识别"
),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,40,120,100,30,hWnd,(HMENU)2,hInstance,NULL);
(2)显示人脸识别数和用时:
TextOut(hdc,250,180,TEXT("
人脸识别用时(纳秒):
"
),11);
TextOut(hdc,400,180,szText1,wsprintf(szText1,TEXT("
%d"
),ti));
TextOut(hdc,250,200,TEXT("
人脸识别个数:
),7);
TextOut(hdc,380,200,szText1,wsprintf(szText1,TEXT("
),fa));
2、编写对应按钮的功能函数,加入openCV函数;
constchar*cascade_name=
"
haarcascade_frontalface_alt2.xml"
;
//Haar分类器
/*"
haarcascade_profileface.xml"
*/
(1)人脸检测标记函数
voiddetect_and_draw(IplImage*img)//人脸检测标记函数
{
staticCvScalarcolors[]=//一般用来存放像素值(不一定是灰度值哦)的
{
{{0,0,255}},//画圆的那个线条颜色
{{0,128,255}},
{{0,255,255}},
{{0,255,0}},
{{255,128,0}},
{{255,255,0}},
{{255,0,0}},
{{255,0,255}}
};
doublescale=1.3;
IplImage*gray=cvCreateImage(cvSize(img->
width,img->
height),8,1);
IplImage*small_img=cvCreateImage(cvSize(cvRound(img->
width/scale),//对一个double型的数进行四舍五入,并返回一个整型数!
cvRound(img->
height/scale)),8,1);
//缩放
inti;
cvCvtColor(img,gray,CV_BGR2GRAY);
//颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间的转换,也可以转换为灰度图像。
cvResize(gray,small_img,CV_INTER_LINEAR);
//调整3通道图像(如RGB图像)和单通道图像的大小。
cvEqualizeHist(small_img,small_img);
//用来使灰度图象直方图均衡化
cvClearMemStorage(storage);
if(cascade)
doublet=(double)cvGetTickCount();
//获取操作系统启动所经过(elapsed)的毫秒数
CvSeq*faces=cvHaarDetectObjects(small_img,cascade,storage,//用来检测图像中的目标
1.1,2,0/*CV_HAAR_DO_CANNY_PRUNING*/,//利用Canny边缘检测器
cvSize(20,20));
t=(double)cvGetTickCount()-t;
ti=((t/((double)cvGetTickFrequency()))/1000000.0);
fa=faces->
total;
for(i=0;
i<
(faces?
faces->
total:
0);
i++)
{
CvRect*r=(CvRect*)cvGetSeqElem(faces,i);
//返回索引指定的元素指针
CvPointcenter;
intradius;
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);
//画圆标记
}
}
cvWaitKey(0);
cvShowImage("
人脸检测结果"
img);
cvReleaseImage(&
gray);
small_img);
}
//将TCHAR转为char
//*tchar是TCHAR类型指针,*_char是char类型指针
voidTcharToChar(constTCHAR*tchar,char*_char)
{
intiLength;
//获取字节长度
iLength=WideCharToMultiByte(CP_ACP,0,tchar,-1,NULL,0,NULL,NULL);
//将tchar值赋给_char
WideCharToMultiByte(CP_ACP,0,tchar,-1,_char,iLength,NULL,NULL);
}
(2)照片识别
voidpicturetext(TCHARa[])//照片识别
CHARb[260];
TcharToChar(a,b);
//CvCapture*capture=0;
//视频摄像头
IplImage*frame,*frame_copy=0;
//图形结构
cascade=(CvHaarClassifierCascade*)cvLoad(cascade_name,0,0,0);
//导入分类器
storage=cvCreateMemStorage(0);
//创建内存空间
cvNamedWindow("
result"
1);
constchar*filename=(char*)b;
IplImage*image=cvLoadImage(filename,1);
if(image)
detect_and_draw(image);
image);
else
/*assumeitisatextfilecontainingthe
listoftheimagefilenamestobeprocessed-oneperline*/
FILE*f=fopen(filename,"
rt"
);
if(f)
charbuf[1000+1];
while(fgets(buf,1000,f))
intlen=(int)strlen(buf);
while(len>
0&
&
isspace(buf[len-1]))
//检查参数c是否为空格字符,也就是判断是否为空格('
'
)、水平定位字符
//('
\t'
)、归位键('
\r'
)、换行('
\n'
)、垂直定位字符('
\v'
)或翻页('
\f'
)的情况
len--;
buf[len]='
\0'
image=cvLoadImage(buf,1);
fclose(f);
cvDestroyWindow("
);
(3)视频文件和摄像头识别
我们组在照片识别的基础上进一步实现了摄像头捕获视频和读取视频文件(*.avi)的人脸检测:
voidcamera_vedio()//视频文件和摄像头识别
CvCapture*capture=0;
//IplImage*frame,*frame_copy=0;
capture=cvCaptureFromCAM(0);
//初始化从摄像头中获取视频
capture=cvCaptureFromAVI(input_name);
//从视频文件中捕获视频帧。
//二选一既可做识别
for(;
)
if(!
cvGrabFrame(capture))//从摄像头或者视频文件中抓取帧
break;
frame=cvRetrieveFrame(capture);
//取回由函数cvGrabFrame抓取的图像。
frame)
frame_copy)
frame_copy=cvCreateImage(cvSize(frame->
width,frame->
height),
IPL_DEPTH_8U,frame->
nChannels);
if(frame->
origin==IPL_ORIGIN_TL)
cvCopy(frame,frame_copy,0);
//前到后
else
cvFlip(frame,frame_copy,0);
//直接将图像采集卡采集的图像cvShowImage出来的是反着的图像,
//在显示图像之前使用cvFlip()函数将图像翻转一下
//垂直翻转图像(flip_mode=0)用于顶-左和底-左图像结构的转换,主要用于WIN32系统下的视频操作处理.
detect_and_draw(frame_copy);
////人脸检测
if(cvWaitKey(10000)==27)//ESC键退出
break;
frame_copy);
cvReleaseCapture(&
capture);
3、选择检测图片、视频文件、调用摄像头获取视频文件进行人脸检测。
5、实验过程原始记录(数据,图表,计算等):
主页面:
1.照片识别结果:
在这两张测试图片中,人脸检测准确率达到了100%。
2.视频文件识别结果:
在视频测试中准确率也达到了100%。
3.调用摄像头识别结果:
(1).在光线明亮处识别结果:
准确识别,没有误差。
(2).在光线较暗处识别结果:
准确无误。
六、实验结果分析或总结:
我们小组经过不懈的努力,最终实现了人脸检测的功能,我们知道Viola-Jones分类算法并不限于人脸检测,它适应于其他外表有区别的(接近刚性的)物体的检测。
但是,人的侧脸和车的斜视角检测效果不够理想,主要是因为这些视角在模板中有很多变化,而“块特征”无法很好地处理这些变化。
通过本次实验,我们熟悉和掌握openCV(开源的计算机视觉库),并进一步增强了c语言和win32编程能力;
近几年,计算机视觉领域发展迅速,对一些物体的识别检测应用广泛,例如人脸识别出入管理系统、汽车识别系统、人脸识别门禁考勤系统、人脸识别监控管理、人脸识别电脑安全防范、人脸识别照片搜索、人脸识别来防登记、人脸识别ATM机智能视频报警系统、人脸识别监狱智能报警系统、人脸识别RFID智能通关系统、人脸识别公安罪犯追逃智能报警系统等等。
我们需要进一步研究openCV的使用,进一步提升自己在识别方面的开发能力,下一步准备做人脸识别电脑安全防范和门禁考勤系统,我们会更加努力!
参考文献:
[1]谭浩强.C程序设计(第4版)
[M]清华大学出版社
[2]Windows程序设计(第五版
珍藏版)[M]清华大学出版社
[3]于仕琪等译.学习OpenCV(中文版)[M]清华大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 检测 创新 实验 结题书