用opencv自带xml。打开摄像头,实时视频检测人脸
可以直接运行在linux下或者Windows下的VS中
1 #include <iostream>
2 #include <stdio.h>
3 #include <ctime>
4 #include <opencv2/opencv.hpp>
5 #include <opencv2/highgui/highgui.hpp>
6 #include <opencv2/imgproc/imgproc.hpp>
7 #include "opencv2/core/core.hpp"
8 using namespace cv;
9 using namespace std;
10
11 #define W 1920
12 #define H 1080
13
14 string face_cascade_name = "E:/opencv_VS/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml";
15 CascadeClassifier face_cascade;
16 int facesnum = 0;
17 void DectectorAndDis(Mat frame)
18 {
19 Mat face_gray = Mat::zeros(H, W, CV_8UC3);
20 vector<Rect> faces;
21 cvtColor(frame, face_gray, CV_BGR2GRAY);//RGB转化为灰度
22 equalizeHist(face_gray, face_gray);//直方图均衡化
23 double t = (double)getTickCount();
24 face_cascade.detectMultiScale(face_gray, faces, 1.75, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));
25 t = ((double)getTickCount() - t)/getTickFrequency();
26
27 for (int i = 0; i < faces.size(); i++){
28 Point CvBox2D(int(faces[i].x + faces[i].width*0.5), int(faces[i].y + faces[i].height*0.5));
29 ellipse(frame, CvBox2D, Size(int(faces[i].width*0.5), int(faces[i].height*0.5)), 0, 0, 360, Scalar(255, 0, 0), 4, 8, 0);
30
31 }
32 if( facesnum != faces.size())
33 {
34 cout << "人脸数:" << faces.size() << endl;
35 facesnum = faces.size();
36 printf("本次检测使用: %0.2f ms\n",t*1000);
37 }
38
39 imshow("读取视频", frame);
40 }
41 int main(int argc, char* argv[])
42 {
43 VideoCapture capture;
44 capture.open(0);
45 Mat frame = Mat::zeros(H, W, CV_8UC3);
46 Mat frameaftcanny = Mat::zeros(H, W, CV_8UC3);
47 face_cascade.load(face_cascade_name);
48 while (1)
49 {
50 capture >> frame;
51 //cv::Canny(frame, frameaftcanny, 100, 300, 3);
52 //imshow("边缘检测", frameaftcanny);
53 DectectorAndDis(frame);
54 cv::waitKey(20);
55 }
56
57 return 0;
58 }
来源:oschina
链接:https://my.oschina.net/u/4417528/blog/3943933