参考:http://blog.sina.com.cn/s/blog_593c85f20100ncnj.html

OpenCV的库中带有检测正面人脸的 Haar迭代算法Haar Cascade Face Detector (also known as the Viola-Jones method)。Shervin Emami在他的blog(http://www.shervinemami./introToOpenCV.html)中介绍了相关function的使用。他的检测代码教简单快速,但是没有提供直观的人脸检测后识别人脸的矩形框图,因此,下面结合他的程序加入检测后图像显示功能,可较为直观感受OpenCV带来的便捷。

如何新建一个工程和C++文件,已在《OpenCV入门一:安装配置(with VC++ 2008/2010 Express)》中介绍过,这里不再重复。建好所需的工程和C++文件后,按照下面几个步骤,课生成如图一所示的人脸检测图像:

步骤一:C++代码

新建faceDetector工程,任意取名其中包含的C++文件名,实用下列代码:

  1. #include <stdio.h> // For printf()
  2. #include <cv.h> // Main OpenCV library.
  3. #include <highgui.h> // OpenCV functions for files and graphical windows.
  4.  
  5. using namespace std;
  6. using namespace cv;
  7.  
  8. // Initialize a sub funcion using after main
  9. CvRect detectFaceInImage( IplImage *inputImg, CvHaarClassifierCascade* cascade);
  10.  
  11. int main(int argc, char* argv[])
  12. {
  13. CvPoint pt1, pt2; // For draw rectangle
  14. // Check the input is correct when call executable file
  15. if (argc != 2)
  16. {
  17. printf("Usage: faceDetector.exe <imagename>\n");
  18. exit(-1);
  19. }
  20.  
  21. char * imgName = argv[1]; // Copy the second input as the image name
  22. // Load image
  23. IplImage* inputImg = cvLoadImage(imgName, CV_LOAD_IMAGE_UNCHANGED);
  24. if (!inputImg) {
  25. printf("Error: Could not open the image file! \n");
  26. exit(-1);
  27. }
  28.  
  29. // Haar Cascade file, used for Face Detection.
  30. // Note: you could change this directory as your installed OpenCV2.1 location
  31. char *faceCascadeFilename = "C:/OpenCV2.1/data/haarcascades/haarcascade_frontalface_alt.xml";
  32. // Load the HaarCascade classifier for face detection.
  33. CvHaarClassifierCascade* faceCascade;
  34. faceCascade = (CvHaarClassifierCascade*)cvLoad(faceCascadeFilename, 0, 0, 0);
  35. if( !faceCascade ) {
  36. printf("Couldnt load Face detector '%s'\n", faceCascadeFilename);
  37. exit(-1);
  38. }
  39.  
  40. // Perform face detection on the input image, using the given Haar classifier
  41. CvRect faceRect = detectFaceInImage(inputImg, faceCascade);
  42. // Make sure a valid face was detected then draw the rect location.
  43. if (faceRect.width > 0)
  44. {
  45. printf("Detected a face at (%d,%d)!\n", faceRect.x, faceRect.y);
  46.  
  47. // Get the pointer of the face rectangle
  48. pt1.x = faceRect.x;
  49. pt2.x = faceRect.x + faceRect.width;
  50. pt1.y = faceRect.y;
  51. pt2.y = faceRect.y + faceRect.height;
  52.  
  53. // Draw the rectangle in the input image
  54. cvRectangle( inputImg, pt1, pt2, CV_RGB(255,0,0), 2, 8, 0 );
  55.  
  56. // Show the detected face image on the screen.
  57. cvNamedWindow("Detected face", CV_WINDOW_AUTOSIZE);
  58. // Show the image in the window named "Detected face", you could change as you like
  59. cvShowImage( "Detected face", inputImg );
  60.  
  61. // Wait for the user to press something on the graphical window.
  62. // Note: cvWaitKey() is needed for time to draw on the screen.
  63. cvWaitKey(0);
  64.  
  65. // Free the resources.
  66. cvDestroyWindow("Detected face");
  67. cvReleaseImage( &inputImg );
  68. }
  69.  
  70. // Free the Face Detector resources when the program is finished
  71. cvReleaseHaarClassifierCascade( &faceCascade );
  72. return 0;
  73. }
  74.  
  75. // Perform face detection on the input image, using the given Haar Cascade.
  76. // Returns a rectangle for the detected region in the given image.
  77. CvRect detectFaceInImage(IplImage *inputImg, CvHaarClassifierCascade* cascade)
  78. {
  79. // Smallest face size.
  80. CvSize minFeatureSize = cvSize(20, 20);
  81. // Only search for 1 face.
  82. int flags = CV_HAAR_FIND_BIGGEST_OBJECT | CV_HAAR_DO_ROUGH_SEARCH;
  83. // How detailed should the search be.
  84. float search_scale_factor = 1.1f;
  85. IplImage *detectImg;
  86. IplImage *greyImg = 0;
  87. CvMemStorage* storage;
  88. CvRect rc;
  89. //double t;
  90. CvSeq* rects;
  91. CvSize size;
  92. int nFaces;
  93. //int i, ms;
  94. storage = cvCreateMemStorage(0);
  95. cvClearMemStorage( storage );
  96.  
  97. // If the image is color, use a greyscale copy of the image.
  98. detectImg = (IplImage*)inputImg;
  99. if (inputImg->nChannels > 1) {
  100. size = cvSize(inputImg->width, inputImg->height);
  101. greyImg = cvCreateImage(size, IPL_DEPTH_8U, 1 );
  102. cvCvtColor( inputImg, greyImg, CV_BGR2GRAY );
  103. detectImg = greyImg; // Use the greyscale image.
  104. }
  105.  
  106. // Detect all the faces in the greyscale image.
  107. //t = (double)cvGetTickCount();
  108. rects = cvHaarDetectObjects( detectImg, cascade, storage,
  109. search_scale_factor, 3, flags, minFeatureSize);
  110. //t = (double)cvGetTickCount() - t;
  111. //ms = cvRound( t / ((double)cvGetTickFrequency() * 1000.0) );
  112. nFaces = rects->total;
  113. //printf("Face Detection took %d ms and found %d objects\n", ms, nFaces);
  114. // Get the first detected face (the biggest).
  115. if (nFaces > 0)
  116. rc = *(CvRect*)cvGetSeqElem( rects, 0 );
  117. else
  118. rc = cvRect(-1,-1,-1,-1); // Couldn't find the face.
  119.  
  120. if (greyImg)
  121. {
  122. cvReleaseImage( &greyImg );
  123. }
  124. cvReleaseMemStorage( &storage );
  125. return rc; // Return the biggest face found, or (-1,-1,-1,-1).
  126. }

步骤二:编译(只是编译 ,这一步还看不到图片)

如果编译出错,比如找不到cv打头的function(比如CvHaarClassifierCascade等),或者找不到头文件、资源文件等,都有可能是工程配置不对。请参考之前提到的配置文章查看自己的配置。

Debug之后,在此新建工程中Debug文件夹里找到可执行文件。如果你新建的工程名是faceDetector,无论你的C++文件名是什么,debug之后可执行文件的名字都是faceDetector.exe。

步骤三:调用可执行文件

Start -> Run 在输入框中输入 cmd 然后回车,出现dos命令行窗口。

按图二所示,输入faceDetector工程Debug文件夹的地址,输入 “可执行文件名(红色框内)图片名”,然后回车,就会得到检测出人脸的图像(图一)以及图中矩形框左上角的其实坐标。

 

注意: 需要依赖的lib库如下 项目/属性/连接器

opencv_core247d.lib
opencv_highgui247d.lib
opencv_imgproc247d.lib
opencv_features2d247d.lib
opencv_calib3d247d.lib
opencv_objdetect247d.lib

vs2012+opencv2.4.7 实现单张人脸识别的更多相关文章

  1. OpenCV-2.4.6-android-sdk 人脸识别demo搭建

    最近项目需要研究下人脸识别,在领导推荐下准备研究OpenCV 一,上官网了解下 基本知识 http://docs.opencv.org/doc/tutorials/introduction/andro ...

  2. 基于OpenCV读取摄像头进行人脸检测和人脸识别

    前段时间使用OpenCV的库函数实现了人脸检测和人脸识别,笔者的实验环境为VS2010+OpenCV2.4.4,opencv的环境配置网上有很多,不再赘述.检测的代码网上很多,记不清楚从哪儿copy的 ...

  3. OpenCV人脸识别Eigen算法源码分析

    1 理论基础 学习Eigen人脸识别算法需要了解一下它用到的几个理论基础,现总结如下: 1.1 协方差矩阵 首先需要了解一下公式: 共公式可以看出:均值描述的是样本集合的平均值,而标准差描述的则是样本 ...

  4. OpenCV人脸识别LBPH算法源码分析

    1 背景及理论基础 人脸识别是指将一个需要识别的人脸和人脸库中的某个人脸对应起来(类似于指纹识别),目的是完成识别功能,该术语需要和人脸检测进行区分,人脸检测是在一张图片中把人脸定位出来,完成的是搜寻 ...

  5. Opencv摄像头实时人脸识别

    Introduction 网上存在很多人脸识别的文章,这篇文章是我的一个作业,重在通过摄像头实时采集人脸信息,进行人脸检测和人脸识别,并将识别结果显示在左上角. 利用 OpenCV 实现一个实时的人脸 ...

  6. OpenCV摄像头人脸识别

    注: 从外设摄像装置中获取图像帧,把每帧的图片与人脸特征进行匹配,用方框框住识别出来的人脸 需要用到的函数: CvHaarClassifierCascade* cvLoadHaarClassifier ...

  7. 基于OpenCV的人脸识别[iOS开发笔记(2)]

    开始了OpenCV的试水工作了... 1.Get ready 在OpenCV中我们会使用函数cv::CascadeClassifier 来进行人脸检测.但是在使用本函数之前我们需要添加一个XML文件对 ...

  8. 转:基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴等)【模式识别中的翘楚】

    文章来自于:http://blog.renren.com/share/246648717/8171467499 基于开源项目OpenCV的人脸识别Demo版整理(不仅可以识别人脸,还可以识别眼睛鼻子嘴 ...

  9. AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图

    原地址:http://blog.csdn.net/watkinsong/article/details/7631241 目前因为做人脸识别的一个小项目,用到了AdaBoost的人脸识别算法,因为在网上 ...

