原文出处:http://blog.csdn.net/MoreWindows/article/details/8426318#t2

本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测(人脸识别)。人脸检测可以说是学术界的宠儿,在不少EI,SCI高级别论文都能看到它的身影。甚至很多高校学生的毕业设计都会涉及到人脸检测。当然人脸检测的巨大实用价值也让很多公司纷纷关注,很多公司都拥有这方面的专利或是开发商业产品出售。

在OpenCV中,人脸检测也是其热门应用之一。在OpenCV的特征检测专题就详细介绍了人脸检测的原理——通过Haar特征来识别是否为人脸。Haar特征检测原理与Haar特征分类器的训练放到下一篇《【OpenCV入门指南】第十四篇  Haartraining》来讲,本篇主要介绍如何在OpenCV中使用Haar特征分类器来对图像中的人脸进行检测和识别。下面将分成五步来详细示范如何在OpenCV中进行人脸识别:

一.人脸的Haar特征分类器是什么

二.在哪找人脸的Haar特征分类器

三.怎么用人脸的Haar特征分类器

四.人脸识别示例代码

五.人脸识别程序运行结果

一.人脸的Haar特征分类器是什么

人脸的Haar特征分类器就是一个XML文件,该文件中会描述人脸的Haar特征值。当然Haar特征的用途可不止可以用来描述人脸这一种,用来描述眼睛,嘴唇或是其它物体也是可以的。

二.在哪找人脸的Haar特征分类器

OpenCV有已经自带了人脸的Haar特征分类器。OpenCV安装目录中的\data\ haarcascades目录下的haarcascade_frontalface_alt.xml与haarcascade_frontalface_alt2.xml都是用来检测人脸的Haar分类器。这个haarcascades目录下还有人的全身,眼睛,嘴唇的Haar分类器。读者可以仿照本方的例子来试验下效果看看。

三.怎么用人脸的Haar特征分类器

使用人脸的Haar特征分类器非常之简单,直接使用cvHaarDetectObjects。下面来看看这个函数的介绍:

函数功能:检测图像中的目录

函数原型:

CVAPI(CvSeq*) cvHaarDetectObjects(

const CvArr* image,

CvHaarClassifierCascade* cascade,

CvMemStorage* storage,

double scale_factor CV_DEFAULT(1.1),

int min_neighbors CV_DEFAULT(3),

int flags CV_DEFAULT(0),

CvSize min_size CV_DEFAULT(cvSize(0,0)),

CvSize max_size CV_DEFAULT(cvSize(0,0))

);

函数说明:

第一个参数表示输入图像,尽量使用灰度图以加快检测速度。

第二个参数表示Haar特征分类器,可以用cvLoad()函数来从磁盘中加载xml文件作为Haar特征分类器。

第三个参数为CvMemStorage类型,大家应该很熟悉这个CvMemStorage类型了,《OpenCV入门指南》中很多文章都介绍过了。

第四个参数表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%

第五个参数表示构成检测目标的相邻矩形的最小个数(默认为3个)。如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上。

第六个参数要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域。

第七个,第八个参数表示检测窗口的最小值和最大值,一般设置为默认即可。

函数返回值:

函数将返回CvSeq对象,该对象包含一系列CvRect表示检测到的人脸矩形。

四.人脸识别示例代码

下面给出一个完整的示例代码,代码中的GetTickCount可以参阅《Windows 各种计时函数总结》,cvEqualizeHist可以参阅《【OpenCV入门指南】第八篇灰度直方图》。

