1 #include <opencv2\opencv.hpp>
2 #include <iostream>
3 using namespace std;
4
5 int main() {
6 // 摄像头
7 cv::VideoCapture vc(0);
8
9 // 人脸分类器
10 const char* filename = "D:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt2.xml";
11 cv::CascadeClassifier face_cascade;
12 // 加载人脸分类器
13 if (!face_cascade.load(filename)) {
14 return -1;
15 }
16
17 // 用来检测的图为原图的大小比例
18 float scale = 0.3f;
19 // 图
20 cv::Mat mat, mat2;
21 // 检测得到的人脸的结果
22 vector<cv::Rect> faces_result;
23
24 while (true) {
25 if (vc.isOpened()) {
26 if (vc.retrieve(mat)) {
27 // 将原图像水平反转(这样更符合人的习惯)
28 cv::flip(mat, mat, 1);
29 // 缩小
30 cv::resize(mat, mat2, cv::Size(mat.cols * scale, mat.rows * scale));
31 // 变灰
32 cv::cvtColor(mat2, mat2, CV_BGR2GRAY);
33 cv::equalizeHist(mat2, mat2);
34
35 //////////// 开始检测人脸 ////////////
36 face_cascade.detectMultiScale(mat2, faces_result);
37
38 // 将结果显示在原图上
39 for (auto face : faces_result) {
40 cv::Point center(face.x / scale + face.width / 2 / scale, face.y / scale + face.height / 2 / scale);
41 cv::ellipse(mat, center, cv::Size(face.width / 2 / scale, face.height / 2 / scale), 0, 0, 360, cv::Scalar(0, 0, 255), 2, 8, 0);
42 }
43
44 // 显示出来
45 cv::imshow("My Face", mat);
46 }
47 }
48
49 // 接收到输入时 退出
50 if (cv::waitKey(30) > 0) {
51 break;
52 }
53 }
54
55 return 0;
56 }