当前位置:
文档之家› 利用OpenCV实现人脸检测
利用OpenCV实现人脸检测
(5)在“Show directories for(显示以下内容的目录)”下 拉列表框中选择“Include Files(包含文件)”,并在右侧列表 框中定位并添加以下路径:
<OpenCV安装目录>\OpenCV、cxcorekinclude J
<OpenCV安装目录>\OpenC、化vkinclude
OpenCV手册。 2.2程序实现
(1)新建一个Visual C++MFC项目。取名为“Face
Detection”,选择应用程序类型为“单文档”。将菜单中多余的
项去掉,并添加一项“人脸检测”,其ID为
“ID_FaceDetected”。并生成该菜单项的消息映射函数。
(2)在“FaceDetectionView.h”头文件中添加以下灰底色
部分程序代码:
,,南京森林公安高等专科学校江林升
//FaceDetectionView.h:CFaceDetectionView类的接口 物ragma once #include。cv.h。
#include。highgui.h。 class CFaceDetectionView:public CView { protected://仅从序列化创建
l*.JPgl(。.bmp)|*.bmPl’,NULL); //从文件对话窗口中打开图像
if(OpenDIg.DoModaloi=IDOK)
return;
//获得文件名 fileName=OpenDIg.GetPathName0; //g,耍的类型转换 std::string tempName=《LPCSTR)CStringA(fileName); const char。tmp=tempName.c_str0; //打开文件,若失败则返回
~ ~ 一 ~一 一 ~ 一 ~ ~ 一 一 一 实~ 用一 第一
一一 一一 一~ 一 ~~ 一 一 一
一智 一慧 一密 一集
. .一. .兰
幂,l ffl OpenCV实现人脸检测
江林升
摘要:OpenCV全称是指开放的计算机视觉资源代码,它具有统一的结构和功能定义、强 大的图像和矩阵运算能力、方便灵活的接口等特点。在Visual c++2005环境下,给出了利用
’
2程序开发
人脸检测是一个非常先进的问题,它是人脸研究的一个主
要方向,其任务是对于一幅给定的图像,采用一定的策略对其
进行搜索,以确定其中是否含有人脸、含有多少个人脸。以及
所含人脸的位置、大小和姿态。人脸检测的算法很多.
Adaboost算法是其中的一种。Adaboost算法虽然十分复杂,但
应用OpenCV提供的甬数和分类器进行人脸检测将是十分容 易。
void detect_and_drawf Ipllmage。img}:
一
Ipllmage‘src;//载入的图像
=
(3)在“FaceDetectionView.cpp”文件中添加以下灰底色 部分程序代码:
//FaceDetectionView.cpp:CFaceDetectionView类的实现 搦nclude’stda仅.h- #include。FaceDetection.h‘ #include‘FaceDetectionDec.h。 #include。FaceDetectioቤተ መጻሕፍቲ ባይዱView.h‘ #include<string> #ifdef DEBUG #define new DEBUG—NEW #endif ,,CFaceDetectionView lMPLEMENT DYNCREATE(CFaceDetectionView,CView) BEGIN—MESSAGE—MAP(CFaceDetectionView,CView)
CFaceDetectionView0;
DECLARE—DYNCREATE(CFaceDetectionView} ,/属性
public:
4,
CFaceDetectionDoc’GetDocument()const;
CvHaarCIassifierCascade‘cascade;//特征器分类
CvMemStorage‘storage;
Windows下运行,也可以在Linux下运行。OpenCV的源代码 是用C和C++所编写且完全开放的.因此具有很好的可移植 性。在Microsoft Visual C+4-6.0、Microsoft Visual Studio 2003 及Bodand C++BuilderX等环境下均可方便地使用OpenCV所 提供的库来进行实际开发.本程序以Visual C++2005作为开 发环境。
center.Y拳cvRound《《r一>y+r->height。0.5)*scale);
<OpenCV安装目录>\OpenCVkcvauxkinclude
图1
<OpenCV安装目录>\OpenCV、nnNnclude
<OpenCV安装目录.>\OpenCVkothedibskhighgui <OpenCV安装目录>\。penCVbthe r|ibs、cvcam、i九cf“de
<OpenCV安装目录>\OpenCVWlicrosoft Platform
ON—COMMAND《ID—FaceDetected. &CFaceDetectionView::OnFacedetected) END—MESSAGE—MAP(》 //CFaceDetectionView构造/析构
const char。cascade_name#‘ haarcascade_frontalface_alt.xml”:∥分类器的名称 //CFaceDetectionView消息处理程序 void CFaceDetectionView::OnFacedetected(} ,/人脸检测菜单响应事件
于检测图像中目标的函数是cvHaarDetectObjeets,该函数使用 指针对某目标物体(如人脸)训练的级联分类器在图像中找到
包含目标物体的矩形区域,并将这些区域作为一序列的矩形框
返回。分类器在使用后需要被显式释放.所用的函数为
cvReleaseHaarClassifierCascade,这些函数原型请参看有关
1 0penGV在Visual C++2005下的安装与 配置
1.1 OpenCV安装 首先到OpcnCV的官方网站下载OpenCV并进行安装,安
装过程很简单。只要按照安装向导一步一步进行即可。 1.2对Visual C++2005进行全局设置
(1)打开Visual C++2005,选择“Tools(工具)I Options (选项)”菜单项,弹出如图1所示的对话框。
Ipllmage。gray=cvCreatelmage{cvSize《img一>width。 itug->height),8,1}:
Iptlmage。small—img=cvCreatelmage(cvSize{cvRound 《img->width/scale),cvRound(img->heightJscale)),8,1):
if(《src=cvLoadlmage(tmp, CV—LOAD—IMAGE_ANYCOLOR));=0)
return;
∥加载(分类器层叠)训练库 cascade=fCvHaarClassifierCascade。)cvLoad《 cascade—name,0,0,0):
∥加载不成功则显示错误讯息,并退出 if(cascade》
万方数据
,}r—_\
≮掣
,。。。‘。。。。。。。。。。。。’’。。。‘。。‘’’‘。。。。。。。。’。。。‘。。。。。‘。‘’。‘。。‘‘。。’。。。。。。。。
实用第一/智慧密集
3CvSeq
‘。
storage=cvCreateMemStorage(0);
cvNamedWindow(。人脸检测。. CV_WINDOW_AUTOSIZE)://创建窗口
/,如果图片存在则分析并显示结果,否则退出程序 if(src)detect_and—draw(src);//调用人脸检与标示事僻
cvReleaselmage(&src); cvReleaseMemStorage(&storage}: } else
{ AfxMessageBox(L。无法加载分类器,请确认后熏试!‘); } cvReleaseHaarClassifierCascadef&cascade}: } void CFaceDetectionView::detect_and_draw(Ipllmage’imgy ∥人脸检与标示事件 l static CvScalar color[1={0,0,255}; ,,用于设置标示图像中人脸的颜色 double scale=1.3:
{
,,TODO:在此添加命令处理程序代码
’
CString fileName;
//jI丁开文件对话窗口
CFileDialog OpenDIg(TRUE.NULL,NULL,
OFN—HlDEREADONLY l OFN—OVERVVRITEPROMPT I OFN—NOCHANGEDIR.0图像文件格式JPG file format(’.jpg}
(2)在左侧列表框中选择“Projects and Solutions(项目和 解决问题方案)I VC++Directories(VC++目录)”。
(3)在“Show directories for(显示以下内容的目录)”下 拉列表框中选择。Library Files(库文件)”。
(4)在右侧库文件列表框中定位并添加“<OpcnCV安装 目录>\OpenCV、lib”。
int i:
cvCvtColor(img,gray,CV-8GR2GRAY}:
cvResize《gray,small—img,CV_INTER—LINEAR): cvEqualizeHist(small—img,small—img): cvClearMemStorage(storage): if(cascade)