此文源于在opencv学堂上看到的一篇文章,自己尝试了下,
首先安装opencv4,在OpenCV的\sources\samples\dnn\face_detector目录下,有一个download_weights.py脚本文件,首先运行一下,下载模型文件。下载的模型文件分别为:
Caffe模型
res10_300x300_ssd_iter_140000_fp16.caffemodel
deploy.prototxt
tensorflow模型
opencv_face_detector_uint8.pb
opencv_face_detector.pbtxt
下面为自己在visual sutio2019中的测试代码,
#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.6; void face_detect_dnn(); void mtcnn_demo(); int main(int argc, char** argv) { face_detect_dnn(); waitKey(0); return 0; } void face_detect_dnn() { //String modelDesc = "D:/projects/opencv_tutorial/data/models/resnet/deploy.prototxt"; // String modelBinary = "D:/projects/opencv_tutorial/data/models/resnet/res10_300x300_ssd_iter_140000.caffemodel"; //String modelBinary = "D:/opencv-4.2.0/opencv/sources/samples/dnn/face_detector/opencv_face_detector_uint8.pb"; //String modelDesc = "D:/opencv-4.2.0/opencv/sources/samples/dnn/face_detector/opencv_face_detector.pbtxt"; String modelBinary = "E:/opencv_4_2_0_is_installed_here/opencv/sources/samples/dnn/face_detector/opencv_face_detector_uint8.pb"; String modelDesc = "E:/opencv_4_2_0_is_installed_here/opencv/sources/samples/dnn/face_detector/opencv_face_detector.pbtxt"; // 初始化网络 // dnn::Net net = readNetFromCaffe(modelDesc, modelBinary); dnn::Net net = readNetFromTensorflow(modelBinary, modelDesc); net.setPreferableBackend(DNN_BACKEND_OPENCV); net.setPreferableTarget(DNN_TARGET_CPU); if (net.empty()) { printf("could not load net...\n"); return; } #if 0 // 打开摄像头 // VideoCapture capture(0); VideoCapture capture("D:/images/video/Boogie_Up.mp4"); if (!capture.isOpened()) { printf("could not load camera...\n"); return; } #endif Mat frame; int count = 0; char imagePath[100] = {}; char outPath[100] = {}; //while (capture.read(frame)) for (int i = 0; i < 81; i++) { waitKey(100); sprintf_s(imagePath, "E:/opencv_4_2_0_is_installed_here/opencv/sources/samples/dnn/face_detector/%d.jpg", i); printf("imagePath:%s\n", imagePath); //frame = cv::imread("E:/opencv_4_2_0_is_installed_here/opencv/sources/samples/dnn/face_detector/0.jpg"); frame = cv::imread(imagePath); if (frame.empty()) { printf("read test jpg error\n"); } else { int64 start = getTickCount(); #if 0 if (frame.empty()) { break; } #endif // 水平镜像调整 // 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; String conf(ss.str()); 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); sprintf_s(outPath, "E:/opencv_4_2_0_is_installed_here/opencv/sources/samples/dnn/face_detector/out%d.jpg", i); imwrite(outPath, frame); //if (waitKey(1) >= 0) break; if (waitKey(1) >= 0) return; } printf("total face: %d\n", count); } }
来源:https://www.cnblogs.com/cumtchw/p/12312280.html