人脸检测库libfacedetection介绍

libfacedetection是于仕琪老师放到GitHub上的二进制库,没有源码,它的License是MIT,可以商用。目前只提供了windows 32和64位的release动态库,主页为https://github.com/ShiqiYu/libfacedetection,采用的算法好像是Multi-BlockLBP,提供了四套接口,分别为frontal、frontal_surveillance、multiview、multiview_reinforce,其中multiview_reinforce效果最好,速度比其它稍慢,四套接口的参数类型完全一致,可以根据需要对参数min_neighbors和min_object_width进行调整。

新建一个控制台工程,用来测试libfacedetection,测试代码如下:

#include <iostream>
#include <string>
#include <vector>
#include <facedetect-dll.h>
#include <opencv2/opencv.hpp> int main()
{
std::vector<std::string> images{ "1.jpg", "2.jpg", "3.jpg", "4.jpeg", "5.jpeg", "6.jpg", "7.jpg", "8.jpg", "9.jpg", "10.jpg",
"11.jpeg", "12.jpg", "13.jpeg", "14.jpg", "15.jpeg", "16.jpg", "17.jpg", "18.jpg", "19.jpg", "20.jpg" };
std::vector<int> count_faces{, , , , , , , , , ,
, , , , , , , , , }; std::string path_images{ "E:/GitCode/Face_Test/testdata/" }; if (images.size() != count_faces.size()) {
fprintf(stderr, "their size that images and count_faces are mismatch\n");
return -;
} typedef int* (*detect_face)(unsigned char * gray_image_data, int width, int height, int step,
float scale, int min_neighbors, int min_object_width, int max_object_width); detect_face detect_methods[]{
&facedetect_frontal,
&facedetect_multiview,
&facedetect_multiview_reinforce,
&facedetect_frontal_surveillance
}; std::string detect_type[] {"face frontal", "face multiview", "face multiview reinforce", "face surveillance"}; for (int method = ; method < ; method++) {
detect_face detect = detect_methods[method];
fprintf(stderr, "detect type: %s\n", detect_type[method].c_str()); for (int i = ; i < images.size(); i++) {
cv::Mat src_ = cv::imread(path_images + images[i], );
if (src_.empty()) {
fprintf(stderr, "read image error: %s\n", images[i].c_str());
return -;
} cv::Mat src;
cv::cvtColor(src_, src, CV_BGR2GRAY); int* results = nullptr;
results = detect(src.data, src.cols, src.rows, src.step, 1.2f, , , );
std::string save_result = path_images + std::to_string(method) + "_" + images[i];
//fprintf(stderr, "save result: %s\n", save_result.c_str()); for (int faces = ; faces < (results ? *results : ); faces++) {
short* p = ((short*)(results + )) + * faces;
int x = p[];
int y = p[];
int w = p[];
int h = p[];
int neighbors = p[];
int angle = p[]; fprintf(stderr, "image_name: %s, faces_num: %d, face_rect=[%d, %d, %d, %d], neighbors=%d, angle=%d\n",
images[i].c_str(), *results, x, y, w, h, neighbors, angle); cv::rectangle(src_, cv::Rect(x, y, w, h), cv::Scalar(, , ), );
} cv::imwrite(save_result, src_);
}
} int width = ;
int height = ;
cv::Mat dst(height * , width * , CV_8UC3);
for (int i = ; i < images.size(); i++) {
std::string input_image = path_images + "2_" + images[i];
cv::Mat src = cv::imread(input_image, );
if (src.empty()) {
fprintf(stderr, "read image error: %s\n", images[i].c_str());
return -;
} cv::resize(src, src, cv::Size(width, height), , , );
int x = (i * width) % (width * );
int y = (i / ) * height;
cv::Mat part = dst(cv::Rect(x, y, width, height));
src.copyTo(part);
}
std::string output_image = path_images + "result.png";
cv::imwrite(output_image, dst); fprintf(stderr, "ok\n");
return ;
}

