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
#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
#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
#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
#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;
原文:https://www.cnblogs.com/dxscode/p/12070098.html