利用Landmarks进行人脸对齐裁剪是人脸检测中重要的一个步骤。效果如下图所示:

基本思路为:

a.人脸检测

  人脸的检测不必多说了,基本Cascade的方式已经很不错了,或者用基于HOG/FHOG的SVM/DPM等。这些在OpenCVDLIB都有。

b.在检测到的人脸上进行Landmarks检测,获得一系列的Landmark点

  对齐算法很多,特别是前几年人脸对齐获得了巨大的成功。

  [1].One Millisecond Face Alignment with an Ensemble of Regression Trees by Vahid Kazemi and Josephine Sullivan, CVPR 2014

  [2].人脸对齐SDM原理----Supervised Descent Method and its Applications to Face Alignment

c.利用检测到的Landmarks和模板的Landmarks,计算仿射矩阵H;然后利用H,直接计算得到对齐后的图像。

  直接上代码:

#include <opencv2/opencv.hpp>
using namespace cv;
//原始图像大小
#define IMAGE_WIDTH 640
#define IMAGE_HEIGHT 480
//输出的图像大小(裁剪后的)
#define IMAGE_WIDTH_STD 90
#define IMAGE_HEIGHT_STD 90 #define LANDMARK_SIZE 8//对齐点的个数
#define LANDMARK_SIZE_DOUBLE 16//对齐点个数的两倍 Point2f srcTri[LANDMARK_SIZE];//对齐点的Point2f数组,检测到的人脸对齐点,注意这里是基于原始图像的坐标点
Point2f destTri[LANDMARK_SIZE];//对齐点的Point2f数组,模板的Landmarks,注意这是一个基于输出图像大小尺寸的坐标点
//对齐点的double数组
double template_landmark[LANDMARK_SIZE_DOUBLE] = {
0.0792396913815, 0.339223741112, 0.0829219487236, 0.456955367943,
0.0967927109165, 0.575648016728, 0.122141515615, 0.691921601066,
0.168687863544, 0.800341263616, 0.239789390707, 0.895732504778,
0.325662452515, 0.977068762493, 0.422318282013, 1.04329000149,
0.531777802068, 1.06080371126, 0.641296298053, 1.03981924107,
0.738105872266, 0.972268833998, 0.824444363295, 0.889624082279,
0.894792677532, 0.792494155836, 0.939395486253, 0.681546643421,
0.96111933829, 0.562238253072, 0.970579841181, 0.441758925744
}; int main()
{
VideoCapture vcap;
if (!vcap.open())
{
return ;
} for (int i = ; i < LANDMARK_SIZE; i++)
{
srcTri[i] = Point2f(template_landmark[i * ] * + IMAGE_HEIGHT / , template_landmark[i * + ] * + IMAGE_WIDTH / );
destTri[i] = Point2f(template_landmark[i * ] * IMAGE_HEIGHT_STD, template_landmark[i * + ] * IMAGE_WIDTH_STD);
}
//Mat warp_mat = getAffineTransform( srcTri, destTri );//使用仿射变换,计算H矩阵
Mat warp_mat = cv::estimateRigidTransform(srcTri, destTri, false);//使用相似变换,不适合使用仿射变换,会导致图像变形
Mat frame;
Mat warp_frame(, , CV_8UC3);
while ()
{
vcap >> frame;
warpAffine(frame, warp_frame, warp_mat, warp_frame.size());//裁剪图像 imshow("frame", frame);//显示原图像
imshow("warp_frame", warp_frame);//显示裁剪后得到的图像 waitKey();
}
return ;
}

效果图:

注意以上效果非真实的对齐裁剪的效果。实际的对齐裁剪可以做的很好。

