很通俗的来说,haar算法计算特征就是用一块区域内黑色的值减去白色的值。但是一张图片像素点是非常多的,如果用普通的方法去计算一块区域的值,效率相当低下。
这里有一种加速计算的方法--积分图:
定义如下:

(维基百科贴过来的“—”)

积分图每一点(x,y)都是这个点对应左上角区域所有值的和
并且只需要遍历一遍图像就可得到积分图。
而对于任意一点(x,y) 积分图可这样计算 I(x,y)= i(x,y)+I(x-1,y)+I(x,y-1)-I(x-1,y-1)
利用积分图就可以很高效的计算出图像中的特征区域。
我这里用的是已经训练好的haar级联分类器。

眼睛检测 haarcascade_eye_tree_eyeglasses.xml
人脸检测 haarcascade_frontalface_alt2.xml

检测思路:
先把图片转为灰度,接着将图片直方均匀化,在上面处理后的图片矩阵中检测脸的区域,然后把脸这一块圈出来去检测眼睛。
检测函数代码如下:

void DetectFace(Mat img,Mat imgGray) {namedWindow("src", WINDOW_AUTOSIZE);vector<Rect> faces, eyes;faceCascade.detectMultiScale(imgGray, faces, 1.2, 5, 0, Size(30, 30));for (auto b : faces) {cout << "输出一张人脸位置:(x,y):" << "(" << b.x << "," << b.y << ") , (width,height):(" << b.width << "," << b.height << ")" << endl;}if (faces.size()>0) {for (size_t i = 0; i<faces.size(); i++) {putText(img, "ugly man!", cvPoint(faces[i].x, faces[i].y - 10), FONT_HERSHEY_PLAIN, 2.0, Scalar(0, 0, 255));rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), Scalar(0, 0, 255), 1, 8);cout << faces[i] << endl;//将人脸从灰度图中抠出来Mat face_ = imgGray(faces[i]);eyes_Cascade.detectMultiScale(face_, eyes, 1.2, 2, 0, Size(30, 30));for (size_t j = 0; j < eyes.size(); j++) {Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2);int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);circle(img, eye_center, radius, Scalar(65, 105, 255), 4, 8, 0);}}}imshow("src", img);
} 

最后检测效果:

全部代码如下:

 #include <opencv/cv.h>
