c++ 第三方人脸检测算法SDK调用

1 dlib

依赖:

dlib-19.18

opencv-3.4.2

复制代码
#include "common.h"
#include "opencv_base.h"
#include "helper.h"
#include "run.h"

// ============= dlib include files =======================
#include <image_processing/frontal_face_detector.h>
#include <image_processing/render_face_detections.h>
#include <image_processing.h>
#include <gui_widgets.h>
#include <image_io.h>
#include <opencv.h>
#include <opencv/cv_image.h>

using namespace dlib;

TickMeter tm2;

int TEST_DLIB_FACE() {
    string video_path = "..\\videos\\bilibili\\1.mp4";
    assert(exist_file(video_path));
    VideoCapture cp;
    Mat frame, face_roi;
    frontal_face_detector detector = get_frontal_face_detector();
    array2d<rgb_pixel> img;
    std::vector<dlib::rectangle> dets;
    if (cp.open(video_path)) {
        int total_num = cp.get(CAP_PROP_FRAME_COUNT);
        //cout << "total frame count: " << total_num << endl;
        while (cp.read(frame))
        {
            dets.clear();
            tm2.reset();
            tm2.start();
            dlib::assign_image(img, cv_image<rgb_pixel>(frame));
            // Make the image larger so we can detect small faces.
            pyramid_up(img);
            dets = detector(img);
            tm2.stop();
            cout << "Number of faces detected: " << dets.size() << endl;
            cout << "face detect elapsed time: " << tm2.getTimeMilli() << endl;
            for (auto box : dets) {
                int x1 = box.left();
                int y1 = box.top();
                int w = box.width();
                int h = box.height();


                cv::rectangle(frame, Rect(x1, y1, w, h), Scalar(0, 0, 255), 1);
            }

            cv::imshow("src", frame);
            cv::waitKey(1);

        }
    }
    cp.release();
    frame.release();
    face_roi.release();
    delete &img;

    system("pause");
    return 0;
}
复制代码

2 libfacedetectcnn

github: https://github.com/ShiqiYu/libfacedetection
依赖:opencv-3.4.2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "common.h"
#include "opencv_base.h"
 
#include "facedetectcnn.h"
//define the buffer size. Do not change the size!
#define DETECT_BUFFER_SIZE 0x20000
 
int SGHHFTHR() {
    string image_path = "..\\images\\epoch029_idt_A.png";
    Mat image = imread(image_path);
 
    int * pResults = NULL;
    //pBuffer is used in the detection functions.
    //If you call functions in multiple threads, please create one buffer for each thread!
    unsigned char * pBuffer = (unsigned char *)malloc(DETECT_BUFFER_SIZE);
    if (!pBuffer)
    {
        fprintf(stderr, "Can not alloc buffer.\n");
        return -1;
    }
    ///////////////////////////////////////////
    // CNN face detection
    // Best detection rate
    //////////////////////////////////////////
    //!!! The input image must be a BGR one (three-channel) instead of RGB
    //!!! DO NOT RELEASE pResults !!!
    pResults = facedetect_cnn(pBuffer, (unsigned char*)(image.ptr(0)), image.cols, image.rows, (int)image.step);
 
    printf("%d faces detected.\n", (pResults ? *pResults : 0));
    //print the detection results
    for (int i = 0; i < (pResults ? *pResults : 0); i++)
    {
        short * p = ((short*)(pResults + 1)) + 142 * i;
        int x = p[0];
        int y = p[1];
        int w = p[2];
        int h = p[3];
        int confidence = p[4];
        int angle = p[5];
 
        printf("face_rect=[%d, %d, %d, %d], confidence=%d, angle=%d\n", x, y, w, h, confidence, angle);
        rectangle(image, Rect(x, y, w, h), Scalar(0, 255, 0), 2);
    }
 
 
    imshow("src", image);
    waitKey(0);
 
 
    //release the buffer
    free(pBuffer);
    system("pause");
    return 0;
}

  

3 LFFD
github: https://github.com/Linzaer/Ultra-Light-Fast-Generic-Face-Detector-1MB
依赖:
ncnn
opencv-3.4.2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "common.h"
#include "opencv_base.h"
#include "helper.h"
#include "ncnn_base.h"
#include "run.h"
#include "UltraFace.hpp"
 