从网上找了20张图像,验证此库的检测率,下图是采用multiview_reinforce接口的检测结果:

GitHubhttps://github.com/fengbingchun/Face_Test

原文地址:http://blog.csdn.net/fengbingchun/article/details/52964163

==========================================================================

Opencv与dlib联合进行人脸关键点检测与识别

前言

依赖库:opencv 2.4.9 /dlib 19.0/libfacedetection 
本篇不记录如何配置,重点在算法实现上。使用libfacedetection实现人脸区域检测,联合dlib标记人脸特征点,最后使用opencv的FaceRecognizer实现人脸识别。

准备工作

1、配置好Opencv2.4.9。(Opencv3.1需要另外下载一个包才有FaceRecognizer) 
2、配置好dlib 19.0(版本其实没有多大关系) 
3、配置好ShiQi.Yu的人脸检测库

思想

训练模块:人脸检测——>获取人脸区域的点坐标——>人脸关键点标记——>人脸对正——>归一化处理——>保存图片——>手动筛选图片——>训练样本——>得到train.xml 
识别模块:读取train.xml——>循环(人脸检测——>获取人脸区域的点坐标——>人脸关键点标记——>人脸对正——>归一化处理——>送入model->predict——>预测出结果——>putText在方框上写出名字)

结果

识别速度:0.15~0.25秒,Release平台。 
识别精度:还可以,基本不会识别错,样本没有选择需要识别的东西哦。 
使用了一段中国好声音的视频做识别。 
 
 
 
当然,这里用的是Fisherface算法,主要还是样本不多,已经可以搞定了。

代码

ReadCSV.h

#include <opencv.hpp>
#include <iostream>
#include <fstream>
using namespace cv;
using namespace std;
static void read_csv(const string& filename, cv::vector<Mat>& images, cv::vector<int>& labels, char separator = ';') {
std::ifstream file(filename.c_str(), ifstream::in);
if (!file) {
string error_message = "No valid input file was given, please check the given filename.";
CV_Error(CV_StsBadArg, error_message);
}
string line, path, classlabel;
while (getline(file, line)) {
stringstream liness(line);
getline(liness, path, separator);
getline(liness, classlabel);
if (!path.empty() && !classlabel.empty()) {
images.push_back(imread(path, ));
labels.push_back(atoi(classlabel.c_str()));
}
}
}

FaceRotate.h

#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/image_processing/render_face_detections.h>
#include <dlib/image_processing.h>
#include <dlib/gui_widgets.h>
#include <dlib/image_io.h>
#include<dlib/opencv/cv_image.h>
#include <dlib/opencv.h> using namespace dlib; frontal_face_detector detector = get_frontal_face_detector();
shape_predictor sp;//Already get

FaceRecognition.cpp

#include <FaceDetect.h>
#include <ReadCSV.h>
const int namenumber = ;//测试的人脸数量
const string textname[namenumber] = { "Hariem", "Miss.Na", "Mr.Wang", "Jay.Chou" };//做一个储存人脸名字的数组 Ptr<FaceRecognizer> GetTrainModel(string fn_csv)//输入CSV文件的路径名
{
vector<Mat> images;
vector<int> labels;
try {
read_csv(fn_csv, images, labels);
}
catch (cv::Exception& e) {
cerr << "Error opening file \"" << fn_csv << "\". Reason: " << e.msg << endl;
// 文件有问题,我们啥也做不了了,退出了
exit();
}
// 如果没有读取到足够图片,我们也得退出.
if (images.size() <= ) {
string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!";
CV_Error(CV_StsError, error_message);
}
Ptr<FaceRecognizer> model = createEigenFaceRecognizer();//创建人脸识别类 可修改 LBPHFace、EigenFace、FisherFace
model->train(images, labels);
return model;
} int main()
{
Dlib_Predefine();//加载dlib的文件
Ptr<FaceRecognizer> model = GetTrainModel("face.csv");//获得模型
VideoCapture cap("好声音.mp4");
Mat frame,gray;
while (true)
{
cap >> frame;
if (!frame.empty())
{
gray = FaceDetect(frame);
if (!gray.empty())
putText(frame, textname[model->predict(gray)], Point(, ), FONT_HERSHEY_DUPLEX, , Scalar(, , ), );//model->predict(frame) = predictLabel 名字写在 1 1
imshow("Face Recogniton", frame);
waitKey();
}
else{ cout << "The Video's end." <<endl; break; }
} }

