扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
使用OpenCV怎么实现一个人脸检测功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
乐清ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:028-86922220(备注:SSL证书合作)期待与您的合作!
1、HAAR级联检测
#include#include using namespace cv; #include #include 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 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#include using namespace cv; using namespace cv::dnn; #include #include 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 layersTimings; double freq = getTickFrequency() / 1000; double time = net.getPerfProfile(layersTimings) / freq; Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr ()); ostringstream ss; for (int i = 0; i < detectionMat.rows; i++) { // 置信度 0~1之间 float confidence = detectionMat.at (i, 2); if (confidence > confidenceThreshold) { count++; int xLeftBottom = static_cast (detectionMat.at (i, 3) * frame.cols); int yLeftBottom = static_cast (detectionMat.at (i, 4) * frame.rows); int xRightTop = static_cast (detectionMat.at (i, 5) * frame.cols); int yRightTop = static_cast (detectionMat.at (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); }
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注创新互联行业资讯频道,感谢您对创新互联的支持。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流