前言

1.OpenCV官方训练好的人脸和眼睛的级联分类器,3.30的版本都放在opencv\sources\data这个文件夹下,在OpenCV这个文件夹中,主要有 Haar特征 和 LBP特征进行人脸检测,其中“lbpcascades”,“haarcascades”,“hogcascades”,这三个文件夹,分别放表示通过“haar”、“hog”和“lbp”三种不同的特征而训练出的分类器。"haar"特征主要用于人脸检测,“hog”特征主要用于行人检测,“lbp”特征主要用于人脸识别。
2.人脸检测用的“haarcascades”文件夹里有检测正脸的,检测眼睛的,检测嘴巴的,检测笑脸的等几种分类器,这里我只试了常用的人脸检测器和眼睛的检测器。
3.我用的是OpenCV3.30这个,IDE是vs2015,Win7 64位,boost库,其中boost是用来操作文件的,为了方便测试整个文件夹的图像,实现语言是C++。

一、资源准备

1.从网上下载带有人脸的图像和不带人脸的图像,图像大小没有什么要求,我这里是壁纸网站下载的美女壁纸,如下图:

2.找到自己安装的OpenCV的源码文件夹,在源码文件下有个Data的目录,打开目录下的haarcascades这个文件夹,可以看到里面有官方训练好的级联分类器。

二、代码实现

代码我这里封装了一个类,两个方法,一个用来检测人脸的,一个用来检测人脸和眼睛的,然后在main里调用。
1.类声明部分

#pragma once
#include <opencv2/opencv.hpp>
#include <opencv2\core\core.hpp>
#include <opencv\highgui.h>
#include <string>
//boost 库(读取文件)
#include<boost/filesystem.hpp>
//定义一个boost库的命名空间
namespace fs = boost::filesystem;
using namespace std;
using namespace cv;class FaceDetection
{
public:~FaceDetection();//人脸和眼睛的构造函数FaceDetection(string _image_path, string _face_path, string _eye_path);//检测人脸的方法void frontalFaceDetection();//检测人脸和眼睛的方法void faceAndeye();Mat eyeDetection(Mat image);Mat detection(Mat image);
private://人脸检测的分类器路径string face_path;//图像路径或存放图像的路径string image_path;//眼睛的分类器路径string eye_path;CascadeClassifier face_classifier;CascadeClassifier eye_cascader;
};

2.类的实现文件