FaceDetect.cpp

用了掩码。

#include <FaceDetect.h>
#include <FaceRotate.h>
void Dlib_Predefine()
{
deserialize("shape_predictor_68_face_landmarks.dat") >> sp;//读入标记点文件
} cv::Mat FaceToOne(cv::Mat source)//归一化处理函数
{ cv::equalizeHist(source, source);//直方图均衡
cv::resize(source, source, cv::Size(, ));//裁剪
cv::Mat Mask = cv::imread("mask.jpg", );
cv::Mat changedMask;
source.copyTo(changedMask, Mask);
return changedMask;
} Mat FaceDetect(Mat frame)//脸是否存在
{
Mat gray, error;
cvtColor(frame, gray, CV_BGR2GRAY);
int * pResults = NULL;
pResults = facedetect_frontal_tmp((unsigned char*)(gray.ptr()), gray.cols, gray.rows, gray.step, 1.2f, , );
int peopleNUM = (pResults ? *pResults : ); for (int i = ; i < peopleNUM; i++)//代表有几张人脸(pResults ? *pResults : 0)
{
short * p = ((short*)(pResults + )) + * i;
Rect opencvRect(p[], p[], p[], p[]);
//gray = gray(opencvRect);
cv::rectangle(frame, opencvRect, Scalar(, , ));
dlib::rectangle dlibRect((long)opencvRect.tl().x, (long)opencvRect.tl().y, (long)opencvRect.br().x - , (long)opencvRect.br().y - );
//人脸对齐技术提高了准确率
dlib::full_object_detection shape = sp(dlib::cv_image<uchar>(gray), dlibRect);//标记点
std::vector<full_object_detection> shapes;
shapes.push_back(shape);//把点保存在了shape中
dlib::array<array2d<rgb_pixel>> face_chips;
extract_image_chips(dlib::cv_image<uchar>(gray), get_face_chip_details(shapes), face_chips);
Mat pic = toMat(face_chips[]);
cvtColor(pic, pic, CV_BGR2GRAY);
return FaceToOne(pic);
}
return error;
}

FaceDetect.h

#include <opencv.hpp>
#include "facedetect-dll.h" using namespace cv;
using namespace std; Mat FaceDetect(Mat frame);
void Dlib_Predefine();//dlib 预定义的函数

FaceRotate.h

#include <dlib/image_processing/frontal_face_detector.h>
#include <dlib/image_processing/render_face_detections.h>
#include <dlib/image_processing.h>
#include <dlib/gui_widgets.h>
#include <dlib/image_io.h>
#include<dlib/opencv/cv_image.h>
#include <dlib/opencv.h> using namespace dlib; frontal_face_detector detector = get_frontal_face_detector();
shape_predictor sp;//Already get

Mask图片: 

有几个说明

已经全部更正。

原文地址:http://blog.csdn.net/mr_curry/article/details/51994497

==========================================================

如何快糙好猛的使用libfacedetection库【最新版】

前言

最近已经很少看CSDN了。这一年多准备考研,基本上怕是不会再怎么上了。以前有一个http://blog.csdn.net/mr_curry/article/details/51804072 如何快糙好猛的使用Shiqi.Yu老师的公开人脸检测库(附源码)的BLOG,因为于老师的库已经更新了,所以重新写一下吧。 
PS:这个库越来越强了,已经可以做人脸关键点检测了。关键点检测可以用于矫正人脸,再也不要用慢的要死的dlib啦~~

