1. opencv自带的级联人脸检测器
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/objdetect/objdetect.hpp>
using namespace std;
using namespace cv;
int main()
{
//VideoCapture capture(0);
string face_cascade_name = "D:\\Program Files\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_alt2.xml";
CascadeClassifier face_cascade;
Mat frame;
if (!face_cascade.load(face_cascade_name))
{
cout << "load failed" << endl;
return 0;
}
cv::VideoCapture cap(0 + cv::CAP_DSHOW);
while (cap.isOpened())
{
cap >> frame;
vector<Rect> faces;
Mat frame_gray;
vector<Mat> rois;
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
equalizeHist(frame_gray, frame_gray);
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));
for (auto iter = faces.begin(); iter != faces.end(); iter++)
{
rectangle(frame, *iter, Scalar(0, 0, 255), 2);
//rois.push_back(frame(*iter).clone());
rois.push_back(frame(*iter));
}
for (auto iter = rois.begin(); iter != rois.end(); iter++)
{
int rows = iter->rows;
int cols = iter->cols*iter->channels();
for (int i = 0; i < rows; i++)
{
uchar* data = iter->ptr<uchar>(i);
for (int j = 0; j < cols; j++)
{
data[j] = saturate_cast<uchar>(data[j] * 1.1 + 68);
}
}
}
for (int i = 0; i < rois.size(); i++)
{
Mat roi;
GaussianBlur(rois[i], roi, Size(5, 5), 0, 0);
Mat roi1;
bilateralFilter(roi, roi1, 30, 30 * 2, 30 / 2); //双边滤波
Mat matFinal;
GaussianBlur(roi1, matFinal, Size(0, 0), 9);
addWeighted(roi1, 1.5, matFinal, -0.5, 0, rois[i]); //这一步相当于非掩膜锐化
string win_name = "faces_" + to_string(i + 1);
imshow(win_name, rois[i]);
}
imshow("source", frame);
waitKey(1);
}
return 0;
}
2. opencv版本的centerface
3. libfacedetection
https://github.com/ShiqiYu/libfacedetection
4. ncnn版本的retinaface
https://github.com/Tencent/ncnn/blob/master/examples/retinaface.cpp