#include "FaceDetection.h"FaceDetection::FaceDetection(string _image_path, string _face_path, string _eye_path)
{face_path = _face_path;//判断模型路径fs::path face_xml(face_path);if (!fs::exists(face_xml)){std::cout << "请转入正确的模型文件路径!" << std::endl;exit(0);}eye_path = _eye_path;//判断模型路径fs::path eye_xml(eye_path);if (!fs::exists(eye_xml)){std::cout << "请转入正确的模型文件路径!" << std::endl;exit(0);}image_path = _image_path;//判断图像路径fs::path src(image_path);if (!fs::exists(src)){std::cout << "传入的图像路径错误!" << std::endl;exit(0);}
}FaceDetection::~FaceDetection()
{
}void FaceDetection::frontalFaceDetection()
{//判断模型是否能打开if (!face_classifier.load(face_path)){std::cout << "模型文件无法读取!" << std::endl;exit(0);}//判断传入的是否是文件夹if (fs::is_directory(image_path)){fs::recursive_directory_iterator  begin_iter(image_path);fs::recursive_directory_iterator end_iter;for (; begin_iter != end_iter; ++begin_iter){string file_path = begin_iter->path().string();if (!fs::is_directory(file_path)){string image_path = begin_iter->path().string();Mat src = imread(image_path);if (!src.empty()){Mat src_image = imread(image_path);Mat image = detection(src_image);imshow("detect faces", image);waitKey(30);}}}}else{Mat src_image = imread(image_path);if(!src_image.empty()){Mat image = detection(src_image);imshow("detect faces", image);waitKey(30);}}
}void FaceDetection::faceAndeye()
{namedWindow("face_eye", CV_WINDOW_AUTOSIZE);if (fs::is_directory(image_path)){fs::recursive_directory_iterator  begin_iter(image_path);fs::recursive_directory_iterator end_iter;for (; begin_iter != end_iter; ++begin_iter){string file_path = begin_iter->path().string();if (!fs::is_directory(file_path)){string image_path = begin_iter->path().string();Mat src = imread(image_path);if (!src.empty()){Mat src_image = imread(image_path);Mat image = eyeDetection(src_image);imshow("face_eye", image);waitKey(30);}}}}else{Mat src_image = imread(image_path);if (!src_image.empty()){Mat image = eyeDetection(src_image);imshow("face_eye", image);waitKey(30);}}
}Mat FaceDetection::eyeDetection(Mat frame)
{if (!face_classifier.load(face_path)) {std::cout << "无法读取人脸的分类文件!" << std::endl;exit(0);}if (!eye_cascader.load(eye_path)){std::cout << "无法读取眼睛的分类文件!" << std::endl;exit(0);}Mat gray;vector<Rect> faces;vector<Rect> eyes;cvtColor(frame, gray, COLOR_BGR2GRAY);equalizeHist(gray, gray);face_classifier.detectMultiScale(gray, faces, 1.2, 3, 0, Size(30, 30));for (size_t t = 0; t < faces.size(); t++) {Rect roi;roi.x = faces[static_cast<int>(t)].x;roi.y = faces[static_cast<int>(t)].y;roi.width = faces[static_cast<int>(t)].width;roi.height = faces[static_cast<int>(t)].height / 2;Mat faceROI = frame(roi);eye_cascader.detectMultiScale(faceROI, eyes, 1.2, 3, 0, Size(20, 20));for (size_t k = 0; k < eyes.size(); k++) {Rect rect;rect.x = faces[static_cast<int>(t)].x + eyes[k].x;rect.y = faces[static_cast<int>(t)].y + eyes[k].y;rect.width = eyes[k].width;rect.height = eyes[k].height;rectangle(frame, rect, Scalar(0, 0, 255), 2, 8, 0);}rectangle(frame, faces[static_cast<int>(t)], Scalar(0, 255, 0), 2, 8, 0);}    return frame;
}Mat FaceDetection::detection(Mat image)
{if (image.empty()){std::cout << "无法打开传入的图像文件!" << std::endl;exit(0);}Mat gray;//灰度化cvtColor(image, gray, COLOR_BGR2GRAY);//直方图均衡化,用于提高图像的质量/*有时提高了图像质量之后,检测的人脸有漏检的现象*///equalizeHist(gray, gray);//存放检测到人脸的矩形vector<Rect> faces;//开始检测face_classifier.detectMultiScale(gray, faces, 1.2, 3, 0, Size(24, 24));//画出检测到的矩形的位置for (size_t t = 0; t < faces.size(); t++){rectangle(image, faces[static_cast<int>(t)], Scalar(0, 0, 255), 2, 8, 0);}return image;
}

3.main文件

#include "FaceDetection.h"
//人脸检测的分类器
string face_file = "E:/LIB/opencv330/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml";
//眼睛检测的分类器
string eye_file = "E:/LIB/opencv330/opencv/sources/data/haarcascades/haarcascade_eye.xml";
//图像路径或目录
string image_path = "C:/Users/matt/Desktop/face/";int main()
{FaceDetection face_eye(image_path,face_file,eye_file);//检测人脸//face_eye.frontalFaceDetection();//检测人脸与眼睛的face_eye.faceAndeye();system("pause");return 0;
}

三、测试结果

1.人脸检测,有漏检的,也有误检的。
(1).有误检测了地方。

(2)完全成检测到人脸。

(3)检测不到,如果调下参数或用另一个分类能检测到。

2.人脸与眼睛的检测效果
(1)完全检测到人脸和眼睛。

(2)有漏检测和误检测的眼睛。

(3)有检测不到的眼睛的。

结语

1.检测结果并不理想,对检测准确率影响有环境的因素,和传给检测器之前的对图像的处理,设置检测的分类的参数等。
2.如果要在相对稳定的环境下使用,最好的方法是使用该环境下的人脸样品自己训练模型。
3.之后我会试用opencv和caffe的训练自己的数据模型,看是否能达到官方分类器的准确率。
4.我用的分类器和图像下载地址:https://download.csdn.net/download/matt45m/11070191 。
5.关于整个工程的源码,运行程序时的bug,或者有如何优化代码的想法都可以加这个群(487350510)互相讨论学习。

