论文部分内容阅读
摘要:简要介绍用于数字图像处理的开源代码的计算机视觉类库——OpenCV,利用OpenCv进行人脸检测,实践表明OpenCV在人脸检测中具有高效性和便捷性。
关键词:OpenCV 计算机视觉 人脸检测
中图分类号:G623文献标识码: A
1、引言
人脸检测技术是计算机对输入的图像进行检测并判断是否出现人脸,并且能够准确的识别出人脸所在位置的自动检测技术。这一项检测技术目前主要用于人脸追踪、基于人臉的图像检索以及用于安全监控等领域,已经成为计算机视觉与模式识别领域内的研究重点的课题,人脸检测是自动人脸识别系统中的一个关键环节,人脸检测研究具有重要的学术与现实价值,人脸是一类具有相当复杂的细节变化的自然结构目标。检测的主要难点在于:
(1)人脸具有相当复杂的细节变化,比如相貌、表情、肤色等
(2)人脸可能有相关的遮挡物,比如眼镜、头发覆盖等
(3)在拍照时,人脸可能成不同的姿态,比如侧脸、正脸,这些都能影响人脸的检测。
(4)光源的种类,强弱和角度的不同,使得在人脸上产生不同的性质的反射,从而形成不同的阴影区域,这增加了人脸检测的难度。
以上的各个问题都会对人脸检测产生影响,而本文采用Opencv实现人脸检测的原理是基于Adaboost算法,该算法是一种分类器算法,是利用大量的分类能力一般的简单分类器通过一定的方法叠加起来,构成一个强分类器,再将若干个强分类器串联成为分级分类器完成图像搜索检测。
2、OpenCv介绍
Opencv是开放源代码的计算机视觉类库,由英特尔公司位于俄罗斯的研究实验室开发,它是可以免费获得的由一些C函数和C++类所组成的库,用来实现常用的图像处理及计算机视觉算法,已经广泛用于人脸识别、目标运动检测、图像处理等领域。选用它的原因:Opencv的图像处理功能相当强大,不仅能处理图像的格式、提供移动检测等功能,由Opencv的模块介绍可以看出主要的功能函数在cv,cvaux、cxcore模块中,而与操作系统有关的图像界面如在highgui模块。
3、人脸检测的程序编写
获取OpenCV官方发布的软件包以及CMake软件包按照说明进行配置编译,部署好开发环境。程序中主要实现检测的函数如下:
检测模块使用了Opencv函数库,启动后会调用函数CvCapture*capture=0;获取视频的抽象接口,获取图像后使用人脸分类器haarcascade_frontalface_alt.xml进行检测,并用圆圈画出人脸区域。
部分代码如下:
void detect_and_draw( IplImage* img )
{
static CvScalar colors[] =
{ {{0,0,255}},{{0,128,255}},{{0,255,255}},{{0,255,0}},{{255,128,0}},{{255,255,0}},{{255,0,0}},{{255,0,255}} };
double scale = 1.3;
IplImage*gray= cvCreateImage( cvSize(img->width,img->height), 8, 1 );
IplImage*small_img= cvCreateImage(cvSize(cvRound (img->width/scale),cvRound (img->height/scale)), 8, 1 ); int i;
cvCvtColor(img,gray, CV_BGR2GRAY );cvResize(gray,small_img,CV_INTER_LINEAR ); //缩小灰色图片
cvEqualizeHist( small_img, small_img ); //灰度图象直方图均衡化
cvClearMemStorage( storage ); //释放内存块
if( cascade )
{ //cvHaarDetectObjects是opencv检测人脸的接口
CvSeq*faces=cvHaarDetectObjects(small_img, cascade, storage,1.1, 2, 0,cvSize(30, 30) );
//画出检测到的人脸外框(可检测到多个人脸)
for( i = 0; i < (faces ? faces->total : 0); i++ )
{ //返回索引所指定的元素指针
CvRect*r= (CvRect*)cvGetSeqElem( faces, i );
//确定圆心,用圆圈来确定人脸位置
CvPoint center;
int radius;
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 );
} }
cvShowImage( "result", img );
cvReleaseImage( &gray );
cvReleaseImage( &small_img );
}
4、结语
经过测试,基于Opencv的人脸检测达到预期的功能。但在还需要进一步深化分类器,因为这个分类器只能检测出正面脸型。利用OpenCV中的数字图像处理函数可以使得图像处理简单,对缩短程序的开发周期有着十分显著效果。Opencv是免费开放源代码的,程序员可以修改其源代码,更能优化开发,且基于Qt的编程可以移植到不同的平台上,适应性强。
参考文献
[1]刘瑞祯、于仕琪.OpenCV教程[M].北京:北京航空航天大学出版社,2007:1-2
[2]Visual C++ 数字图像模式识别典型案例详解[M]北京:机械工业出版,2012:174-205
作者简介: 蓝芸根(1985-),男,工程师,工程硕士,从事检测技术及自动化装置研究
关键词:OpenCV 计算机视觉 人脸检测
中图分类号:G623文献标识码: A
1、引言
人脸检测技术是计算机对输入的图像进行检测并判断是否出现人脸,并且能够准确的识别出人脸所在位置的自动检测技术。这一项检测技术目前主要用于人脸追踪、基于人臉的图像检索以及用于安全监控等领域,已经成为计算机视觉与模式识别领域内的研究重点的课题,人脸检测是自动人脸识别系统中的一个关键环节,人脸检测研究具有重要的学术与现实价值,人脸是一类具有相当复杂的细节变化的自然结构目标。检测的主要难点在于:
(1)人脸具有相当复杂的细节变化,比如相貌、表情、肤色等
(2)人脸可能有相关的遮挡物,比如眼镜、头发覆盖等
(3)在拍照时,人脸可能成不同的姿态,比如侧脸、正脸,这些都能影响人脸的检测。
(4)光源的种类,强弱和角度的不同,使得在人脸上产生不同的性质的反射,从而形成不同的阴影区域,这增加了人脸检测的难度。
以上的各个问题都会对人脸检测产生影响,而本文采用Opencv实现人脸检测的原理是基于Adaboost算法,该算法是一种分类器算法,是利用大量的分类能力一般的简单分类器通过一定的方法叠加起来,构成一个强分类器,再将若干个强分类器串联成为分级分类器完成图像搜索检测。
2、OpenCv介绍
Opencv是开放源代码的计算机视觉类库,由英特尔公司位于俄罗斯的研究实验室开发,它是可以免费获得的由一些C函数和C++类所组成的库,用来实现常用的图像处理及计算机视觉算法,已经广泛用于人脸识别、目标运动检测、图像处理等领域。选用它的原因:Opencv的图像处理功能相当强大,不仅能处理图像的格式、提供移动检测等功能,由Opencv的模块介绍可以看出主要的功能函数在cv,cvaux、cxcore模块中,而与操作系统有关的图像界面如在highgui模块。
3、人脸检测的程序编写
获取OpenCV官方发布的软件包以及CMake软件包按照说明进行配置编译,部署好开发环境。程序中主要实现检测的函数如下:
检测模块使用了Opencv函数库,启动后会调用函数CvCapture*capture=0;获取视频的抽象接口,获取图像后使用人脸分类器haarcascade_frontalface_alt.xml进行检测,并用圆圈画出人脸区域。
部分代码如下:
void detect_and_draw( IplImage* img )
{
static CvScalar colors[] =
{ {{0,0,255}},{{0,128,255}},{{0,255,255}},{{0,255,0}},{{255,128,0}},{{255,255,0}},{{255,0,0}},{{255,0,255}} };
double scale = 1.3;
IplImage*gray= cvCreateImage( cvSize(img->width,img->height), 8, 1 );
IplImage*small_img= cvCreateImage(cvSize(cvRound (img->width/scale),cvRound (img->height/scale)), 8, 1 ); int i;
cvCvtColor(img,gray, CV_BGR2GRAY );cvResize(gray,small_img,CV_INTER_LINEAR ); //缩小灰色图片
cvEqualizeHist( small_img, small_img ); //灰度图象直方图均衡化
cvClearMemStorage( storage ); //释放内存块
if( cascade )
{ //cvHaarDetectObjects是opencv检测人脸的接口
CvSeq*faces=cvHaarDetectObjects(small_img, cascade, storage,1.1, 2, 0,cvSize(30, 30) );
//画出检测到的人脸外框(可检测到多个人脸)
for( i = 0; i < (faces ? faces->total : 0); i++ )
{ //返回索引所指定的元素指针
CvRect*r= (CvRect*)cvGetSeqElem( faces, i );
//确定圆心,用圆圈来确定人脸位置
CvPoint center;
int radius;
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 );
} }
cvShowImage( "result", img );
cvReleaseImage( &gray );
cvReleaseImage( &small_img );
}
4、结语
经过测试,基于Opencv的人脸检测达到预期的功能。但在还需要进一步深化分类器,因为这个分类器只能检测出正面脸型。利用OpenCV中的数字图像处理函数可以使得图像处理简单,对缩短程序的开发周期有着十分显著效果。Opencv是免费开放源代码的,程序员可以修改其源代码,更能优化开发,且基于Qt的编程可以移植到不同的平台上,适应性强。
参考文献
[1]刘瑞祯、于仕琪.OpenCV教程[M].北京:北京航空航天大学出版社,2007:1-2
[2]Visual C++ 数字图像模式识别典型案例详解[M]北京:机械工业出版,2012:174-205
作者简介: 蓝芸根(1985-),男,工程师,工程硕士,从事检测技术及自动化装置研究