[cpp] view plaincopy
  1. <pre class="cpp" name="code">// 编译前请配置好VS2008的编译环境
  2. // 详见《【OpenCV入门指南】第一篇 安装OpenCV》
  3. // 地址: http://blog.csdn.net/morewindows/article/details/8225783
  4. // 本文配套博客文章地址:
  5. // http://blog.csdn.net/morewindows/article/details/8426318
  6. // Haar特征检测 - 人脸识别
  7. //By MoreWindows (http://blog.csdn.net/MoreWindows)
  8. #include <opencv2/opencv.hpp>
  9. #include <cstdio>
  10. #include <cstdlib>
  11. #include <Windows.h>
  12. using namespace std;
  13. int main()
  14. {
  15. // 加载Haar特征检测分类器
  16. // haarcascade_frontalface_alt.xml系OpenCV自带的分类器 下面是我机器上的文件路径
  17. const char *pstrCascadeFileName = "G:\\OpenCV\\opencv\\data\\haarcascades\\haarcascade_frontalface_alt.xml";
  18. CvHaarClassifierCascade *pHaarCascade = NULL;
  19. pHaarCascade = (CvHaarClassifierCascade*)cvLoad(pstrCascadeFileName);
  20. // 载入图像
  21. const char *pstrImageName = "101.jpg";
  22. IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);
  23. IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
  24. cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);
  25. // 人脸识别与标记
  26. if (pHaarCascade != NULL)
  27. {
  28. CvScalar FaceCirclecolors[] =
  29. {
  30. {{0, 0, 255}},
  31. {{0, 128, 255}},
  32. {{0, 255, 255}},
  33. {{0, 255, 0}},
  34. {{255, 128, 0}},
  35. {{255, 255, 0}},
  36. {{255, 0, 0}},
  37. {{255, 0, 255}}
  38. };
  39. CvMemStorage *pcvMStorage = cvCreateMemStorage(0);
  40. cvClearMemStorage(pcvMStorage);
  41. // 识别
  42. DWORD dwTimeBegin, dwTimeEnd;
  43. dwTimeBegin = GetTickCount();
  44. CvSeq *pcvSeqFaces = cvHaarDetectObjects(pGrayImage, pHaarCascade, pcvMStorage);
  45. dwTimeEnd = GetTickCount();
  46. printf("人脸个数: %d   识别用时: %d ms\n", pcvSeqFaces->total, dwTimeEnd - dwTimeBegin);
  47. // 标记
  48. for(int i = 0; i <pcvSeqFaces->total; i++)
  49. {
  50. CvRect* r = (CvRect*)cvGetSeqElem(pcvSeqFaces, i);
  51. CvPoint center;
  52. int radius;
  53. center.x = cvRound((r->x + r->width * 0.5));
  54. center.y = cvRound((r->y + r->height * 0.5));
  55. radius = cvRound((r->width + r->height) * 0.25);
  56. cvCircle(pSrcImage, center, radius, FaceCirclecolors[i % 8], 2);
  57. }
  58. cvReleaseMemStorage(&pcvMStorage);
  59. }
  60. const char *pstrWindowsTitle = "人脸识别 (http://blog.csdn.net/MoreWindows)";
  61. cvNamedWindow(pstrWindowsTitle, CV_WINDOW_AUTOSIZE);
  62. cvShowImage(pstrWindowsTitle, pSrcImage);
  63. cvWaitKey(0);
  64. cvDestroyWindow(pstrWindowsTitle);
  65. cvReleaseImage(&pSrcImage);
  66. cvReleaseImage(&pGrayImage);
  67. return 0;
  68. }</pre><br>

五.人脸识别程序运行结果

运行结果一(单人正面):

这张图的干扰太少,换张干扰大点的图来试试。

运行结果二(单人侧面):

呵呵,左边那个人眼睛被挡住了,因此普通的人脸检测肯定难以识别的。

运行结果三(多人):

效果还不错。当然商业级产品的准确度,性能,效率肯定会比OpenCV自带的分类器高的多。

下一篇《【OpenCV入门指南】第十四篇  Haartraining》将介绍如何训练Haar特征分类器并简要介绍Haar特征检测的原理。欢迎继续浏览。