//人脸检测 
#define LFFD_FACE_DET_MODEL_PARAM "..\\models\\face_detect\\LFFD\\version-slim\\slim_320.param"
#define LFFD_FACE_DET_MODEL_BIN "..\\models\\face_detect\\LFFD\\version-slim\\slim_320.bin"
 
 
int LFFD_FACE_DETECT() {
    string param_path = LFFD_FACE_DET_MODEL_PARAM, bin_path = LFFD_FACE_DET_MODEL_BIN;
    assert(exist_file(param_path));
    assert(exist_file(bin_path));
    UltraFace *ultraface = new UltraFace(bin_path, param_path, 320, 240, 2, 0.7); // config model input
    vector<FaceInfo> face_boxes;
    TickMeter tm;
 
    string video_path = "../videos/bilibili/1.mp4";
    assert(exist_file(video_path));
 
    VideoCapture cp;
    Mat frame, input_frame;
    char str_tmp[200];
    int frame_idx = 0;
    ncnn::Mat ncnn_img;
    if (cp.open(video_path)) {
        int total_num = cp.get(CAP_PROP_FRAME_COUNT);
        cout << "total frame count: " << total_num << endl;
        while (cp.read(frame))
        {
            cvtColor(frame, input_frame, COLOR_BGR2RGB);
            int src_w = frame.cols, src_h = frame.rows;
            tm.reset();
            tm.start();
            face_boxes.clear();
            ncnn_img = ncnn::Mat::from_pixels(input_frame.data, ncnn::Mat::PIXEL_RGB, src_w, src_h);
            ultraface->detect(ncnn_img, face_boxes);
            ncnn_img.release();
            tm.stop();
            cout << "face detect elapsed: " << tm.getTimeMilli() << " ms" << endl;
            printf("face num: %d \n", (int)face_boxes.size());
            for (auto box : face_boxes) {
                int x1 = box.x1;
                int y1 = box.y1;
                int w = box.x2 - x1;
                int h = box.y2 - y1;
 
                rectangle(frame, Rect(x1, y1, w, h), Scalar(255, 0, 0), 1);
            }
 
            imshow("src", frame);
            waitKey(40);
        }
    }
 
    destroyAllWindows();
    cp.release();
    frame.release();
    input_frame.release();
    delete ultraface;
 
 
    system("pause");
    return 0;
}

  

4 mtcnn
github: https://github.com/cpuimage/MTCNN
依赖:
ncnn
opencv-3.4.2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "common.h"
#include "opencv_base.h"
#include "helper.h"
#include "ncnn_base.h"
#include "mtcnn.h"
#include "run.h"
 
 
int MTCNN_FACE_DETECT() {
    string model_path = "../models/face_detect/mtcnn";
    vector<Bbox> finalBbox;
    MTCNN *mtcnn = new MTCNN(model_path);
    int miniFace = 40;
    mtcnn->SetMinFace(miniFace);
    TickMeter tm;
 
 
    //string video_path = "../videos/bilibili/2.mp4";
    string video_path = "../images/expression_images/2-0.jpg";
    assert(exist_file(video_path));
 
    VideoCapture cp;
    Mat frame, input_frame;
    char str_tmp[200];
    int frame_idx = 0;
    ncnn::Mat ncnn_img;
    if (cp.open(video_path)) {
        int total_num = cp.get(CAP_PROP_FRAME_COUNT);
        cout << "total frame count: " << total_num << endl;
        while (cp.read(frame))
        {
            cvtColor(frame, input_frame, COLOR_BGR2RGB);
            int src_w = frame.cols, src_h = frame.rows;
            tm.reset();
            tm.start();
            ncnn_img = ncnn::Mat::from_pixels(input_frame.data, ncnn::Mat::PIXEL_RGB, src_w, src_h);
            mtcnn->detect(ncnn_img, finalBbox);
            ncnn_img.release();
            tm.stop();
            cout << "face emotion elapsed: " << tm.getTimeSec() << " s" << endl;
            printf("face num: %d \n", (int)finalBbox.size());
            for (auto box : finalBbox) {
                // face box
                int x1 = box.x1;
                int y1 = box.y1;
                int w = box.x2 - x1;
                int h = box.y2 - y1;
                rectangle(frame, Rect(x1, y1, w, h), Scalar(255, 0, 0), 1);
 
                //landmark 5
                for (size_t j = 0; j < 5; j ++)
                {
                    float x = box.ppoint[j], y = box.ppoint[j + 5];
                    circle(frame, Point2d(x, y), 3, Scalar(0, 255, 0), 2);
                }
 
            }
 
            imshow("src", frame);
            waitKey(0);
        }
    }
 
    destroyAllWindows();
    cp.release();
    frame.release();
    input_frame.release();
    delete mtcnn;
 
 
    system("pause");
    return 0;
}

  5 opencv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#define OPENCV_PATH "D:\\Program Files\\opencv-3.4.2"
#define OPENCV_MODEL_PATH  "D:\\Program Files\\opencv-3.4.2\\data\\haarcascades"
 
string video_path = "..\\videos\\bilibili\\4.mp4";
    assert(exist_file(video_path));
    string opencv_model_path = OPENCV_MODEL_PATH;
    string opencv_face_model = opencv_model_path + "\\haarcascade_frontalface_alt2.xml";
    assert(exist_file(opencv_face_model));
 
    CascadeClassifier detector = CascadeClassifier(opencv_face_model);
    assert(!detector.empty());
 
    TickMeter tm;
    VideoCapture cp;
    Mat frame, gray;
    vector<Rect> boxes;
    if (cp.open(video_path)) {
        int total_num = cp.get(CAP_PROP_FRAME_COUNT);
        //cout << "total frame count: " << total_num << endl;
        while (cp.read(frame))
        {
            boxes.clear();
            cvtColor(frame, gray, COLOR_BGR2GRAY);
            tm.reset();
            tm.start();
            detector.detectMultiScale(gray, boxes, 1.5, 3, 0);
            tm.stop();
            cout << "face detect elapsed time: " << tm.getTimeMilli() << endl;
            //cout << "检测到人脸个数:" << boxes.size() << endl;
            if (boxes.size() > 0) {
                for (auto box : boxes) {
                    box.height *= 1.05;
                    rectangle(frame, box, Scalar(0, 0, 255), 1);
                }
            }
 
            imshow("src", frame);
            waitKey(5);
 
        }
    }
 
    system("pause");
    return 0;

  

posted @   dangxusheng  阅读(710)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示