0%

OpenCV--人脸检测

这次来讲讲OpenCV的一大功能,Object Detect
其中就包括了我将要使用的人脸检测,以下是最最简化的一个调用人脸识别的程序

静态图片的人脸检测

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
65
66
67
68
//头文件  
#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("E:\\VS2015\\myProject\\ConsoleApplication1\\ConsoleApplication1\\haarcascades\\haarcascade_frontalface_alt2.xml"); //加载分类器,注意文件路径

//读取图片文件
Mat img = imread("E:\\VS2015\\myProject\\ConsoleApplication1\\ConsoleApplication1\\data\\lena.jpg");
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)); //调用分类器检测人脸
/*参数:imgGray—Mat类型的图像

faces—检测得到的矩形

1.2—表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%

minNeighbors--表示构成检测目标的相邻矩形的最小个数(默认为3个)。
如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。
如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,
这种设定值一般用在用户自定义对检测结果的组合程序上;

flags—默认0

minObjectSize—最小检测窗口大小

maxObjectSize—最大检测窗口大小


*/

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("Faces", 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
65
66
67
68
69
70
71
//头文件  
#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()
{
VideoCapture cap(0); //打开默认摄像头
if (!cap.isOpened())
{
return -1;
}
Mat frame;
//Mat edges;
Mat gray;
bool stop = false;

faceCascade.load("E:\\VS2015\\myProject\\ConsoleApplication1\\ConsoleApplication1\\haarcascades\\haarcascade_frontalface_alt2.xml"); //加载分类器,注意文件路径

//Mat img = imread("E:\\VS2015\\myProject\\ConsoleApplication1\\ConsoleApplication1\\data\\lena.jpg");
//Mat imgGray;
//vector<Rect> faces;



while (!stop)
{
cap >> frame;//获取视频图像

//建立用于存放人脸的向量容器
vector<Rect> faces(0);

cvtColor(frame, gray, CV_BGR2GRAY);//对图像的预处理
//改变图像大小,使用双线性差值
//resize(gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR);
//变换后的图像进行直方图均值化处理
equalizeHist(gray, gray);

faceCascade.detectMultiScale(gray, faces,
1.1, 2, 0
//|CV_HAAR_FIND_BIGGEST_OBJECT
//|CV_HAAR_DO_ROUGH_SEARCH
| CV_HAAR_SCALE_IMAGE,
Size(30, 30));

//Mat face;
//Point text_lb;

if (faces.size()>0)
{
for (int i = 0; i<faces.size(); i++)
{
rectangle(frame, 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("face", frame);
if (waitKey(50) >= 0)
stop = true;
}

}