OpenCV人脸检测(C++代码)

原创 2015年03月05日 14:24:05

OpenCV人脸检测(C++代码)—— By wepon

这篇文章简单总结一下人脸检测的代码实现,基于OpenCV,C++版本。之所以强调C++版本是因为OpenCV有很多其他语言的接口,之前我也写过人脸检测的Python实现《Python-OpenCV人脸检测(代码)》,这篇文章则讲C++实现,其实大同小异,C++相比于Python实现代码写起来会繁琐一点,这也是语言本身决定的吧。

为了保持代码风格一致,C++实现与之前的Python实现一样,都将人脸检测、眼睛检测、框出人脸、框出眼睛、截取保存人脸各个功能封装为函数,方便移植。

1、OpenCV中人脸检测采用的算法

在安装OpenCV的路径中(window系统),我们可以发现”…\opencv\sources\data”目录下有如下三个文件夹:

这正是OpenCV采用的算法。haarcascades文件下存放的是采用Haar特征的级联分类器(Cascade Classfier),hogcascades下存放采用HOG特征(梯度方向直方图)的级联分类器,lbpcascades下存放的是采用LBP特征的级联分类器。关于图像的Haar、LBP、HOG、SIFT等特征我将写另外的博文进行总结,这里就不详细展开。图中三个文件夹下存放了很多xml文件,这些是预先训练好的特征,用于构造分类器的,有人脸检测的、眼睛检测的、smile检测的、行人检测的等等。

在这篇文章中,仅以haarcascas下的”haarcascade_frontalface_alt.xml”和”haarcascade_eye.xml”作为例子。主要代码在下文讲解,更多代码也可以到我的github获取:here

2、代码实现

这个demo以下图为输入:

  • 图像预处理

    • 转化为灰度图
    • 直方图均衡化
Mat img = imread("obama.jpg");
Mat img_gray;
cvtColor(img,img_gray,COLOR_BGR2GRAY );
equalizeHist(img_gray,img_gray);
  • 构造级联分类器

    首先生成一个级联分类器的实例,然后用xml文件初始化该实例(调用load方法),最后调用该实例的detectMultiScale方法,作用在灰度图img_gray上,即可获取该图片中的各个人脸的坐标。detectMultiScale方法返回的是一个vector类型的容器,里面每个Rect存储的是人脸矩形的左上顶点、矩形宽度、矩形长度(x,y,width,height)。

CascadeClassifier faces_cascade;
faces_cascade.load("haarcascade_frontalface_alt.xml");
vector<Rect> faces;
faces_cascade.detectMultiScale(img_gray,faces,1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );
  • 框出人脸、眼睛

    这部分用到的是opencv里的绘图工具,可以参考opencv文档基本绘画,这里不啰嗦。ellipse画椭圆、circle画圆形,它们的参数(比如circle的圆心半径)由级联分类器返回的Rect确定。

  • 截取和保存人脸部分

    可以根据级联分类器检测返回的Rect,获取图像的ROI,然后调用imwrite方法。

Rect roi = faces[i];
imwrite(saveName,img(roi));

由于检测出的face不只一个,所以saveName需要设计一下,具体在代码文件中有注释。

  • 运行结果


转载请注明来源并完整保留文中链接:http://blog.csdn.net/u012162613/article/details/44081975

版权声明:本文为博主原创文章,未经博主允许不得转载。

人脸检测代码详细解析

转载的出处和链接:http://blog.csdn.net/jasonque/article/details/8471572
  • u012906122
  • u012906122
  • 2014年05月24日 17:11
  • 2507

【OpenCV入门指南】第十三篇 人脸检测

【OpenCV入门指南】第十三篇 人脸检测     本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测(人脸识别)。人脸检测可以说是学术界的宠儿,在不少EI,SCI高级别论文都能看到它的身影。甚...
  • MoreWindows
  • MoreWindows
  • 2013年01月08日 02:08
  • 120034

基于OpenCV的人脸检测代码

最近在做人脸识别,在做人脸识别之前,必须有这么的一个过程,那即是人脸检测,只有先检测出人脸后,再预处理人脸图像,最后才做人脸识别,这是人脸识别的过程,现在的 人脸测试代码都被封装好了,只要调用Open...
  • chenjiazhou12
  • chenjiazhou12
  • 2014年02月21日 16:43
  • 1332

openCV人脸识别三种算法实现(官网翻译)

 本文转自:http://blog.csdn.net/ningningxl/article/details/10903581 怎样使用OpenCV进行人脸识别 本文大部分来自OpenCV官网...
  • Sunshine_in_Moon
  • Sunshine_in_Moon
  • 2015年05月15日 21:52
  • 3101

人脸识别全部代码

  • 2015年03月22日 20:32
  • 2.18MB
  • 下载

完整的人脸识别系统源代码

  • 2009年03月31日 11:21
  • 937KB
  • 下载

OpenCV中人脸识别代码实现

声明:本文代码来源于http://www.cognotics.com/opencv/servo_2007_series/,实现平台为Linux+OpenCV,共分为两部分:人脸检测与人脸识别。本文为后...
  • pds2008
  • pds2008
  • 2014年09月18日 21:19
  • 8574

OpenCV中人脸检测代码实现

声明:本文代码来源于http://www.cognotics.com/opencv/servo_2007_series/,实现平台为Linux+OpenCV,共分为两部分:人脸检测与人脸识别。本文为前...
  • liudekuan
  • liudekuan
  • 2013年01月31日 17:18
  • 5282

C++开发人脸性别识别教程(4)——OpenCv的人脸检测函数

这个项目主要包含三部分:人脸检测、特征提取、性别分类:   这篇博客中我们重点介绍OpenCv的人脸检测函数。这篇博客我们先不提MFC,而是在win32控制台下编写一段人脸检测的程序。   一...
  • u013088062
  • u013088062
  • 2015年12月31日 09:35
  • 11470

【C++】基于 OpenCV 的人脸识别(强烈推荐)

一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库。它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包。根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从...
  • u013346007
  • u013346007
  • 2016年01月23日 14:18
  • 43304
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OpenCV人脸检测(C++代码)
举报原因:
原因补充:

(最多只允许输入30个字)