OpenCV支持的目标检测的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification)。OpenCV2之后的C++接口除了Haar特征以外也可以使用LBP特征。
介绍haar分类器理论知识:
1、http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html(讲的很详细);
2、http://blog.csdn.net/zy1034092330/article/details/48850437(基础理论)
实际使用中原理只要大概懂就行了,如果想深究,可以读读两个链接中的博文。
使用OpenCV中自带的haar分类器识别人脸,其文件在OpenCV安装文件夹如下路径中:

haarcascade_frontalface_alt.xml文件复制到工程根目录下即可。

代码:

#include <opencv2/opencv.hpp>
#include <iostream>using namespace std;
using namespace cv;//String my_face_cascade_name = "my_haarcasade_face.xml";
String face_cascade_name = "haarcascade_frontalface_alt.xml";
CascadeClassifier face_cascade;
String window_name = "Capture - face detection";void detectFace(Mat frame);int main()
{VideoCapture capture;Mat frame;//检测是否成功读取人脸的haar分类器,就是那个xml文件if (!face_cascade.load(my_face_cascade_name)){cout << "Error: cannot load face casade!!!" << endl;return -1;}capture.open(0);//打开摄像头//检测摄像头是否成功打开if (!capture.isOpened()){cout << "Error: cannot open the camera!!!" << endl;return -1;}namedWindow(window_name);//创建窗口while (true){capture >> frame;   //从摄像头读入一帧图像detectFace(frame);//对那帧图像进行处理,识别人脸//等待按键,若按下esc键,则退出循环int c = waitKey(10);if (c == 0x1B)break;}return 0;
}//从输入图像中检测人脸
void detectFace(Mat frame)
{Mat frame_gray;vector<Rect> face;cvtColor(frame, frame_gray, COLOR_BGR2GRAY);//转成灰度图像equalizeHist(frame_gray, frame_gray);//直方图均衡化//按照文档说明调用函数即可face_cascade.detectMultiScale(frame_gray, face, 1.1, 2, CASCADE_SCALE_IMAGE, Size(30, 30));//遍历所有人脸for (size_t i = 0; i < face.size(); i++){//根据返回的Rect的x坐标、y坐标、宽width和高height算出中心位置Point center(face[i].x + face[i].width/2, face[i].y + face[i].height/2);//调用ellipse画出椭圆型边框,指示人脸ellipse(frame, center, Size(face[i].width/2, face[i].height/2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);}//最后刷新窗口,显示图像imshow(window_name, frame);
}

程序中已经有相关注释,不做赘述。只要环境配置正确,OpenCV2下运行应该不会有错。
简要总结一下CascadeClassifier::detectMultiScale函数的用法:
从文档中摘出来的三种c++下的定义方式:

CascadeClassifier::detectMultiScale
Detects objects of different sizes in the input image. The detected objects are returned as a list of rectangles.

C++: void CascadeClassifier::detectMultiScale(InputArray image, vector& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())

C++: void CascadeClassifier::detectMultiScale(InputArray image, vector& objects, vector& numDetections, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())

C++: void CascadeClassifier::detectMultiScale(InputArray image, std::vector& objects, std::vector& rejectLevels, std::vector& levelWeights, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size(), bool outputRejectLevels=false )

只讨论下面这种形式:

C++: void CascadeClassifier::detectMultiScale(InputArray image,
vector& objects, double scaleFactor=1.1, int minNeighbors=3, int
flags=0, Size minSize=Size(), Size maxSize=Size())

参数说明:
1、InputArray image:
输入图像,填Mat类型的图像即可。图像通道数可以是任意的,但图像深度应为CV_8U、CV_16U、CV_16S、CV_32F、CV_64F;

2、std::vector& objects:
为被检测物体的矩形向量组,这里就代表人脸所在范围的矩形向量组;

3、double scaleFactor=1.1:
scaleFactor为图像中的尺度参数,默认取值1.1;

4、int minNeighbors=3:
每一个级联矩形应该保留的邻近个数的最小值,默认为3;

5、int flags=0:
在老版本的OpenCV中,与cvHaarDetectObjects中的这个参数具有相同的含义,新版本中没用,默认取0;

6、Size minSize=Size():
物体的最小大小,指定其大小的最小值,所有小于此的都被忽视掉;

7、Size maxSize=Size():
物体的最大大小,指定其大小的最大值,所有大于此的都被忽视掉;

