我是靠谱客的博主 负责牛排,这篇文章主要介绍opencv实现图片及视频流(摄像头)的人脸检测,现在分享给大家,希望可以做个参考。

完整人脸识别系统(源码+教程+环境):

开源毕业设计:基于嵌入式ARM-Linux的应用OpenCV和QT实现的人脸识别系统(源码+论文)

完全毕设教程:Linux上Opencv与Qt实现的人脸识别的考勤点名/门禁系统(PC与嵌入式ARM版本)

 

本文将实现opencv的人脸检测,首先从最简单的图片检测人脸开始。

 

在opencv中,主要有 Haar特征 和 LBP特征 进行人脸检测。

opencv自带训练好的分类器,在源码的data目录下有“lbpcascades”,“haarcascades”,“hogcascades”三个文件夹,分别表示通过“haar”、“hog”和“lbp”三种不同的特征而训练出的分类器。"haar"特征主要用于人脸检测,“hog”特征主要用于行人检测,“lbp”特征主要用于人脸识别。如,在“haarcascades”下是大量的针对不同目标的训练文件,如下:

从文件名也大概能看出各个文件主要用途。

人脸检测器(默认):haarcascade_frontalface_default.xml 
人脸检测器(快速Harr):haarcascade_frontalface_alt2.xml 
人脸检测器(侧视):haarcascade_profileface.xml 
眼部检测器(左眼):haarcascade_lefteye_2splits.xml 
眼部检测器(右眼):haarcascade_righteye_2splits.xml 
嘴部检测器:haarcascade_mcs_mouth.xml 
鼻子检测器:haarcascade_mcs_nose.xml 
身体检测器:haarcascade_fullbody.xml 
人脸检测器(快速LBP):lbpcascade_frontalface.xml

本文中,我们将利用“haarcascade_frontalface_alt2.xml”对上面图片进行人脸检测。

 

首先,应用“CascadeClassifier”实例化

复制代码
1
CascadeClassifier faceCascade;

 

加载分类器:

 

复制代码
1
bool CascadeClassifier::load( const String& filename )

 

人脸检测:

 

复制代码
1
2
3
4
5
6
void CascadeClassifier::detectMultiScale( InputArray image,                       CV_OUT std::vector<Rect>& objects,                       double scaleFactor,                       int minNeighbors, int flags,                       Size minSize,                       Size maxSize )

各参数如下:

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

 

一、图片中的人脸检测

代码实现:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<opencv2/objdetect/objdetect.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace cv; using namespace std; CascadeClassifier faceCascade; int main() { faceCascade.load("/root/library/opencv/opencv-3.4.0/data/haarcascades/haarcascade_frontalface_alt2.xml");    //加载分类器 Mat img = imread("myImage.JPEG");     // 载入图片 Mat imgGray; vector<Rect> faces; if(img.empty())     { return 1; } if(img.channels() ==3) { cvtColor(img, imgGray, CV_RGB2GRAY);     // RGB转化为灰度 } else { imgGray = img;     // 不转化 } faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));    // 检测人脸 if(faces.size()>0) { for(int i =0; i<faces.size(); i++) { rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), Scalar(0, 255, 0), 1, 8); // 框出人脸 } } imshow("FacesOfPrettyGirl", img);     // 显示图片 waitKey(0); return 0; }

编译运行:

 

二、视频(摄像头)中的人脸检测

    视频中的人脸检测跟图片类似,一样的过程。

    可将视频看作是一帧帧的图片,对每一帧进行上述的图片检测即可,不断循环。

代码实现:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include<opencv2/objdetect/objdetect.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> #include <iostream> using namespace cv; using namespace std; CascadeClassifier faceCascade; int main() { faceCascade.load("/root/library/opencv/opencv-3.4.0/data/haarcascades/haarcascade_frontalface_alt2.xml"); VideoCapture capture; capture.open(1);    // 打开摄像头 //     capture.open("video.avi");    // 打开视频 if(!capture.isOpened()) { cout << "open camera failed. " << endl; return -1; } Mat img, imgGray; vector<Rect> faces; while(1) { capture >> img;    // 读取图像至img if(img.empty()) { continue; } if(img.channels() == 3) { cvtColor(img, imgGray, CV_RGB2GRAY); } else { imgGray = img; } faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0));    // 检测人脸 if(faces.size()>0) { for(int i =0; i<faces.size(); i++) { rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), Scalar(0, 255, 0), 1, 8); } } imshow("CamerFace", img);     // 显示 if(waitKey(1) > 0) // delay ms 等待按键退出 { break; } } return 0; }

编译运行:

视频有点卡顿,后续优化。

 

优化参考:

博客:【opencv视频流(摄像头)的人脸检测的优化】

 

备注:参考博客  http://blog.csdn.net/lsq2902101015/article/details/47057081        http://blog.csdn.net/chaipp0607/article/details/54234663

最后

以上就是负责牛排最近收集整理的关于opencv实现图片及视频流(摄像头)的人脸检测的全部内容,更多相关opencv实现图片及视频流(摄像头)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部