OpenCV3实现人脸识别(一)——基于OpenCV3级联分类器实现人脸检测与眼睛检测相关推荐

  1. python读取视频流做人脸识别_基于OpenCV和Keras实现人脸识别系列——二、使用OpenCV通过摄像头捕获实时视频并探测人脸、准备人脸数据...

    基于OpenCV和Keras实现人脸识别系列手记: 项目完整代码参见Github仓库. 本篇是上面这一系列手记的第二篇. 在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,而 ...

  2. python人脸识别opencv_基于python+OpenCV模块的人脸识别定位技术

    什么是OpenCV模块 OpenCV是一款跨平台的视觉库,可以支持的操作系统有Linux.Windows和Mac OS操作系统,并且还提供了多种语言的接口,比如Python,java,MATLAB等常 ...

  3. matlab 人脸识别_MATLAB基于PCALDA模糊神经网络的人脸识别

    点击上方蓝字关注"公众号" MATLAB基于PCA-LDA模糊神经网络的人脸识别 基于PCA-LDA和粗糙集模糊神经网络的人脸识别,一方面在应用前景上是十分广阔的,可以为IT行业创 ...

  4. 【人脸识别】基于PCA和SVM的人脸识别关键技术研究与实现附matlab代码

    1 简介 人脸识别是计算机视觉和图像模式识别领域的一个重要技术.主成分分析(PCA)是人脸图像特征提取的一个重要算法.而支持向量机(SVM)有适合处理小样本问题,高维数及泛化性能强等多方面的优点.文章 ...

  5. 【人脸识别】基于matlab GUI KL变换人脸识别【含Matlab源码 859期】

    ⛄一.KL变换人脸识别简介 人脸识别是指基于己知的人脸样本集,利用图像处理和模式识别的技术从静态或动态场景中,识别或验证一个或多个人脸.人脸识别技术跨越了图像处理.模式识别.计算机视觉.生物学.神经生 ...

  6. python人脸识别opencv_Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...

  7. python模块cv2人脸识别_Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...

  8. 遮挡人脸识别:基于Python3.8+Tensorflow2.2人脸遮挡情况的人脸识别

    文件大小:150M 开发环境:Python3.8.OpenCV4.5.Tensorflow2.2.PyCharm2020 点击下载:点击下载 简要概述:一种人脸识别应用,即使使用口罩也能检测人的身份. ...

  9. 基于cnn的人脸识别_鬼都藏不住,人脸识别新突破!就算遮住半张脸也能100%被识别...

    转自:新智元 如涉版权请加编辑微信iwish89联系 哲学园鸣谢 新智元报道 来源:sciencedirect 编辑:金磊,元子 [新智元导读]众所周知,人脸识别在摄像头无法捕捉到完整面部图像的情况下 ...

  10. OpenCV中基于Haar特征和级联分类器的人脸检测

    使用机器学习的方法进行人脸检测的第一步需要训练人脸分类器,这是一个耗时耗力的过程,需要收集大量的正负样本,并且样本质量的好坏对结果影响巨大,如果样本没有处理好,再优秀的机器学习分类算法都是零. 今年3 ...

最新文章

  1. HTML用乘法函数,Excel乘法函数的使用方法和详细步骤
  2. 不容错过的灰度发布系统架构设计
  3. eclipse java代码颜色设置颜色设置颜色设置颜色设置颜色_eclipse设置(颜色,字体等)...
  4. java中isclosed_java.sql.SQLException: Conntion is closed.解决方法
  5. redis 集群 及 管理初步
  6. String类为什么是final
  7. php array_merge和“+”的区别和使用《细说php2》
  8. ios字典存bool_iOS 开发之字典写入文件
  9. C++程序设计一(进制转换)
  10. java comparable排序_java_Java使用Comparable解决排序问题,本文实例讲述了Java使用Comparabl - phpStudy...
  11. MySQL业务账号需要哪些权限_MySQL 日常运维业务账号权限的控制
  12. Couch的MapReduce查询
  13. 一个曾讨厌英语的人是如何爱上英语学好英语的
  14. python实现播放音乐
  15. srt转vtt——在线转换工具
  16. 小白学习性能随笔记1
  17. 匹兹堡大学约翰斯敦计算机学院,英语翻译翻译Every human being,no matter what he is doing,gives off...
  18. 2021年美容师(初级)考试资料及美容师(初级)
  19. [死磕 Spring 21/43] --- IOC 之 Factory 实例化 bean
  20. java提供按摩比较复数大小_复数类实现 - kb

热门文章

  1. 数据结构实验之栈与队列七:出栈序列判定
  2. Unhandled exception 0xC0000005: Access violation writing location
  3. Redis【入门】就这一篇!
  4. Spring AOP 源码分析 - 创建代理对象
  5. 并发编程(四):也谈谈数据库的锁机制
  6. 5.1 代码合并:Merge、Rebase的选择
  7. Java 基本数据类型 sizeof 功能
  8. matlab 2014 破解使用
  9. 查找算法:二分查找、顺序查找
  10. 图像处理与计算机视觉:基础,经典以及最近发展(5)计算机视觉