基于Haar分类器的OpenCV人脸检测实例
来源:互联网 发布:水泥产能过剩数据 编辑:程序博客网 时间:2024/06/02 04:28
一.人脸的Haar特征分类器是什么
人脸的Haar特征分类器就是一个XML文件,该文件中会描述人脸的Haar特征值。当然Haar特征的用途可不止可以用来描述人脸这一种,用来描述眼睛,嘴唇或是其它物体也是可以的。
二.在哪找人脸的Haar特征分类器
OpenCV有已经自带了人脸的Haar特征分类器。OpenCV安装目录中的\data\ haarcascades目录下的haarcascade_frontalface_alt.xml与haarcascade_frontalface_alt2.xml都是用来检测人脸的Haar分类器。这个haarcascades目录下还有人的全身,眼睛,嘴唇的Haar分类器。读者可以仿照本方的例子来试验下效果看看。
三.怎么用人脸的Haar特征分类器
使用人脸的Haar特征分类器非常之简单,直接使用cvHaarDetectObjects。下面来看看这个函数的介绍:
函数功能:检测图像中的目录
函数原型:
CVAPI(CvSeq*) cvHaarDetectObjects(
const CvArr* image,
CvHaarClassifierCascade* cascade,
CvMemStorage* storage,
double scale_factor CV_DEFAULT(1.1),
int min_neighbors CV_DEFAULT(3),
int flags CV_DEFAULT(0),
CvSize min_size CV_DEFAULT(cvSize(0,0)),
CvSize max_size CV_DEFAULT(cvSize(0,0))
);
函数说明:
第一个参数表示输入图像,尽量使用灰度图以加快检测速度。
第二个参数表示Haar特征分类器,可以用cvLoad()函数来从磁盘中加载xml文件作为Haar特征分类器。
第三个参数为CvMemStorage类型,大家应该很熟悉这个CvMemStorage类型了,《OpenCV入门指南》中很多文章都介绍过了。
第四个参数表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%
第五个参数表示构成检测目标的相邻矩形的最小个数(默认为3个)。如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上。
第六个参数要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域。
第七个,第八个参数表示检测窗口的最小值和最大值,一般设置为默认即可。
函数返回值:
函数将返回CvSeq对象,该对象包含一系列CvRect表示检测到的人脸矩形。
四.人脸检测示例代码
// 基于Haar分类器的OpenCV人脸检测实例 #include <opencv2/opencv.hpp> #include <cstdio> #include <cstdlib> #include <Windows.h> using namespace std;int main(){// 加载Haar特征检测分类器 // haarcascade_frontalface_alt.xml是OpenCV自带的分类器 CvHaarClassifierCascade *pHaarCascade;const char *pstrCascadeFileName = "F:\\Software\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml";pHaarCascade = (CvHaarClassifierCascade*)cvLoad(pstrCascadeFileName);// 加载图像 const char *pstrImageName = "J:\\faceImage\\318753-130PZZ44879.jpg";IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);// 转为灰度图像IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);// 人脸检测与标记 if (pHaarCascade != NULL){CvScalar FaceCirclecolors[] ={{ { 0, 0, 255 } },{ { 0, 128, 255 } },{ { 0, 255, 255 } },{ { 0, 255, 0 } },{ { 255, 128, 0 } },{ { 255, 255, 0 } },{ { 255, 0, 0 } },{ { 255, 0, 255 } }};CvMemStorage *pcvMStorage = cvCreateMemStorage(0);cvClearMemStorage(pcvMStorage);// 识别 DWORD dwTimeBegin, dwTimeEnd;dwTimeBegin = GetTickCount();//返回CvSeq对象,该对象包含一系列CvRect表示检测到的人脸矩形CvSeq *pcvSeqFaces = cvHaarDetectObjects(pGrayImage, pHaarCascade, pcvMStorage);dwTimeEnd = GetTickCount();printf("人脸个数: %d 识别用时: %d ms\n", pcvSeqFaces->total, dwTimeEnd - dwTimeBegin);// 标记 for (int i = 0; i <pcvSeqFaces->total; i++){CvRect* r = (CvRect*)cvGetSeqElem(pcvSeqFaces, i);CvPoint center;int radius;center.x = cvRound((r->x + r->width * 0.5));center.y = cvRound((r->y + r->height * 0.5));radius = cvRound((r->width + r->height) * 0.25);cvCircle(pSrcImage, center, radius, FaceCirclecolors[i % 8], 2);}cvReleaseMemStorage(&pcvMStorage);}const char *pstrWindowsTitle = "人脸识别";cvNamedWindow(pstrWindowsTitle, CV_WINDOW_AUTOSIZE);cvShowImage(pstrWindowsTitle, pSrcImage);cvWaitKey(0);cvDestroyWindow(pstrWindowsTitle);cvReleaseImage(&pSrcImage);cvReleaseImage(&pGrayImage);return 0;}
五.人脸检测程序运行结果
本文主要转载自:http://blog.csdn.net/MoreWindows/article/details/8426318
- 基于Haar分类器的OpenCV人脸检测实例
- OpenCV中基于Haar特征和级联分类器的人脸检测
- 【OpenCV】浅析人脸检测之Haar分类器方法
- OpenCV学习笔记:基于Haar特征的人脸检测
- 人脸检测——OpenCV的分类器的haar特征数据
- 【人脸检测】OpenCV中的Haar+Adaboost级联分类器分解(一):Haar特征介绍
- 用opencv自带的Haar分类器进行人脸检测(一)
- 用opencv自带的Haar分类器进行人脸检测(二)
- 基于Haar特征的Adaboost级联人脸检测分类器
- 基于Haar特征的Adaboost级联人脸检测分类器
- 照片美妆---基于Haar特征的Adaboost级联人脸检测分类器
- OpenCV:利用级联的haar分类器寻找检测目标
- 【OpenCV笔记 16-1】OpenCV人脸检测之Haar分类器
- 人脸检测之Haar分类器
- 人脸检测-Haar分类器方法
- 人脸检测之Haar分类器
- 人脸检测之Haar分类器
- 利用OpenCV的级联分类器类CascadeClassifier和Haar特征实现人脸区域的检测
- IntelliJ IDEA 激活方法
- [java源码] Java Web 文章管理系统(Jsp+Ajax+JDBC+MySql实现)
- ofo创始人戴威称共享单车日收入接近1000万
- android xml布局错误
- Linux常用的vi指令
- 基于Haar分类器的OpenCV人脸检测实例
- Android studio 相关资料
- MySQL 记录不存在时插入 记录存在则更新的实现方法
- spring jdbcTemplate
- iOSm界面跳转和参数传递之presentViewController与dismissViewControllerAnimated
- 动态代理和静态代理的区别
- Android 系统在程序中设置以太网的DHCP 和静态IP
- tomcat7的日志类型切换到log4j
- 数据库中的内连接、自然连接、外连接