OpenCV實現人臉檢測功能
阿新 • • 發佈:2020-02-17
本文例項為大家分享了OpenCV實現人臉檢測功能的具體程式碼,供大家參考,具體內容如下
1、HAAR級聯檢測
#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,COLOR_BGRA2BGR); cvtColor(frame,gray,COLOR_BGR2GRAY); equalizeHist(gray,gray); faceDetector.detectMultiScale(gray,faces,1.2,1,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.75,255),8); imshow("haar_face_detection",frame); if (waitKey(1) >= 0) break; } printf("total face: %d\n",count); }
2、DNN人臉檢測
#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,1); imshow("input",frame); if (frame.channels() == 4) cvtColor(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,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,&baseLine); rectangle(frame,Rect(Point(xLeftBottom,yLeftBottom - labelSize.height),Size(labelSize.width,labelSize.height + baseLine)),Scalar(255,FILLED); putText(frame,label,Point(xLeftBottom,yLeftBottom),0)); } } float fps = getTickFrequency() / (getTickCount() - start); ss.str(""); ss << "FPS: " << fps << " ; inference time: " << time << " ms"; putText(frame,8); imshow("dnn_face_detection",frame); if (waitKey(1) >= 0) break; } printf("total face: %d\n",count); }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。