OpenCV学习记录(一):使用haar分类器进行人脸识别 标签: opencv脸部识别c++ 2017-07-03 15:59 26人阅读
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分类器进行人脸识别 标签: opencv脸部识别c++ 2017-07-03 15:59 26人阅读的更多相关文章
- OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别 标签: 脸部识别opencv 2017-07-03 21:38 26人阅读
上一篇文章中介绍了如何使用OpenCV自带的haar分类器进行人脸识别(点我打开). 这次我试着自己去训练一个haar分类器,前后花了两天,最后总算是训练完了.不过效果并不是特别理想,由于我是在自己的 ...
- opencv学习之路(41)、人脸识别
一.人脸检测并采集个人图像 //take_photo.cpp #include<opencv2/opencv.hpp> using namespace cv; using namespac ...
- opencv学习之路(40)、人脸识别算法——EigenFace、FisherFace、LBPH
一.人脸识别算法之特征脸方法(Eigenface) 1.原理介绍及数据收集 特征脸方法主要是基于PCA降维实现. 详细介绍和主要思想可以参考 http://blog.csdn.net/u0100066 ...
- 利用opencv中的级联分类器进行人脸检測-opencv学习(1)
OpenCV支持的目标检測的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification).注意,新版本号的C++接口除了Haar特征以外 ...
- OpenCV学习笔记(一)安装及运行第一个OpenCV程序
1.下载及安装 OpenCV是一套开源免费的图形库,主要有C/C++语言编写,官网: http://opencv.org/ .在 http://opencv.org/downloads.html 可以 ...
- Opencv级联分类器实现人脸识别
在本章中,我们将学习如何使用OpenCV使用系统相机捕获帧.org.opencv.videoio包的VideoCapture类包含使用相机捕获视频的类和方法.让我们一步一步学习如何捕捉帧 - 第1步: ...
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图
原地址:http://blog.csdn.net/watkinsong/article/details/7631241 目前因为做人脸识别的一个小项目,用到了AdaBoost的人脸识别算法,因为在网上 ...
- opencv学习记录
#include<iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui ...
- OpenCV学习记录之摄像头调用
关于opencv调用摄像头的问题主要是因为摄像头的打开有延时.在显示图像前,要用if语句判断图像是否存在.(否则会报错) 具体的:教程里的源程序,将if条件句里,break去掉,并增加else语句. ...
随机推荐
- Linux命令 改变文档权限及所有者
Linux命令 改变文档权限及所有者 chgrp :改变档案所属群组 chown :改变档案拥有者 chmod :改变档案的权限, SUID, SGID, SBIT等等的特性 chgrp说明及范例 [ ...
- VS2017更新后无法使用stdlib.h
这几天用VS写代码,每次打开工程就卡死,在网上找不到解决方法,于是想更新下vs碰碰运气. 更新后,打开速度恢复往日那般,但是代码中,提示我找不到 stdlib.h. 于是在电脑中,搜寻stdlib.h ...
- 安装FreePBX
这个我自己装完以后发现freepbx页面虽然出来了,但是还有一些错误,所以这个我就放弃了,你们可以参考上面的安装freePBX的ISO版本,跟这个是一样的,不过要新建虚拟机的 1:更新系统 yum - ...
- 20181104_C#线程之Thread_ThreadPool_使用Thread实现回到和带参数的回调
C# .net Framework多线程演变路径: 1.0 1.1 时代使用Thread 2.0 时代使用ThreadPool 3.0 时代使用Task 4.0 时代使用 ...
- python学习(二十二) Python 中boolean
- 浅谈PHP面向对象编程(四、类常量和静态成员)
4.0 类常量和静态成员 通过上几篇博客我们了解到,类在实例化对象时,该对象中的成员只被当前对象所有.如果希望在类中定义的成员被所有实例共享. 此时可以使用类常量或静态成员来实现,接下来将针对类常量和 ...
- IO模型之IO多路复用 异步IO select poll epoll 的用法
IO 模型之 多路复用 IO 多路复用IO IO multiplexing 这个词可能有点陌生,但是如果我说 select/epoll ,大概就都能明白了.有些地方也称这种IO方式为 事件驱动IO ( ...
- thymeleaf layout
摘自:https://tomoya92.github.io/2017/03/09/thymeleaf-layout/ thymeleaf的layout常用的有两种方式用法 第一种将页面里的每个 ...
- UGUI 学习
1. Grid Layout Group(网格布局) Hierachy: Game: 属性和功能: 2. 根据鼠标位置旋转界面实现: public class TiltWindow : MonoBeh ...
- shell脚本里切换用户执行命令的注意事项
功能说明:用root用户执行一个脚本,脚本里需要切换到普通用户DT去执行其他命令,其中就用到了EOF,用法如下: #!/bin/bash su - DT<<EOF cd apache-to ...