随机推荐

  1. 面试之SQL

    1. 查询性能优化:从数据库查询数据时,你一定遇到过查询很慢的情况,请问你是怎么处理的. 答: 遇到的问题描述:是遇到过这种情况,我们给客户做过一款软件,日志库搜集了6000万条数据,显示.查询时候慢 ...

  2. JavaScript高级程序设计(第三版)学习笔记11、12、17章

    章, DOM扩展 选择符 API Selector API Level1核心方法querySelector .querySelectorAll,兼容的浏览器可以使用 Document,Element  ...

  3. 【转】oracle的substr函数的用法

    [转]oracle的substr函数的用法 )     would return 'The' ) value from dual

  4. 第三章 jQuery中的DOM操作

    DOM(Document Object Model)文档对象模型,每张网页都能用DOM表示出来,每一份DOM都能看成一颗DOM树. jQuery继承了JavaScript对DOM对象操作的特性,使开发 ...

  5. 仿php的日期函数,asp时间处理函数

    <% '****************************** '时间处理函数 'FormatDate(Str,DateTime) 'Str 字符串,DateTime 时间 '返回类型为字 ...

  6. Microsoft JScript 运行时错误: Sys.WebForms.PageRequestManagerParserErrorException无法分析从服务器收到的消息。之所以出现此错误,

    Microsoft JScript 运行时错误: Sys.WebForms.PageRequestManagerParserErrorException: 无法分析从服务器收到的消息.之所以出现此错误 ...

  7. 安装Numpy和matplotlib

    (1)测试程序     这是我从网上(http://www.open-open.com/lib/view/open1393488232380.html)找到的一个使用Numpy和matplotlib的 ...

  8. Android屏幕保持唤醒状态

    我们程序偶尔会有需要屏幕一直或较长时间的保持唤醒状态,而用户的睡眠时间又设置的比较短.这时可能会对程序以及用户的使用造成一定的影响.在Android中有两种方法,可以让我们在我们需要保持唤醒的页面长时 ...

  9. Hibernate+struts+JqueryAjax+jSON实现无刷新三级联动

    看网上JqueryAjax三级联动的例子讲不是很全,代码也给的不是很全,给初学者带来一定的难度.小弟自己写了一个,可能有些地方不是很好,希望大家能够提出建议. 用的是Hibernate+struts2 ...

  10. HW--字符串加解密

    package t0817; import java.util.Scanner; public class StringEncrypt { public static void main(String ...