加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Opencv haarcascades文件的使用

(2017-06-10 13:50:46)
标签:

opencv

人脸检测

分类: 人脸识别
在搜索人脸检测的资料时,总是看到直接调用haarcascade_frontalface_alt.xml之类的文件,起初一直以为这个.xml是训练好的Harr分类器,后边查阅资料,才发现这是Opencv内训练好的人脸检测分类器,所在位置为
OpenCV安装位置\sources\data\haarcascades\,打开可以看到里边有22了此类的xml文件,可以对应自己所需直接调用。xml文件的名字能够直观的看出分类器的检测部分,如果不清楚可以网上查询,好多大牛都有讲解的。
在做物体检测时,使用Harr分类器,可以自己训练,也可以直接在网上搜索别人训练好的xml文件,能够更快捷的进行物体检测。

以下内容来自:http://control.blog.sina.com.cn/admin/article/article_edit.php?blog_id=844b767a0102wqm5 是对Opencv中人脸检测的haarcascades的具体使用方式

1、OpenCV人脸检测的方法


在OpenCV中主要使用了两种特征(即两种方法)进行人脸检测,Haar特征和LBP特征。

在OpenCV中,使用已经训练好的XML格式的分类器进行人脸检测。在OpenCV的安装目录下的sources文件夹里的data文件夹里可以看到下图所示的内容:

http://img.blog.csdn.net/20150928172223261?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEasthaarcascades文件的使用" />

上图中文件夹的名字“haarcascades”、“hogcascades”和“lbpcascades”分别表示通过“haar”、“hog”和“lbp”三种不同的特征而训练出的分类器:即各文件夹里的文件。"haar"特征主要用于人脸检测,“hog”特征主要用于行人检测,“lbp”特征主要用于人脸识别。打开“haarcascades”文件夹,如下图所示

http://img.blog.csdn.net/20150928173210789?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEasthaarcascades文件的使用" />

图中的XML文件即是我们人脸检测所需要的分类器文件。在实际使用中,推荐使用上图中被标记的“haarcascade_frontalface_alt2.xml”分类器文件,准确率和速度都比较好。


2、OpenCV中的人脸检测的类


在OpenCV中,使用类“CascadeClassifier”进行人脸检测


[cpp] view plain copy
 https://code.csdn.net/assets/ico_fork.svghaarcascades文件的使用" />
  1. CascadeClassifier faceCascade;   //实例化对象  

所需要使用的函数:

 

 

[cpp] view plain copy
 https://code.csdn.net/assets/ico_fork.svghaarcascades文件的使用" />
  1. faceCascade.load("../data/haarcascade_frontalface_alt2");  //加载分类器  
  2. faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));  //多尺寸检测人脸  

实现人脸检测主要依赖于detectMultiScale()函数,下面简单说一下函数参数的含义,先看函数原型:

 

[cpp] view plain copy
 https://code.csdn.net/assets/ico_fork.svghaarcascades文件的使用" />
  1. CV_WRAP virtual void detectMultiScale( const Mat& image,  
  2.                                    CV_OUT vector& objects,  
  3.                                    double scaleFactor=1.1,  
  4.                                    int minNeighbors=3, int flags=0,  
  5.                                    Size minSize=Size(),  
  6.                                    Size maxSize=Size() );  

各参数含义:

 

 

  • const Mat& image: 需要被检测的图像(灰度图)
  • vector& objects: 保存被检测出的人脸位置坐标序列
  • double scaleFactor: 每次图片缩放的比例
  • int minNeighbors: 每一个人脸至少要检测到多少次才算是真的人脸
  • int flags: 决定是缩放分类器来检测,还是缩放图像
  • Size(): 表示人脸的最大最小尺寸

 

 

二、代码实现


1、检测图片中的人脸


 

[cpp] view plain copy
 https://code.csdn.net/assets/ico_fork.svghaarcascades文件的使用" />
  1. //头文件  
  2. #include  
  3. #include  
  4. #include  
  5.   
  6. using namespace cv;  
  7.   
  8. //人脸检测的类  
  9. CascadeClassifier faceCascade;  
  10.   
  11. int main()  
  12.  
  13.     faceCascade.load("../data/haarcascade_frontalface_alt2.xml");   //加载分类器,注意文件路径  
  14.   
  15.     Mat img imread("../data/PrettyGirl.jpg");  
  16.     Mat imgGray;  
  17.     vector faces;  
  18.   
  19.     if(img.empty())  
  20.      
  21.       return 1;  
  22.      
  23.   
  24.     if(img.channels() ==3)  
  25.      
  26.        cvtColor(img, imgGray, CV_RGB2GRAY);  
  27.      
  28.     else  
  29.      
  30.        imgGray img;  
  31.      
  32.   
  33.     faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));   //检测人脸  
  34.   
  35.     if(faces.size()>0)  
  36.      
  37.        for(int =0; i
  38.         
  39.            rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x faces[i].width, faces[i].y faces[i].height),   
  40.                            Scalar(0, 255, 0), 1, 8);    //框出人脸位置  
  41.         
  42.      
  43.   
  44.     imshow("FacesOfPrettyGirl"img);  
  45.   
  46.     waitKey(0);  
  47.     return 0;  
  48.  

 

结果如下图:

http://img.blog.csdn.net/20150928182518398?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEasthaarcascades文件的使用" />


 


2、检测视频中的人脸


 

[cpp] view plain copy
 https://code.csdn.net/assets/ico_fork.svghaarcascades文件的使用" />
  1. //头文件  
  2. #include  
  3. #include  
  4. #include  
  5.   
  6. using namespace cv;  
  7.   
  8. //人脸检测的类  
  9. CascadeClassifier faceCascade;  
  10.   
  11. int main()  
  12.  
  13.     faceCascade.load("../data/haarcascade_frontalface_alt2.xml");   //加载分类器,注意文件路径  
  14.   
  15.     VideoCapture cap;    
  16.     cap.open(0);   //打开摄像头  
  17.     //cap.open("../data/test.avi");   //打开视频  
  18.     Mat img, imgGray;  
  19.     vector faces;  
  20.     int 0;  
  21.   
  22.     if(!cap.isOpened())  
  23.      
  24.       return 1;  
  25.      
  26.   
  27.     while(c!=27)  
  28.      
  29.         cap>>img;  
  30.        if(img.channels() ==3)  
  31.         
  32.           cvtColor(img, imgGray, CV_RGB2GRAY);  
  33.         
  34.        else  
  35.         
  36.           imgGray img;  
  37.         
  38.   
  39.        faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));   //检测人脸  
  40.   
  41.        if(faces.size()>0)  
  42.         
  43.           for(int =0; i
  44.            
  45.               rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x faces[i].width, faces[i].y faces[i].height),   
  46.                               Scalar(0, 255, 0), 1, 8);    //框出人脸位置  
  47.            
  48.         
  49.       
  50.        imshow("Camera"img);  
  51.        waitKey(1);  
  52.      
  53.     return 0;  
  54.  


 

在视频实时检测时,可能会出现卡顿,是因为检测人脸花费了过多的时间,这里代码只实现基本功能,并未优化。

本文完。





版权声明:本文为博主原创文章,未经博主允许不得转载。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有