/******************************************************************************************************************************************************************************************翻译: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);
detecting the face
- minFeatureSize:这个参数决定了我们检测的人脸的最小尺寸,一般我们会设定为20×20或者30×30,当然这个值需要根据你使用的图像的尺寸来决定,如果你使用的是手机摄像头或是电脑的摄像头,这些情况下脸部一般距离摄像头较近,你可以将最小尺寸设定为80×80,这样做会大大提高检测速度。但如果你想检测距离摄像头很远的脸部,比如沙滩上的朋友,那么你需要将这个尺寸设定为20×20.
- searchScaleFactor:这个参数决定了可以检测多有多少不同尺寸的脸部,一般将其设定为1.1。如果想让检测速度快些,可以设定为1.2,但是可能会有一些脸部会漏检。
- minNeighbors:这个参数表示检测器对检测到的人脸的把握,一般我们设定为3,但是如果你想要更可靠的检测结果,你可以适当增大这个参数,当然有可能会有很多脸部将检测不到。
- flags:这个参数是让你选择搜索方式,比如是否搜索所有的脸部(这是默认模式),或者仅搜索最大的脸部(CASCADE_FIND_BIGGEST_OBJECT)。如果仅搜索最大的脸部,检测速度回很快。还有一些其他参数可以使用,他们可以使得检测速度提升一到两成,比如CASCADE_DO_ROUGH_SEARCH或者CASCADE_SCALE_IMAGE。
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);
原来翻译文章写博客这么费劲啊......唉,还有好多,今天先翻到这,,