我是靠谱客的博主 烂漫猫咪,最近开发中收集的这篇文章主要介绍利用opencv+flandmark 进行face detection, face alignment and crop,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
平时看论文的过程中发现,用来做测试的人脸需要进行face alignment + crop,这样处理后的准确率通常比之前的准确率要高。本文的工作便是对人脸数据做这样的预处理:
具体步骤
本文主要利用opencv自带的haar分类器进行检测到bounding box后,再通过flandmark检测人眼。flandmark是一个检测脸部特征点的开源代码库
(http://cmp.felk.cvut.cz/~uricamic/flandmark/), 利用flandmark可以检测到左右眼睛的左右角点、鼻子、嘴的左右角点,位置如下:
/*
* 5 1 2 6
*
* 0/7
*
* 3 4
*
*/
检测效果如下:
根据上述眼部特征点计算每只眼睛的中心点并进行连线,计算与水平线之间的夹角,根据这个角度对图片进行仿射变换,如下图:
由此可以得到水平对齐后的图片,此时再进行人脸的剪切,就完成了face alignment和face crop。
代码实现
#include "flandmark_detector.h"
#include "opencv2highgui.hpp"
#include "opencv2imgproc.hpp"
#include "cv.h"
#include "highgui.h"
#include "FileHelper.h" //the file that contains the functions on file operation
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace cv;
using namespace std;
int detectFaceInImage(IplImage* orig, IplImage* input, CvHaarClassifierCascade* cascade,
FLANDMARK_Model *model, int *bbox, double *landmarks);
void FaceAlign(const Mat &orig, double *landmarks, Mat& outputarray);
void cropAlignedFace(Mat *input, CvHaarClassifierCascade* cascade, string saveAddr);
int main(int argc, char** argv)
{
// Haar Cascade file, used for Face Detection.
const char faceCascadeFilename[] = "haarcascade_frontalface_alt.xml";
// ***face detection ***//
CvHaarClassifierCascade* faceCascade;
faceCascade = (CvHaarClassifierCascade*)cvLoad(faceCascadeFilename);
if (!faceCascade)
{
printf("Couldnt load Face detector '%s'n", faceCascadeFilename);
exit(1);
}
// begin flandmark load model
FLANDMARK_Model * model = flandmark_init(
最后
以上就是烂漫猫咪为你收集整理的利用opencv+flandmark 进行face detection, face alignment and crop的全部内容,希望文章能够帮你解决利用opencv+flandmark 进行face detection, face alignment and crop所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复