【转载】opencv实现人脸检测
全文转载自CSDN的博客(不知道怎么将CSDN的博客转到博客园,应该没这功能吧,所以直接复制全文了),转载地址如下
http://blog.csdn.net/lsq2902101015/article/details/47057081
本篇文章主要介绍了如何使用OpenCV实现人脸检测。本文不具体讲解人脸检测的原理,直接使用OpenCV实现。
OpenCV版本:2.4.10;VS开发版本:VS2012。
一、OpenCV人脸检测
要实现人脸识别功能,首先要进行人脸检测,判断出图片中人脸的位置,才能进行下一步的操作。
1、OpenCV人脸检测的方法
在OpenCV中主要使用了两种特征(即两种方法)进行人脸检测,Haar特征和LBP特征。
在OpenCV中,使用已经训练好的XML格式的分类器进行人脸检测。在OpenCV的安装目录下的sources文件夹里的data文件夹里可以看到下图所示的内容:
上图中文件夹的名字“haarcascades”、“hogcascades”和“lbpcascades”分别表示通过“haar”、“hog”和“lbp”三种不同的特征而训练出的分类器:即各文件夹里的文件。"haar"特征主要用于人脸检测,“hog”特征主要用于行人检测,“lbp”特征主要用于人脸识别。打开“haarcascades”文件夹,如下图所示
图中的XML文件即是我们人脸检测所需要的分类器文件。在实际使用中,推荐使用上图中被标记的“haarcascade_frontalface_alt2.xml”分类器文件,准确率和速度都比较好。
2、OpenCV中的人脸检测的类
在OpenCV中,使用类“CascadeClassifier”进行人脸检测
CascadeClassifier faceCascade; //实例化对象
所需要使用的函数:
faceCascade.load("../data/haarcascade_frontalface_alt2"); //加载分类器
faceCascade.detectMultiScale(imgGray, faces, 1.2, , , Size(, )); //多尺寸检测人脸
实现人脸检测主要依赖于detectMultiScale()函数,下面简单说一下函数参数的含义,先看函数原型:
- CV_WRAP virtual void detectMultiScale( const Mat& image,
- CV_OUT vector<Rect>& objects,
- double scaleFactor=1.1,
- int minNeighbors=3, int flags=0,
- Size minSize=Size(),
- Size maxSize=Size() );
各参数含义:
- const Mat& image: 需要被检测的图像(灰度图)
- vector<Rect>& objects: 保存被检测出的人脸位置坐标序列
- double scaleFactor: 每次图片缩放的比例
- int minNeighbors: 每一个人脸至少要检测到多少次才算是真的人脸
- int flags: 决定是缩放分类器来检测,还是缩放图像
- Size(): 表示人脸的最大最小尺寸
二、代码实现
1、检测图片中的人脸
//头文件
#include<opencv2/objdetect/objdetect.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp> using namespace cv; //人脸检测的类
CascadeClassifier faceCascade; int main()
{
faceCascade.load("../data/haarcascade_frontalface_alt2.xml"); //加载分类器,注意文件路径 Mat img = imread("../data/PrettyGirl.jpg");
Mat imgGray;
vector<Rect> faces; if(img.empty())
{
return ;
} if(img.channels() ==)
{
cvtColor(img, imgGray, CV_RGB2GRAY);
}
else
{
imgGray = img;
} faceCascade.detectMultiScale(imgGray, faces, 1.2, , , Size(, )); //检测人脸 if(faces.size()>)
{
for(int i =; i<faces.size(); i++)
{
rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height),
Scalar(, , ), , ); //框出人脸位置
}
} imshow("FacesOfPrettyGirl", img); waitKey();
return ;
}
结果如下图:
2、检测视频中的人脸
//头文件
#include<opencv2/objdetect/objdetect.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp> using namespace cv; //人脸检测的类
CascadeClassifier faceCascade; int main()
{
faceCascade.load("../data/haarcascade_frontalface_alt2.xml"); //加载分类器,注意文件路径 VideoCapture cap;
cap.open(); //打开摄像头
//cap.open("../data/test.avi"); //打开视频
Mat img, imgGray;
vector<Rect> faces;
int c = ; if(!cap.isOpened())
{
return ;
} while(c!=)
{
cap>>img;
if(img.channels() ==)
{
cvtColor(img, imgGray, CV_RGB2GRAY);
}
else
{
imgGray = img;
} faceCascade.detectMultiScale(imgGray, faces, 1.2, , , Size(, )); //检测人脸 if(faces.size()>)
{
for(int i =; i<faces.size(); i++)
{
rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height),
Scalar(, , ), , ); //框出人脸位置
}
} imshow("Camera", img);
c = waitKey();
}
return ;
}
在视频实时检测时,可能会出现卡顿,是因为检测人脸花费了过多的时间,这里代码只实现基本功能,并未优化。
【转载】opencv实现人脸检测的更多相关文章
- OpenCV实现人脸检测
OpenCV实现人脸检测(转载) 原文链接:https://www.cnblogs.com/mengdd/archive/2012/08/01/2619043.html 本文介绍最基本的用OpenC ...
- OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现
# OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-环 ...
- [转]让opencv输出人脸检测的得分(置信率)
转自:http://www.cnblogs.com/sciencefans/ 作者:sciencefans 最近项目略多,其中一个需要找出一些和脸比较像但是不是脸的负样本,想用opencv的人脸检测器 ...
- 让opencv输出人脸检测的得分(置信率)
最近项目略多,其中一个需要找出一些和脸比较像但是不是脸的负样本,想用opencv的人脸检测器检测到的错误脸作为这样的负样本. 但是国内(包括国外)居然几乎没有相关的资料如何输出detectMultiS ...
- 利用html5、websocket和opencv实现人脸检测
最近学习人脸识别相关的东西,在MFC下使用OpenCV做了一个简单的应用.训练需要较多的数据,windows应用程序终究还是不方便,于是想着做成CS模式:检测识别都放在服务器端,视频获取和显示都放在网 ...
- 基于OpenCv的人脸检测、识别系统学习制作笔记之三
1.在windows下编写人脸检测.识别系统.目前已完成:可利用摄像头提取图像,并将人脸检测出来,未进行识别. 2.在linux下进行编译在windows环境下已经能运行的代码. 为此进行了linux ...
- 基于OpenCv的人脸检测、识别系统学习制作笔记之一
基于OpenCv从视频文件到摄像头的人脸检测 在OpenCv中读取视频文件和读取摄像头的的视频流然后在放在一个窗口中显示结果其实是类似的一个实现过程. 先创建一个指向CvCapture结构的指针 Cv ...
- Python学习--使用dlib、opencv进行人脸检测标注
参考自https://www.pyimagesearch.com/2017/04/03/facial-landmarks-dlib-opencv-python/ 在原有基础上有一部分的修改(image ...
- OpenCV + Python 人脸检测
必备知识 Haar-like opencv api 读取图片 灰度转换 画图 显示图像 获取人脸识别训练数据 探测人脸 处理人脸探测的结果 实例 图片素材 人脸检测代码 人脸检测结果 总结 下午的时候 ...
随机推荐
- java第二次作业之一
package dama; public class person { private String name; private String sex; private int age; privat ...
- 去除桌面SVN问号
由于误操作,桌面文件全部带着问号. 找到一种比较方便的方法解决. 1.显示受保护文件.文件夹win7系统 - 随便打开一个文件夹 - 在菜单栏里点 工具 - 文件夹选项 - 查看 以下如图中选择 2 ...
- 5. Scala函数式编程的基础
5.1 函数式编程内容及介绍顺序说明 5.1.1 函数式编程内容 -函数式编程基础 函数定义/声明 函数运行机制 递归(难点,[最短路径,邮差问题,迷宫问题,回溯]) 过程 惰性函数和异常 -函数式编 ...
- CListCtrl颜色设置
动态改变listctrl 单元格背景及文字颜色 m_listshow.InsertColumn( 0, "ID", LVCFMT_LEFT, 40 );//插入列 m_listsh ...
- spark-sql jdbc操作mysql
SparkConf sparkConf = new SparkConf() .setMaster("local") .setAppName("MySqlTest" ...
- MongoDB - Indexes
#explain command pp db[:zips].find(:state => 'MD').explain #List all indexes: db[:zips].indexes.e ...
- webservice学习教程(一):理论
一. WebService到底是什么? webservice是一种跨平台,跨语言的规范,用于不同平台,不同语言开发的应用之间的交互 WebService是一个SOA(面向服务的编程)的架构,它是不依赖 ...
- Django系统
#Django系统 -环境 - python3.6 - django1.8 -参考资料 - [django中文教程](http://python.usyiyi.cn) - django架站的16堂课 ...
- Mybatis下的sql注入
以前只知道mybatis框架下,order by后面接的是列名是不能用#{},这样不起效果,只能用${},这样的话就可能产生sql注入.后来发现其实还有另外两种情况也是类似的: 1.order by ...
- “行业客户云原生最佳实践日” 亮相KubeCon上海
2018年11月13日至15日,由CNCF主办的KubeCon + CloudNativeCon将首次登陆中国上海,这是全球范围内规模最大的Kubernetes和云原生技术盛会. 唯一聚焦客户实践的分 ...