OpenCV学习记录(一):使用haar分类器进行人脸识别相关推荐

  1. OpenCV学习记录之视频中的火焰检测识别

    主要完成两个视频中火焰的检测,主要结合RGB判据和HIS判据,设定合适的阈值条件,检测出火焰对应像素的区域,将原图二值化,经过中值滤波以及数学形态学的膨胀运算等图像处理,消除一些噪声及离散点,连通一些 ...

  2. OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别

    上一篇文章中介绍了如何使用OpenCV自带的haar分类器进行人脸识别(点我打开). 这次我试着自己去训练一个haar分类器,前后花了两天,最后总算是训练完了.不过效果并不是特别理想,由于我是在自己的 ...

  3. OpenCV实战5: LBP级联分类器实现人脸检测

    OpenCV中的HAAR与LBP数据 HAAR特征数据   参看 haarcascade_frontalface_alt.xml 各标签     LBP特征数据     参看 lbpcascade_f ...

  4. 9月10日OpenCV学习笔记——Mask、彩色直方图、人脸检测

    文章目录 前言 一.Mask 二.彩色直方图 三.画出基本图形 四.图片上显示文本 五.人脸检测 前言 本文为9月10日OpenCV学习笔记--Mask.彩色直方图.人脸检测,分为五个章节: Mask ...

  5. 人脸识别系统设计 -- 基于J2判据和FLDA的多分类器的人脸识别系统设计论文报告(三)(附matlab)

    目录 4 数据提取算法 4.1 数据提取目的 4.2 数据提取算法 5 交叉验证 5.1 交叉验证原理 A.交叉验证 B.交叉验证的用途 C.K-folds cross validation 5.2 ...

  6. 图像特征提取之Haar特征_人脸识别

    1.Haar-like特征 Haar-like特征最早是由Papageorgiou等应用于人脸表示,Viola和Jones在此基础上,使用3种类型4种形式的特征. Haar特征分为三类:边缘特征.线性 ...

  7. 【Opencv综合应用】自制训练集的人脸识别2——制作csv文件

    [Opencv综合应用]自制训练集的人脸识别2--制作csv文件 一,准备工作 环境 二,主要步骤 三,代码部分 四,结果 五,总结 一,准备工作 本文参考自: https://www.cnblogs ...

  8. 想了解直播系统开发美颜的原理,先来学习如何用1行代码实现人脸识别

    想了解直播系统开发美颜的原理,先来学习如何用1行代码实现人脸识别 环境搭建: 1. 安装 Ubuntu17.10 > 安装步骤在这里 2. 安装 Python2.7.14 (Ubuntu17.1 ...

  9. 基于Haar级联的人脸识别以及给人戴面具的操作

    基于Haar级联的人脸识别以及给人戴面具的操作 1.总体步骤 2.效果展示 3.完整代码及相关资源下载 1.总体步骤 载入人脸的haar特征(.xml文件) 载入面具 读取帧图像 利用detectMu ...

最新文章

  1. Pycharm 项目文件名变红色以及commit时文件错乱的原因及解决办法
  2. docker的文件流处理_Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken...
  3. TUST 数据库原理 试卷(A)
  4. JMF调用摄像头粉屏的问题(win10 64位系统)
  5. 步步深入MySQL:架构-gt;查询执行流程-gt;SQL解析顺序!
  6. 如何将树莓派设置为WiFi热点
  7. 点4下还是点1下?使用jQuery启动一个SharePoint工作流
  8. 2021年了,Transformer有可能替代CNN吗?未来有哪些研究方向?
  9. matlab画图入门教程
  10. 男孩子不上学了学计算机要学历吗,十三岁男孩不上学,能学什么手艺?
  11. ws协议绑定服务器域名,Websocket直接域名连接
  12. 猫(Modem)和路由器有什么区别?
  13. 无利不起早:理性看待IBM倾“芯”中国
  14. 关于CSS Reset 那些事(一)之 历史演变与Normalize.css
  15. 泛函分析之集合的映射和可数集与不可数集
  16. Web前端——JavaScript 的基础总结
  17. 纽约州推出“被遗忘权”提案 用户或能要求将个人隐私信息从搜索结果中移
  18. MIT公开课 线性代数(1)
  19. 批量缩小图片大小的方法
  20. Set集合的基本使用

热门文章

  1. 多线程共用全局变量可能存在的威胁
  2. 【自动驾驶】19.自动驾驶各个坐标系
  3. 淘宝大秒系统设计详解 | 许令波
  4. Java异常(一) Java异常简介及其架构
  5. LaTeX TeXworks编辑器插入.eps图片时,无法识别的扩展名eps
  6. 稀疏表示介绍(中)、(下)
  7. Hadoop pipes编程
  8. 正则表达式Regular Expression
  9. Hadoop教程(三):HDFS、MapReduce、程序入门实践
  10. Machine Learning week 4 quiz: programming assignment-Multi-class Classification and Neural Networks