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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012162613/article/details/44081975

从零开始的C++ opencv的人脸识别程序——人脸检测

之前我们做了第一个C++程序,中间有opencv的测试,这个在opencv入门教程中有,很详细。我这里印象深刻的几个错误给大家列出来,如果有同类错误可以参考一下。 第一,是程序输入后记得打上#incl...
  • weixin_38698317
  • weixin_38698317
  • 2017-05-08 16:45:54
  • 1998

利用opencv实现人脸检测(C++版)

小编所有的帖子都是基于unbuntu系统的,当然稍作修改同样试用于windows的,经过小编的绞尽脑汁,把刚刚发的那篇python 实现人脸和眼睛的检测的程序用C++ 实现了,当然,也参考了不少大神的...
  • xiao__run
  • xiao__run
  • 2017-08-07 13:27:46
  • 616

opencv+c++实现人脸识别

  • 2017年10月10日 10:19
  • 9.89MB
  • 下载

代码C++, opencv实现人脸识别,人脸检测,人脸匹配,视频中的人脸检测,摄像头下的人脸检测等

前一段时间写了一个人脸相关的算法,包括视频中的人脸检测,相机的人脸检测,图像中人脸检测,还有人脸识别。 使用的是VS2013和opencv。 首先创建头文件common.h #ifndef ...
  • stf1065716904
  • stf1065716904
  • 2018-01-22 19:59:20
  • 465

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

一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库。它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包。根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从...
  • u013346007
  • u013346007
  • 2016-01-23 14:18:40
  • 51623

人脸特征点提取算法包对比(ASM/深度学习)

将现有的ASM公开算法包进行对比,且以ASMLibrary为例,进行了简单实验,保存人脸68个特征点坐标。另外也罗列了深度学习在人脸特征点检测的相关英文教程,并进行了简单总结。...
  • u013803245
  • u013803245
  • 2016-04-27 19:35:33
  • 20751

人脸识别特征提取(LBP)及其opencv实现

LBP是一种简单,有效的纹理分类的特征提取算法。LBP算子是由Ojala等人于1996年提出的,主要的论文是"Multiresolution gray-scale and rotation invar...
  • fabulousli
  • fabulousli
  • 2016-04-12 08:58:37
  • 7033

OpenCV之识别自己的脸——C++源码放送

OpenCV之识别自己的脸——C++源码放送 前言 在将近一年之前,我在CSDN专栏《OpenCV实践之路》中连续发了三篇博客,完整地描述了基于OpenCV进行人脸识别的全过程。三篇都将近一万...
  • xingchenbingbuyu
  • xingchenbingbuyu
  • 2017-04-05 09:49:57
  • 7166

opencv人脸识别--cvHaarDetectObjects函数_源码

  • 2015年12月31日 12:02
  • 108KB
  • 下载

OpenCV人脸检测源代码

  • 2010年05月10日 09:23
  • 97KB
  • 下载
收藏助手
不良信息举报
您举报文章:OpenCV人脸检测(C++代码)
举报原因:
原因补充:

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