在OpenCV中,自带着Harr分类器人脸特征训练的文件,利用这些文件,我们可以很方面的进行人脸,眼睛,鼻子,表情等的检测。

     人脸特征文件目录: ../opencv2.46/opencv/data/haarcascades

人脸检测Harr分类器的介绍:http://www.cnblogs.com/mikewolf2002/p/3437883.html

分类器的训练步骤:http://note.sonots.com/SciSoftware/haartraining.html

本文中,我们通过代码了解一下在OpenCV中如何通过harr分类器进行人脸特征检测。

#include <opencv2/core/core.hpp>
#include <opencv2/highgui//highgui.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <string>
#include <vector>
using namespace std; int main()
{ cv::CascadeClassifier mFaceDetector;
cv::CascadeClassifier mEyeDetector;
cv::CascadeClassifier mMouthDetector;
cv::CascadeClassifier mNoseDetector;
//载入四个人脸特征分类器文件,可以从opencv的安装目录中找到
if( mFaceDetector.empty() )
mFaceDetector.load( "haarcascade_frontalface_default.xml" );
if( mEyeDetector.empty() )
mEyeDetector.load( "haarcascade_mcs_eyepair_big.xml" );
if( mNoseDetector.empty() )
mNoseDetector.load("haarcascade_mcs_nose.xml" );
if( mMouthDetector.empty() )
mMouthDetector.load( "haarcascade_mcs_mouth.xml" ); //打开视频文件
//cv::VideoCapture capture("bike.avi");
//0 open default camera
cv::VideoCapture capture(0);
//检查视频是否打开
if(!capture.isOpened())
return 1; // 得到帧率
double rate= capture.get(CV_CAP_PROP_FPS);
bool stop(false);
cv::Mat frame; // 现在的视频帧
cv::Mat mElabImage;//备份frame图像 cv::namedWindow("Extracted Frame"); // 两帧之间的间隔时间
int delay= 1000/rate;
// 循环播放所有的帧
while (!stop) {
// 读下一帧
if (!capture.read(frame))
break;
frame.copyTo( mElabImage );
//检测脸
//缩放因子
float scaleFactor = 3.0f;
vector< cv::Rect > faceVec;
mFaceDetector.detectMultiScale( frame, faceVec, scaleFactor );
int i, j;
for( i=0; i<faceVec.size(); i++ )
{
cv::rectangle( mElabImage, faceVec[i], CV_RGB(255,0,0), 2 );
cv::Mat face = frame( faceVec[i] );
//检测眼睛
vector< cv::Rect > eyeVec;
mEyeDetector.detectMultiScale( face, eyeVec ); for( j=0; j<eyeVec.size(); j++ )
{
cv::Rect rect = eyeVec[j];
rect.x += faceVec[i].x;
rect.y += faceVec[i].y; cv::rectangle( mElabImage, rect, CV_RGB(0,255,0), 2 );
}
//检测鼻子
vector< cv::Rect > noseVec; mNoseDetector.detectMultiScale( face, noseVec, 3 ); for( j=0; j<noseVec.size(); j++ )
{
cv::Rect rect = noseVec[j];
rect.x += faceVec[i].x;
rect.y += faceVec[i].y; cv::rectangle( mElabImage, rect, CV_RGB(0,0,255), 2 );
} //检测嘴巴
vector< cv::Rect > mouthVec;
cv::Rect halfRect = faceVec[i];
halfRect.height /= 2;
halfRect.y += halfRect.height; cv::Mat halfFace = frame( halfRect ); mMouthDetector.detectMultiScale( halfFace, mouthVec, 3 ); for( j=0; j<mouthVec.size(); j++ )
{
cv::Rect rect = mouthVec[j];
rect.x += halfRect.x;
rect.y += halfRect.y; cv::rectangle( mElabImage, rect, CV_RGB(255,255,255), 2 );
}
} //在窗口中显示图像
cv::imshow("Extracted Frame",mElabImage);
// 按任意键停止视频播放
//if (cv::waitKey(delay)>=0)
// stop= true;
cv::waitKey(20);
}
// 关闭视频文件
capture.release();
return 0;
}

程序运行效果:

 

代码文件:工程FirstOpenCV36

