使用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, 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人脸检测
#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); }
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。