#include <dlib/image_processing/frontal_face_detector.h> #include <dlib/gui_widgets.h> #include <dlib/image_io.h> #include <iostream> #include <dlib/opencv.h> #include <opencv2/opencv.hpp> #include <dlib/image_processing/render_face_detections.h> #include <dlib/image_processing.h> #include <dlib/gui_widgets.h> #include <opencv2\imgproc\imgproc.hpp> #include <windows.h> #include <opencv2/opencv.hpp> #include <cmath> #include <dlib/image_processing/frontal_face_detector.h> #include <dlib/image_io.h> #include <iostream> #include <dlib/opencv.h> /*#include <dlib/image_processing/frontal_face_detector.h> #include <dlib/gui_widgets.h> #include <dlib/image_io.h> #include <iostream> #include <dlib/opencv.h> #include <opencv2/opencv.hpp> #include <dlib/image_processing/render_face_detections.h> #include <dlib/image_processing.h> #include <dlib/gui_widgets.h> using namespace dlib; using namespace std; int main() { frontal_face_detector detector = get_frontal_face_detector(); frontal_face_detector detector1 = get_frontal_face_detector(); shape_predictor pose_mode1; deserialize("D:/data/shape_predictor_68_face_landmarks.dat") >> pose_mode1;//文件地址 image_window win; //调用window图像处理opencv array2d<unsigned char> img; string path = "D:/0001.png"; load_image(img, "D:/0001.png"); cv::Mat temp = cv::imread(path); cv::Mat temp1 = cv::imread(path); cv_image<bgr_pixel> cimg(temp); //cv_image<bgr_pixel> cimg(temp1); std::vector<rectangle> faces = detector(cimg); //pyramid_up(img); std::vector<rectangle> dets = detector(img); cout << "识别到的人脸数 :" << dets.size() << endl; win.clear_overlay(); win.set_title("facedemo"); win.set_image(img); win.add_overlay(dets, rgb_pixel(255, 0, 0)); cout <<"识别到的人脸数"<< faces.size() << endl; std::vector<full_object_detection> shapes; for (unsigned long i = 0; i < faces.size(); ++i) shapes.push_back(pose_mode1(cimg, faces[i])); if (!shapes.empty()) { for (int i = 0; i < 68; i++) { circle(temp, cvPoint(shapes[0].part(i).x(), shapes[0].part(i).y()), 3, cv::Scalar(0, 0, 255), -1); shapes[0].part(i).x();//68个 } } imshow("Dlib面部识别", temp); cv::imwrite("D:/pp.png", temp); cv::waitKey(0); cout << "再输入下一张图片" << endl; cin.get(); system("pause"); return 0; }*/ /*#include <dlib/image_processing/frontal_face_detector.h> #include <dlib/gui_widgets.h> #include <dlib/image_io.h> #include <iostream> #include <dlib/opencv.h> #include <opencv2/opencv.hpp> #include <dlib/image_processing/render_face_detections.h> #include <dlib/image_processing.h> #include <dlib/gui_widgets.h> using namespace dlib; using namespace std; int main() { auto path = "D:\\data\\dlib - 19.24\\dlib - 19.24\\examples\\video_frames"; // Get the list of video frames. std::vector<file> files = get_files_in_directory_tree(path, match_ending(".jpg")); std::sort(files.begin(), files.end()); array2d<unsigned char> img; load_image(img, files[0]); //加载第一帧 correlation_tracker tracker; //创建tracker //下面所创建的矩形,对果汁盒进行了框选 tracker.start_track(img, centered_rect(point(93, 110), 38, 86)); image_window win; for (unsigned long i = 1; i < files.size(); ++i) { load_image(img, files[i]); tracker.update(img); //根据图像,对tracker进行更新 win.set_image(img); win.clear_overlay(); win.add_overlay(tracker.get_position()); Sleep(100); } }*/ //using namespace dlib; using namespace std; using namespace cv; int main() { VideoCapture cap("D:/viedio/002.mp4"); if (!cap.isOpened()) { cout << "video not exist!" << endl; return -1; } //frontal_face_detector detector = get_frontal_face_detector(); //std::vector<rectangle> faces = detector(cap); long FRAMECNT = cap.get(CAP_PROP_FRAME_COUNT); Mat frame, mask, maskCp; vector<vector<Point>> cnts; Rect maxRect; const double RECT_HW_RATIO = 1.25; // 人体长宽比阈值 const double RECT_AREA_RATIO = 0.08; // 人体占整个图像最小比例阈值 const double RECT_AREA_RATIO2 = 0.2; // 人体占整体图像最大比例阈值 Ptr<BackgroundSubtractorMOG2> bgsubtractor = createBackgroundSubtractorMOG2(); bgsubtractor->setHistory(20); bgsubtractor->setVarThreshold(100); bgsubtractor->setDetectShadows(true); bool hasPeople = true; // 是否有人 int count = 0; // 帧数 int hasPeopleFrameCnt = 0; // 每K帧统计到的有人帧数 int spaceFrames = 0; // 每隔125帧统计一次 const int SPACE_FRAME =5; while (++count < FRAMECNT - 10) { cap >> frame; resize(frame, frame, Size(frame.cols / 4, frame.rows / 4)); // 背景更新 bgsubtractor->apply(frame, mask, 0.002); // 中值滤波 medianBlur(mask, mask, 3); // 阈值分割,去阴影 threshold(mask, mask, 200, 255,THRESH_BINARY); // 找轮廓 maskCp = mask.clone(); findContours(maskCp, cnts, 0, CHAIN_APPROX_SIMPLE); vector<Point> maxCnt; for (int i = 0; i < cnts.size(); ++i) { maxCnt = maxCnt.size() > cnts[i].size() ? maxCnt : cnts[i]; } // 画最大外接矩形 if (maxCnt.size() > 0) { maxRect = boundingRect(maxCnt); double rectAreaRatio = (double)maxRect.area() / (frame.cols * frame.rows); if ((double)maxRect.height / maxRect.width > RECT_HW_RATIO && rectAreaRatio > RECT_AREA_RATIO && rectAreaRatio < RECT_AREA_RATIO2) { rectangle(frame, maxRect.tl(), maxRect.br(), Scalar(0, 255, 0), 2); ++hasPeopleFrameCnt; } } ++spaceFrames; if (spaceFrames >= SPACE_FRAME) { if (hasPeopleFrameCnt > SPACE_FRAME / 8) { hasPeople = true; cout << count << ":有人" << endl; } else { hasPeople = false; cout << count << ":无人" << endl; } hasPeopleFrameCnt = 0; spaceFrames = 0; } imshow("frame", frame); imshow("mask", mask); if (waitKey(10) == 29) { break; } } return 0; };