【OpenCV入门指南】第十三篇 人脸检测相关推荐

  1. 【OpenCV入门指南】第九篇 灰度直方图均衡化

    <OpenCV入门指南>系列文章地址: http://blog.csdn.net/morewindows/article/category/1291764 转载请标明出处,原文地址:htt ...

  2. 【OpenCV入门指南】第十篇 彩色直方图均衡化

    上一篇<OpenCV第十篇灰度直方图均衡化>介绍了灰度图像的直方图均衡化,实际生活中,肯定还是彩色图像用的最多,因此本篇介绍对彩色图像进行直方图均衡化.这样可以让大家直方图均衡化对图像增强 ...

  3. 【OpenCV入门指南】第五篇轮廓检测 下

    上一篇<[OpenCV入门指南]第五篇轮廓检测上>介绍了cvFindContours函数和cvDrawContours函数,并作了一个简单的使用示范.本篇将展示一个实例,让大家对轮廓检测有 ...

  4. 【OpenCV入门指南】第五篇 轮廓检测 上

    <[OpenCV入门指南]第三篇Canny边缘检测>中介绍了边缘检测,本篇介绍轮廓检测,轮廓检测的原理通俗的说就是掏空内部点,比如原图中有3*3的矩形点.那么就可以将中间的那一点去掉. 在 ...

  5. 【OpenCV入门教程之十三】OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/26157633 作者:毛星云(浅墨) ...

  6. OpenCV C++案例实战十三《人脸打马赛克》

    OpenCV C++案例实战十三<人脸打马赛克> 前言 一.人脸检测 二.马赛克效果 三.效果显示 四.源码 总结 前言 本文将使用OpenCV C++ 对人脸部位打上马赛克.实现步骤其实 ...

  7. 九宫怎么排列和使用_广告视频配音剪映零基础入门教程第二十三篇:剪辑之九宫格教程...

    朋友圈最火九宫格视频你们知道是怎样制作的吗?我们常常在玩朋友圈的时候想用九宫格照片,但是你们有没有遇到这种情况,想玩九宫格却发现找不到那么多能用的照片,那这时候怎么办呢?玩腻了平常图片的发法,今天我们 ...

  8. 【OpenCV人脸识别入门教程之二】人脸检测

    本篇文章主要介绍了如何使用OpenCV实现人脸检测.本文不具体讲解人脸检测的原理,直接使用OpenCV实现. OpenCV版本:2.4.10:VS开发版本:VS2012. 一.OpenCV人脸检测 要 ...

  9. agx 安装ros opencv_史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门...

    一.Python OpenCV 入门 欢迎阅读系列教程,内容涵盖 OpenCV,它是一个图像和视频处理库,包含 C ++,C,Python 和 Java 的绑定. OpenCV 用于各种图像和视频分析 ...

最新文章

  1. datatables[columns] 中的详细参数
  2. input 只能输入数字
  3. 理解T-SQL: 脚本和批处理
  4. Android Sdk 国内镜像下载地址
  5. SpringAop @Pointcut(“@annotation“)\@Aspect练习
  6. xp系统 服务器访问账号,winxp系统下的网站出现访问的用户过多的解决办法
  7. c 初始化char**_C/C++内存模型
  8. java程序设计 论文_《JAVA程序设计》论文要求
  9. 常见的SQL面试题:经典50例
  10. html日期选择框源码,日期选择控件实例源码(带节假日)
  11. 服务器Raid数据恢复,磁盘阵列数据恢复,raid 5数据恢复算法原理
  12. 数据服务化——打通企业数据应用的最后一公里
  13. Java 实现打印超市小票
  14. 原型设计都有哪些好用的软件?
  15. 用友畅捷通T+遭受批量勒索攻击处置手册
  16. Information Gain 计算 python实现
  17. 虚继承的概念及其作用,虚继承与一般继承的区别
  18. 【第6章】MySQL函数
  19. 腾讯优测-优社区干货精选 | android开发在路上:少去踩坑,多走捷径(上)
  20. 拥有资源的多少并不重要,如果不懂得利用,永远是不够的

热门文章

  1. BLE进阶——链路层(1)
  2. jquery防止冒泡
  3. 太智能了!国内首批自动驾驶出租车即将在长沙上路!
  4. CentOS7编译安装nginx-1.8.1和编译参数
  5. 特征点的基本概念和如何找到它们
  6. 迭代与递归实现无限级分类
  7. iOS使用WSDL2ObjC工具调用Webservice接口
  8. Centos 76分布式lamp平台
  9. C++编程-预定义宏
  10. linux 设置网络