本文实例为大家分享了OpenCV实现人脸检测功能的具体代码,供大家参考,具体内容如下
1、HAAR级联检测
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
|
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; #include <iostream> #include <cstdlib> using namespace std; int main( int artc, char ** argv) { face_detect_haar(); waitKey(0); return 0; } void face_detect_haar() { CascadeClassifier faceDetector; std::string haar_data_file = "./models/haarcascades/haarcascade_frontalface_alt_tree.xml" ; faceDetector.load(haar_data_file); vector<Rect> faces; //VideoCapture capture(0); VideoCapture capture( "./video/test.mp4" ); Mat frame, gray; int count=0; while (capture.read(frame)) { int64 start = getTickCount(); if (frame.empty()) { break ; } // 水平镜像调整 // flip(frame, frame, 1); imshow( "input" , frame); if (frame.channels() == 4) cvtColor(frame, frame, COLOR_BGRA2BGR); cvtColor(frame, gray, COLOR_BGR2GRAY); equalizeHist(gray, gray); faceDetector.detectMultiScale(gray, faces, 1.2, 1, 0, Size(30, 30), Size(400, 400)); for ( size_t t = 0; t < faces.size(); t++) { count++; rectangle(frame, faces[t], Scalar(0, 255, 0), 2, 8, 0); } float fps = getTickFrequency() / (getTickCount() - start); ostringstream ss;ss.str( "" ); ss << "FPS: " << fps << " ; inference time: " << time << " ms" ; putText(frame, ss.str(), Point(20, 20), 0, 0.75, Scalar(0, 0, 255), 2, 8); imshow( "haar_face_detection" , frame); if (waitKey(1) >= 0) break ; } printf ( "total face: %d\n" , count); } |
2、 DNN人脸检测
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#include <opencv2/dnn.hpp> #include <opencv2/opencv.hpp> using namespace cv; using namespace cv::dnn; #include <iostream> #include <cstdlib> using namespace std; const size_t inWidth = 300; const size_t inHeight = 300; const double inScaleFactor = 1.0; const Scalar meanVal(104.0, 177.0, 123.0); const float confidenceThreshold = 0.7; void face_detect_dnn(); void mtcnn_demo(); int main( int argc, char ** argv) { face_detect_dnn(); waitKey(0); return 0; } void face_detect_dnn() { //这里采用tensorflow模型 std::string modelBinary = "./models/dnn/face_detector/opencv_face_detector_uint8.pb" ; std::string modelDesc = "./models/dnn/face_detector/opencv_face_detector.pbtxt" ; // 初始化网络 dnn::Net net = readNetFromTensorflow(modelBinary, modelDesc); net.setPreferableBackend(DNN_BACKEND_OPENCV); net.setPreferableTarget(DNN_TARGET_CPU); if (net.empty()) { printf ( "Load models fail...\n" ); return ; } // 打开摄像头 // VideoCapture capture(0); VideoCapture capture( "./video/test.mp4" ); if (!capture.isOpened()) { printf ( "Don't find video...\n" ); return ; } Mat frame; int count=0; while (capture.read(frame)) { int64 start = getTickCount(); if (frame.empty()) { break ; } // 水平镜像调整 // flip(frame, frame, 1); imshow( "input" , frame); if (frame.channels() == 4) cvtColor(frame, frame, COLOR_BGRA2BGR); // 输入数据调整 Mat inputBlob = blobFromImage(frame, inScaleFactor, Size(inWidth, inHeight), meanVal, false , false ); net.setInput(inputBlob, "data" ); // 人脸检测 Mat detection = net.forward( "detection_out" ); vector< double > layersTimings; double freq = getTickFrequency() / 1000; double time = net.getPerfProfile(layersTimings) / freq; Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr< float >()); ostringstream ss; for ( int i = 0; i < detectionMat.rows; i++) { // 置信度 0~1之间 float confidence = detectionMat.at< float >(i, 2); if (confidence > confidenceThreshold) { count++; int xLeftBottom = static_cast < int >(detectionMat.at< float >(i, 3) * frame.cols); int yLeftBottom = static_cast < int >(detectionMat.at< float >(i, 4) * frame.rows); int xRightTop = static_cast < int >(detectionMat.at< float >(i, 5) * frame.cols); int yRightTop = static_cast < int >(detectionMat.at< float >(i, 6) * frame.rows); Rect object(( int )xLeftBottom, ( int )yLeftBottom, ( int )(xRightTop - xLeftBottom), ( int )(yRightTop - yLeftBottom)); rectangle(frame, object, Scalar(0, 255, 0)); ss << confidence; std::string conf(ss.str()); std::string label = "Face: " + conf; int baseLine = 0; Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine); rectangle(frame, Rect(Point(xLeftBottom, yLeftBottom - labelSize.height), Size(labelSize.width, labelSize.height + baseLine)), Scalar(255, 255, 255), FILLED); putText(frame, label, Point(xLeftBottom, yLeftBottom), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0)); } } float fps = getTickFrequency() / (getTickCount() - start); ss.str( "" ); ss << "FPS: " << fps << " ; inference time: " << time << " ms" ; putText(frame, ss.str(), Point(20, 20), 0, 0.75, Scalar(0, 0, 255), 2, 8); imshow( "dnn_face_detection" , frame); if (waitKey(1) >= 0) break ; } printf ( "total face: %d\n" , count); } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/u012156872/article/details/104298472