这次来讲讲OpenCV的一大功能,Object Detect
其中就包括了我将要使用的人脸检测,以下是最最简化的一个调用人脸识别的程序
静态图片的人脸检测
1 | //头文件 |
动态视频的人脸检测
把上面的程序稍加修改,就可以借助计算机摄像头检测人脸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//头文件
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;
}
}