配置

五张图带你解决问题:(X64,Debug) 


然后你需要把opencv的属性表也引进来: 

两个方法,加系统变量或者放到和exe同一个文件夹下。加了系统变量后重启一次才生效,所以这里就直接放咯

代码

我们直接用FDDB上评测效果最好的函数:facedetect_multiview_reinforce

#include <opencv.hpp>
#include <facedetect-dll.h>
using namespace cv;
using namespace std; //define the buffer size. Do not change the size!
#define DETECT_BUFFER_SIZE 0x20000 int main()
{
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 -;
}
Mat src = imread("img.jpg");
Mat gray;
cvtColor(src, gray, CV_BGR2GRAY);
int doLandmark = ;// do landmark detection
pResults = facedetect_multiview_reinforce(pBuffer, (unsigned char*)(gray.ptr()), gray.cols, gray.rows, (int)gray.step,
1.2f, , , , doLandmark);
//print the detection results
for (int i = ; i < (pResults ? *pResults : ); i++)
{
short * p = ((short*)(pResults + )) + * i;
rectangle(src, Rect(p[], p[], p[], p[]), Scalar(, , ), );
if (doLandmark)
{
for (int j = ; j < ; j++)
circle(src, Point((int)p[ + * j], (int)p[ + * j + ]), , Scalar(, , ),);
}
}
imshow("Show", src);
waitKey();
}

效果还是很赞: 

视频流中的人脸检测代码就是用VideoCapture解析为Mat然后循环检测啊:

#include <opencv.hpp>
#include <facedetect-dll.h>
using namespace cv;
using namespace std; //define the buffer size. Do not change the size!
#define DETECT_BUFFER_SIZE 0x20000 int main()
{
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 -;
}
int doLandmark = ;// do landmark detection
VideoCapture cap();
if (!cap.isOpened()){
cout << "Please check your USB camera's interface num." << endl;
return ;
}
Mat src;
while (true)
{
cap >> src;
if (!src.empty()){
Mat gray;
cvtColor(src, gray, CV_BGR2GRAY);
pResults = facedetect_multiview_reinforce(pBuffer, (unsigned char*)(gray.ptr()), gray.cols, gray.rows, (int)gray.step,
1.2f, , , , );
for (int i = ; i < (pResults ? *pResults : ); i++)
{
short * p = ((short*)(pResults + )) + * i;
rectangle(src, Rect(p[], p[], p[], p[]), Scalar(, , ), );
if (doLandmark)
{
for (int j = ; j < ; j++)
circle(src, Point((int)p[ + * j], (int)p[ + * j + ]), , Scalar(, , ), );
}
}
imshow("Show", src);
waitKey();
} }
}

原文地址:http://blog.csdn.net/Mr_Curry/article/details/65945071

