赞
踩
/******************************************************************************************************************************************************************************************翻译:Mastering 请接着上一篇:OpenCV with Practical Computer Vision Projects(第8章)(一)继续阅读
欢迎转载!请注明出处
***********************************************************************************************************************************/
相比于人类可以通过比较脸部的不同来有效区分不同的人,基于Haar和LBP特征的检测器可以通过训练进而从大量的人脸图像中寻找出指定人脸,这些训练的信息一般存储在XML文件中,后面将会用到。对于分类器的训练,一般至少需要1000张正脸照和1000张非脸部的照片,比如树叶、车、文本之类的。训练的过程可能会很耗时,在一个双核电脑上,一般LBP分类器需要训练几个小时,而Haar分类器可能需要一周。幸运的是,OpenCV中已经包含了一些预先训练好的分类器供我们使用!我们可以选择Haar或LBP的,不同目标特征的分类器,去检测正脸、侧脸,眼睛、鼻子和嘴巴,我们仅需要根据需求加载不同的XML文件即可。
使用OpenCV执行人脸检测
上文已经提到,在OpenCV2.4之后,发行版中已经包含许多已经训练好的分类器,他们以XML文件形式存储,我们可以根据不同的意图选择不同的XML文件。下面的表格中列出了一些常用的XML文件:
扩展:目前最新的OpenCV2.4.9版本中的预分类器已经有好多了,他们处在文件目录D:\OpenCV-4.9\opencv\sources\data下:打开后里面有三个文件夹,分别为:haarcacsdes,LBPcacsdes和hogcacsdes。分别打开他们,你会看到如下的信息:(这段文字包括下面这幅图不是原文中的)
- <span style="font-size:18px;">CascadeClassifier faceDetector;
- faceDetector.load(faceCascadeFilename);</span>
这一步可以通过不同的文件名加载相应的Haar或LBP检测器,这里经常会犯的错误是文件的路径不对,进而加载失败,文件的路径不是绝对的,而是依赖你构建环境。
- Mat gray;
- if (img.channels() == 3)
- {
- cvtColor(img,gray,CV_BGR2GRAY);
- }
- else if (img.channels() == 4)
- {
- cvtColor(img,gray,CV_BGRA2GRAY);
- }
- else
- {
- gray = img;
- }
shrinking the camera image
- const int DETECTION_WIDTH = 320;
- Mat smallImg;
- float scale = img.cols/(float) DETECTION_WIDTH;
- if (img.cols>DETECTION_WIDTH)
- {
- int scaleHeight = cvRound(img.rows/scale);
- resize(img,smallImg,Size(DETECTION_WIDTH,scaleHeight));
- }
- else
- {
- smallImg = img;
- }
Histogram equalization
- Mat equalizedImg;
- equalizeHist(inputImg,equalizedImg);
- int flags = CASCADE_SCALE_IMAGE;
- Size minFeatureSize(20,20);
- float searchScaleFactor = 1.1f;
- int minNeighbors = 4;
- std::vector<Rect> faces;
- faceDetector.detectMultiScale(img,faces,searchScaleFactor,minNeighbors,flags,minFeatureSize);
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。