前言

依赖库: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, 0));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 = 4;//测试的人脸数量
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(1);}// 如果没有读取到足够图片,我们也得退出.if (images.size() <= 1) {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(80);//创建人脸识别类 可修改 LBPHFace、EigenFace、FisherFacemodel->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(50, 50), FONT_HERSHEY_DUPLEX, 3, Scalar(230, 255, 0), 2);//model->predict(frame) = predictLabel 名字写在 1 1imshow("Face Recogniton", frame);waitKey(1);}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(92, 112));//裁剪cv::Mat Mask = cv::imread("mask.jpg", 0);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(0)), gray.cols, gray.rows, gray.step, 1.2f, 5, 24);int peopleNUM = (pResults ? *pResults : 0);for (int i = 0; i < peopleNUM; i++)//代表有几张人脸(pResults ? *pResults : 0){short * p = ((short*)(pResults + 1)) + 6 * i;Rect opencvRect(p[0], p[1], p[2], p[3]);//gray = gray(opencvRect);cv::rectangle(frame, opencvRect, Scalar(230, 255, 0));dlib::rectangle dlibRect((long)opencvRect.tl().x, (long)opencvRect.tl().y, (long)opencvRect.br().x - 1, (long)opencvRect.br().y - 1);//人脸对齐技术提高了准确率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[0]);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图片:

转载于:https://www.cnblogs.com/mtcnn/p/9412040.html

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

  1. 使用opencv的LBF算法进行人脸关键点检测

    首先下载最新的opencv 和opencv_contrib, 然后按照在Windows下编译扩展OpenCV 3.1.0 + opencv_contrib的方法进行编译,其中核心一点就是先编译open ...

  2. 【技术综述】人脸关键点检测的数据集与核心算法

    人脸关键点检测是诸如人脸识别.表情分析.三维人脸重建等其它人脸相关任务的基础.近些年来,深度学习方法已被成功应用到了人脸的关键点检测,本章将介绍深度学习方法在人脸关键点检测方向的研究.包括人脸关键点任 ...

  3. 计算机视觉未来的挑战,搜狗斩获ICPR 2020人脸关键点检测挑战赛冠军 计算机视觉技术持续领先...

    作为3D 人脸重建.人脸识别.表情迁移及美化等应用的核心基础技术,人脸关键点检测算法一直是工业界和学术界的研究热点. 近日,在第25届国际模式识别大会(ICPR 2020)举办的人脸106关键点检测挑 ...

  4. OpenCV基于dlib进行人脸关键点检测(摄像头)

    1. dlib.get_frontal_face_detector()获取人脸检测器 2. dlib.shape_predictor()预测人脸关键点 人脸关键点模型,下载地址: http://dli ...

  5. 基于Python,dlib实现人脸关键点检测

    @代码实现及安装过程 基于Python,dlib实现人脸关键点检测 dilb 在做人脸检测人脸识别方面用到比较多的.face_recognition就是基于dlib实现的. 这篇文章将使用Python ...

  6. 使用OpenCV进行人脸关键点检测

    使用OpenCV进行人脸关键点检测 1 双脸效果 2 单脸效果

  7. caffe 人脸关键点检测_人脸检测关键点新增至81个,比Dlib更精准、更贴边

    人脸关键点检测是人脸识别和分析领域中的关键一步,它是诸如自动人脸识别.表情分析.三维人脸重建及三维动画等其它人脸相关问题的前提和突破口. 虽然人脸的结构是确定的,由眉毛.眼睛.鼻子和嘴等部位组成,近似 ...

  8. 【dlib库】进行人脸检测+人脸关键点检测+人脸对齐

    原图像: 1. 人脸检测 import cv2 import dlib import matplotlib.pyplot as plt # 获取图片 my_img = cv2.imread('my_i ...

  9. OpenCV实战之人脸美颜美型(三)——人脸关键点检测

    目录 前言 标注方式 4点/5点/6点标注 68点标注 人脸关键点评价指标 检测方法概述 使用OpenCV实现人脸关键点检测 Facemark API 基于LBF的人脸关键点检测 API调用 前言 人 ...

最新文章

  1. 用python实现的抓取腾讯视频所有电影的爬虫
  2. mysql删除root用户密码_MySQL忘记密码 或者误删除root用户有效解决办法
  3. 神策数据司沛:加速车企数字化转型,搭建高质量用户数据平台实战
  4. winform TreeView树节点上下移动
  5. ArcMAP中如何将16位保存的卫星底图,转变为8位表示
  6. TensorFlow 学习(八)—— 梯度计算(gradient computation)
  7. 编码的奥秘之发报机与继电器
  8. Centos中重置MySQL密码
  9. java spring定时器_JAVA中 Spring定时器的两种实现方式
  10. ABAP 透明表操作备忘 刘欣
  11. 基于IDEA Plugin插件开发,撸一个DDD脚手架
  12. 数字英文唯一_福特高光归来!双喷+同级唯一8AT,福克斯“猎装”大杀四方
  13. 公众号第三方平台开发 教程六 代公众号使用JS SDK说明
  14. Android应用架构之Retrofit
  15. 车路协同、智慧交管、自动驾驶场景应有尽有,智能交通行业实战课火爆开启...
  16. GAN框架研究与思路整理
  17. 紧凑存储的杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法
  18. 如何使用Amos做调节效应和有调节的中介作用模型?
  19. 查看云主机是否有显卡,配置如何?
  20. 保护私密文件夹,可以这样设置隐藏起来

热门文章

  1. 【Kattis - triangle 】Sierpiński Circumference(数学,求位数,取对数或Java)
  2. 【HDU - 薛猫猫杯程序设计网络赛】【题解】
  3. 【qduoj - 夏季学期创新题】骑士游历(递推dp)
  4. 【PAT - 1014】福尔摩斯的约会(简单模拟)
  5. 最大素因子(不是题目!自己写着玩的。。。)
  6. 虚拟机安装Linux(vmware + ubuntu)
  7. java关闭文本_如何更优雅的关闭java文本、网络等资源
  8. python编写自制编译器_编译器构造-编译Python
  9. java bip-39_Java中对XML的解析详解
  10. mysql 查看集群状态_MySQL数据库集群正确配置步骤