人脸识别-<转>的更多相关文章

  1. OpenCV人脸识别Eigen算法源码分析

    1 理论基础 学习Eigen人脸识别算法需要了解一下它用到的几个理论基础,现总结如下: 1.1 协方差矩阵 首先需要了解一下公式: 共公式可以看出:均值描述的是样本集合的平均值,而标准差描述的则是样本 ...

  2. OpenCV人脸识别LBPH算法源码分析

    1 背景及理论基础 人脸识别是指将一个需要识别的人脸和人脸库中的某个人脸对应起来(类似于指纹识别),目的是完成识别功能,该术语需要和人脸检测进行区分,人脸检测是在一张图片中把人脸定位出来,完成的是搜寻 ...

  3. jQuery 人脸识别插件,支持图片和视频

    jQuery Face Detection 是一款人脸检测插件,能够检测到图片,视频和画布中的人脸坐标.它跟踪人脸并输出人脸模型的坐标位置为一个数组.我们相信,面部识别技术能够给我们的 Web 应用带 ...

  4. 主成分分析 (PCA) 与其高维度下python实现(简单人脸识别)

    Introduction 主成分分析(Principal Components Analysis)是一种对特征进行降维的方法.由于观测指标间存在相关性,将导致信息的重叠与低效,我们倾向于用少量的.尽可 ...

  5. 【Win10 应用开发】人脸识别

    可能你会认为人脸识别用起来会很复杂,老周当初也这么想,但通过实际操作后,我发现非然. 经过微软封装的东西,向来都是复杂问题简单化,只要用得舒心,代码越少越好,用最少的代码做最多的事情,此为大师境界也. ...

  6. 关于opencv中人脸识别主函数的部分注释详解。

    近段时间在搞opencv的视频人脸识别,无奈自带的分类器的准确度,实在是不怎么样,但又能怎样呢?自己又研究不清楚各大类检测算法. 正所谓,功能是由函数完成的,于是自己便看cvHaarDetectObj ...

  7. Opencv摄像头实时人脸识别

    Introduction 网上存在很多人脸识别的文章,这篇文章是我的一个作业,重在通过摄像头实时采集人脸信息,进行人脸检测和人脸识别,并将识别结果显示在左上角. 利用 OpenCV 实现一个实时的人脸 ...

  8. paper 129 : 比较好的开源人脸识别软件

    1.face.com 以色列公司,某年六月时被Facebook收购,同时暂停了API服务,之前测试过他们的服务,基本上是了解到的应用中做得最牛的了. 2.orbe Orbeus由麻省理工学院和波士顿大 ...

  9. 【《zw版·Halcon与delphi系列原创教程》 zw_halcon人脸识别

    [<zw版·Halcon与delphi系列原创教程>zw_halcon人脸识别 经常有用户问,halcon人脸识别方面的问题. 可能是cv在人脸识别.车牌识别方面的投入太多了. 其实,人脸 ...

  10. opencv 人脸识别

      背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...

随机推荐

  1. curl使用记录

    $header = array("Connection: Keep-Alive", "Accept: text/html,application/xhtml+xml,ap ...

  2. 039——VUE中组件之子组件中data使用实例与text-xtemplate的使用方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. mysql迁移oracle

    有很多应用项目, 刚起步的时候用MYSQL数据库基本上能实现各种功能需求,随着应用用户的增多,数据量的增加,MYSQL渐渐地出现不堪重负的情况:连接很慢甚至宕机,于是就有把数据从MYSQL迁到Orac ...

  4. FZU 2150 Fire Game 广度优先搜索,暴力 难度:0

    http://acm.fzu.edu.cn/problem.php?pid=2150 注意这道题可以任选两个点作为起点,但是时间仍足以穷举两个点的所有可能 #include <cstdio> ...

  5. jstree 取消选中父节点

    问题说明: 当选择子节点时,它的父节点只有一个子节点的情况下,默认会选中父节点. 当前应用场景: 不需要选中当前的父节点 实验截图: 修改部分: jstree.js 信息

  6. C# 解决datatable写入文件内存溢出问题

    1.程序生成目标平台设为x64 2.文件写入后主动回收内存

  7. 接口测试Fiddler实战20150921

    (写好的文章被不小心删掉了,现在补一篇) 项目背景: 1.接口URL:http://192.168.xx.xx:8080/mserver/rest/ms 2.接口参数:data=xxxxx&k ...

  8. Linux运维学习笔记-文件系统知识体系总结

    文件系统知识总结 新买的硬盘要存放数据需要怎么做? 首先将硬盘装机做RAID,做完RAID后进行分区,分完区后格式化创建文件系统,最后存放数据. 硬盘的内外部结构: 物理形状: 接口类型: IDE(I ...

  9. B树、B-树、B+树、B*树都是什么

    B树.B-树.B+树.B*树都是什么 B树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右 ...

  10. 51Nod 1006:最长公共子序列Lcs(打印LCS)

    1006 最长公共子序列Lcs  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的). ...