#include <opencv/highgui.h>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
void DetectFace(Mat,Mat);
CascadeClassifier faceCascade;
CascadeClassifier eyes_Cascade;
int main(int argc, char** argv) {VideoCapture cap;if (!cap.open(0)) {cout << "摄像头打开失败!!" << endl; return -1;}if (!faceCascade.load("C:\\Users\\cb\\source\\repos\\Project2\\x64\\Debug\\haarcascade_frontalface_alt2.xml") ) {cout << "人脸检测级联分类器没找到!!" << endl;return -1;}if (!eyes_Cascade.load("C:\\Users\\cb\\source\\repos\\Project2\\x64\\Debug\\haarcascade_eye_tree_eyeglasses.xml")) {cout << "眼睛检测级联分类器没找到!!" << endl;return -1;}Mat img, imgGray;int fps = 60;while (true) {cap >> img;cvtColor(img, imgGray, CV_BGR2GRAY);equalizeHist(imgGray, imgGray);//直方图均匀化DetectFace(img, imgGray);waitKey(1000/fps);}return 0;
}void DetectFace(Mat img,Mat imgGray) {namedWindow("src", WINDOW_AUTOSIZE);vector<Rect> faces, eyes;faceCascade.detectMultiScale(imgGray, faces, 1.2, 5, 0, Size(30, 30));for (auto b : faces) {cout << "输出一张人脸位置:(x,y):" << "(" << b.x << "," << b.y << ") , (width,height):(" << b.width << "," << b.height << ")" << endl;}if (faces.size()>0) {for (size_t i = 0; i<faces.size(); i++) {putText(img, "ugly girl!", cvPoint(faces[i].x, faces[i].y - 10), FONT_HERSHEY_PLAIN, 2.0, Scalar(0, 0, 255));rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), Scalar(0, 0, 255), 1, 8);cout << faces[i] << endl;//将人脸从灰度图中抠出来Mat face_ = imgGray(faces[i]);eyes_Cascade.detectMultiScale(face_, eyes, 1.2, 2, 0, Size(30, 30));for (size_t j = 0; j < eyes.size(); j++) {Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2);int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);circle(img, eye_center, radius, Scalar(65, 105, 255), 4, 8, 0);}}}imshow("src", img);
}

C++ SVM Opencv3.4实现人脸检测相关推荐

  1. C++ DNN Opencv3.4 实现人脸计数和人脸检测

    前言 OpenCV 3.3正式发布后,对深度学习(dnn模块)提供了更好的支持,dnn模块目前支持Caffe.TensorFlow.Torch.PyTorch等深度学习框架. 另外,新版本中使用预训练 ...

  2. 人脸检测(十五)--改进版VJ人脸检测(LBP特征,VISAPP2017)

    老实说,评估了从传统VJ到深度学习人脸检测各种算法后,我还是喜欢LBP+级联Adaboost这种架构的人脸检测,毕竟,boost框架还是最快的.在某些限制性场景应用中,大量的扫描窗方式虽然很low,但 ...

  3. 树莓派4B爽上流安装python3的OpenCV(人脸检测识别—门禁“环境搭建篇”)

    树莓派4B安装OpenCV3.4.0人脸检测识别-门禁"环境搭建篇" 前言 一.准备工作 PC端软件 二.搭建树莓派环境 拓展TF内存卡 Tips:换源(python软件源) 修改 ...

  4. OpenCV4Android开发实录(2): 使用OpenCV3.4.1库实现人脸检测

    OpenCV4Android开发实录(2): 使用OpenCV3.3.0库实现人脸检测 转载请声明出处:http://write.blog.csdn.net/postedit/78992490 Ope ...

  5. OpenCV3实现人脸识别(一)——基于OpenCV3级联分类器实现人脸检测与眼睛检测

    前言 1.OpenCV官方训练好的人脸和眼睛的级联分类器,3.30的版本都放在opencv\sources\data这个文件夹下,在OpenCV这个文件夹中,主要有 Haar特征 和 LBP特征进行人 ...

  6. python3项目源代码下载_人脸检测和识别 源代码 下载-opencv3+python3.6完整实战项目源代码 识别视频《欢乐颂》中人物,-opencv3《欢乐颂》...

    人脸检测和识别 源代码 下载-opencv3+python3.6完整实战项目源代码 识别视频<欢乐颂>中人物,-opencv3<欢乐颂> 效果图 源代码import os im ...

  7. OpenCV3训练人脸检测分类器生成XML文件的过程

    OpenCV训练自己的分类器 注:本文举得是一个训练人脸分类器的例子,亲自试验过,采用的是opencv3.4 1.准备训练样本 看网上说正负样本比例为1:3最佳:尺寸为20x20最佳 附上人脸训练的数 ...

  8. java 人脸检测_Java+opencv3.2.0实现人脸检测功能

    说到人脸检测,首先要了解Haar特征分类器.Haar特征分类器说白了就是一个个的xml文件,不同的xml里面描述人体各个部位的特征值,比如人脸.眼睛等等.OpenCV3.2.0中提供了如下特征文件: ...

  9. 【python OpenCV3.3 图像处理教程:直线检测、圆检测、对象测量、腐蚀、膨胀等形态学操作、数字验证码识别、人脸检测

    1. 直线检测 Hough Line Transform:前提:边缘检测已经完成,基于霍夫变换 1.1 原理 可以通过(theta,r)唯一表示一个点. 把过三个点的全部直线以某一角度全部计算出来,如 ...

最新文章

  1. BZOJ Usaco 1616 Cow Travelling
  2. Python 开发者在迁移到 Go(lang) 时需要知道哪些事?
  3. 洛谷P7518:宝石(倍增、可撤销并查集)
  4. 巧用枚举CommandBehavior关闭SqlDataReader联接数据库时的conn.open状态
  5. 第46课 精益求精 《小学生C++趣味编程》
  6. 怎样给 ActiveX 控件签名并打包发布
  7. treeview子节点文本过长超过DIV自动换行CSS解决
  8. Android系统启动过程-uBoot+Kernel+Android
  9. 如何在eclipse中新建java web项目,并且生成的是WebRoot目录而不是WebContent
  10. VMware14 黑屏问题
  11. mysql errno: 1146_解决MySQL复制出错 Last_SQL_Errno:1146
  12. XMind8 pro 免费破解版!速度
  13. Python ❀ 插入排序
  14. 4.2 英文分词及词性标注
  15. 好多粉数据上报之卧龙搜索ocpc API上报数据
  16. The SwiftProgramming Language读书笔记第26页
  17. 转行软件测试3年了,听前辈说测试前途是IT里最low的,我慌了......
  18. [翻译] 在 LaTeX 中对齐公式
  19. macOS Ventura 13 Beta3(22A5295i) 官方dmg镜像
  20. 正点原子STM32F429核心板的插座型号

热门文章

  1. 第一家云创大数据产业学院在佛山职业技术学院挂牌
  2. 利用lamda函数 的函数式编程 实现scrapy审计外网安全问题
  3. LindDotNetCore~职责链模式的应用
  4. rsync同步数据到内网
  5. 【项目经验】如何用TexturePacker Physicseditor开发游戏
  6. 2010年终人生的思考
  7. AS3自制按钮通用代码
  8. idea lombok 插件安装
  9. shell 进入hadoop_Hadoop关于HDFS的基本操作(Shell命令)
  10. c+++11并发编程语言,C++11并发编程:多线程std:thread