基于Landmark的人脸对齐以及裁剪方法的更多相关文章

  1. MTCNN算法与代码理解—人脸检测和人脸对齐联合学习

    目录 写在前面 算法Pipeline详解 如何训练 损失函数 训练数据准备 多任务学习与在线困难样本挖掘 预测过程 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 主 ...

  2. 机器学习--详解人脸对齐算法SDM-LBF

    引自:http://blog.csdn.net/taily_duan/article/details/54584040 人脸对齐之SDM(Supervised Descent Method) 人脸对齐 ...

  3. 机器学习----人脸对齐的算法-ASM.AAM..CLM.SDM

    引自:http://blog.csdn.net/linolzhang/article/details/55271815 人脸检测 早已比较成熟,传统的基于HOG+线性分类器 的方案检测效果已经相当不错 ...

  4. OpenCV Facial Landmark Detection 人脸关键点检测

    Opencv-Facial-Landmark-Detection 利用OpenCV中的LBF算法进行人脸关键点检测(Facial Landmark Detection) Note: OpenCV3.4 ...

  5. 使用Dlib来运行基于CNN的人脸检测

    检测结果如下 这个示例程序需要使用较大的内存,请保证内存足够.本程序运行速度比较慢,远不及OpenCV中的人脸检测. 注释中提到的几个文件下载地址如下 http://dlib.net/face_det ...

  6. 基于 OpenCV 的人脸识别

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

  7. 人脸对齐SDM原理----Supervised Descent Method and its Applications to Face Alignment

    最近组里研究了SDM算法在人脸对齐中的应用,是CMU的论文<Supervised Descent Method and its Applications to Face Alignment> ...

  8. 【计算机视觉】基于OpenCV的人脸识别

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

  9. [信安Presentation]一种基于GPU并行计算的MD5密码解密方法

    -------------------paper--------------------- 一种基于GPU并行计算的MD5密码解密方法 0.abstract1.md5算法概述2.md5安全性分析3.基 ...

随机推荐

  1. maxout激活函数

    maxout的拟合能力是非常强的,它可以拟合任意的的凸函数.最直观的解释就是任意的凸函数都可以由分段线性函数以任意精度拟合(学过高等数学应该能明白),而maxout又是取k个隐隐含层节点的最大值,这些 ...

  2. Oracle 函数 “申请通过后,将该表中循环遍历到的所有内容插到另一个表中”

    create or replace function mcode_apply_insert_material(p_mca_no VARCHAR2, p_action VARCHAR2, p_wf_no ...

  3. [经典算法题]寻找数组中第K大的数的方法总结

    [经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26   字体:[大 中 小] 打印复制链接我要评论   今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...

  4. (二) Log4j 配置详解

    第一节: rootLogger 根配置 Log4j 根配置语法 log4j.rootLogger = [ level ] , appenderName, appenderName, … 指代 把指定级 ...

  5. 20155225 2006-2007-2 《Java程序设计》第四周学习总结

    20155225 2006-2007-2 <Java程序设计>第四周学习总结 教材学习内容总结 对"是一种"语法测试几次之后,总结一句:满足"是一种" ...

  6. DDD领域模型企业级系统(二)

    用户层: 1.请求应用层获取用户显示的信息 2.发送命令给应用层要求执行某个命令 应用层: 对用户界面提供各种应用功能(包括信息获取与命令执行),应用层不包含业务逻辑,业务层是由应用层调用领域层(领域 ...

  7. Struts 2 Tutorial

    Apache Struts 2 is an elegant, extensible framework for creating enterprise-ready Java web applicati ...

  8. IOS 本地推送

    // 1.打开本地推送并设置属性 NSString *str = @"本地推送的信息"; UIApplication *app = [UIApplication sharedApp ...

  9. Swift2.0语言教程之类的嵌套与可选链接

    Swift2.0语言教程之类的嵌套与可选链接 Swift2.0语言类的嵌套 在一个类中可以嵌套一个或者多个类.它们的嵌套形式也是不同的,大致分为了两种:直接嵌套和多次嵌套.下面依次讲解这两种方式. S ...

  10. 用profile协助程序性能优化

     程序运行慢的原因有很多,比如存在太多的劣化代码(如在程序中存在大量的“.”操作符),但真正的原因往往是比较是一两段设计并不那么良好的不起眼的程序,比如对一序列元素进行自定义的类型转换等.因为程序性能 ...