OpenCV教程(41) 人脸特征检测的更多相关文章

  1. OpenCV教程(46) 快速特征检测

        在计算harris特征角时候,我们要在两个方向计算梯度,计算代价有点大.在paper The article by E. Rosten and T. Drummond, Machine lea ...

  2. OpenCV实战:人脸关键点检测(FaceMark)

    Summary:利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Author:    Amusi Date:       2018-03-20 ...

  3. OpenCV 和 Dlib 人脸识别基础

    00 环境配置 Anaconda 安装 1 下载 https://repo.anaconda.com/archive/ 考虑到兼容性问题,推荐下载Anaconda3-5.2.0版本. 2 安装 3 测 ...

  4. OpenCV入门指南----人脸检测

    本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测(人脸识别).人脸检测可以说是学术界的宠儿,在不少EI,SCI高级别论文都能看到它的身影.甚至很多高校学生的毕业设计都会涉及到人脸检测.当然人脸 ...

  5. opencv 美白磨皮人脸检测<转>

    1. 简介 这学期的计算机视觉课,我们组的课程项目为“照片自动美化”,其中我负责的模块为人脸检测与自动磨皮.功能为:用户上传一张照片,自动检测并定位出照片中的人脸,将照片中所有的人脸进行“磨皮”处理, ...

  6. 使用face_recognition进行人脸特征检测

    效果图调用face_recognition.face_landmarks()方法即可得到人脸特征点, 返回一个字典, 下图是返回的数据, 包括chin(下巴), left_eye(左眼)等.我画了两种 ...

  7. XCode6.3上使用opencv教程(MacOSX 10.10)

    OpenCV 是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Pyth ...

  8. OpenCV例程实现人脸检测

    前段时间看的OpenCV,其实有很多的例子程序,参考代码值得我们学习,对图像特征提取三大法宝:HOG特征,LBP特征,Haar特征有一定了解后. 对本文中的例子程序刚开始没有调通,今晚上调通了,试了试 ...

  9. 写个神经网络,让她认得我`(๑•ᴗ•๑)(Tensorflow,opencv,dlib,cnn,人脸识别)

    训练一个神经网络 能让她认得我 阅读原文 这段时间正在学习tensorflow的卷积神经网络部分,为了对卷积神经网络能够有一个更深的了解,自己动手实现一个例程是比较好的方式,所以就选了一个这样比较有点 ...

随机推荐

  1. ODBC在注册表中的位置

    增加一个oracle的odbc regedit打开注册表 64位 :HKEY_LOCAL_MACHINE -> SOFTWARE -> 32位: HKEY_LOCAL_MACHINE -& ...

  2. 调整linux系统时区

    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 好吧,使用tzselect又靠谱些,使用前把/etc/localtime删除了.     执行上 ...

  3. install vscode on centos

    1.down load package from https://code.visualstudio.com/docs/?dv=linux64 2.tar zxf code-stable-code_1 ...

  4. HP电脑的增霸卡功能操作详解

    机房管理中HP电脑的增霸卡功能操作详解 一.软件去除保护 1).电脑开机后等待进入增霸卡选择系统界面: 2).按F1帮助,F10进入增霸卡BIOS界面: 3).光标切换到>>>系统还 ...

  5. CentOS查看内核版本、系统版本、系统位数

    http://blog.51cto.com/ultrasql/1640435

  6. JFinal 3.3 入门学习 -- Hello JFinal World.

    资源准备 jar包下载:http://www.jfinal.com/download/?file=jfinal-3.3-all.zip 下载完成后需要用到的jar包: 将 jfinal-3.3-bin ...

  7. [转]kali中eth0网卡突然消失解决方案

    前言 不知道怎么kali的eth0网卡突然消失了.这可有点难受啊.在网上查找了一番找到了解决办法,特此记录. 问题   怎么办? 解决办法 首先使用ifconfig -a命令查看所有的网卡接口  发现 ...

  8. 网络抓包及Http Https通信协议分析

    Wireshark基本介绍和学习TCP三次握手 之前写过一篇博客:用 Fiddler 来调试HTTP,HTTPS. 这篇文章介绍另一个好用的抓包工具wireshark, 用来获取网络数据封包,包括ht ...

  9. Codeforces Round #243 (Div. 1)A. Sereja and Swaps 暴力

    A. Sereja and Swaps time limit per test 1 second memory limit per test 256 megabytes input standard ...

  10. spring---transaction(6)---事务的配置

    1 写在前面 上一篇我们了解到spring的事务的体系.这里我们将结合上篇讲spring事务的配置 2 Spring的三种事务配置形式 2.1 使用TransactionProxyFactoryBea ...