1. 简介

这学期的计算机视觉课,我们组的课程项目为“照片自动美化”,其中我负责的模块为人脸检测与自动磨皮。
功能为:用户上传一张照片,自动检测并定位出照片中的人脸,将照片中所有的人脸进行“磨皮”处理,使照片得到自动美化。
完整代码见于GitHub。

2. 重要步骤

人脸检测

OpenCV样例库中自带的训练结果采用的是Viola-Jones框架,选择了一种类Haar矩形特征,采用Ada-Boost这种自适应上升的算法来选择用于分类的特征并进行分类,最后使用弱分类器级联的架构来实现快速运算。
人脸检测使用了OpenCV自带的训练结果,且在OpenCV自带的样例库程序facedetect.cpp的基础上修改而成,故不再放上此部分代码。
计划夏季学期中参考Kaggle上的人脸五官检测项目,换成卷积神经网络重新训练人脸检测模型,到时再更新此部分代码。

磨皮算法

尝试了多种滤波器之后,选用了PS教程《简单探讨可牛影像软件中具有肤质保留功能的磨皮算法及其实现细节》中介绍的算法:

  1. 对原图层image进行双边滤波,结果存入temp1图层中。
  2. temp1图层减去原图层image,将结果存入temp2图层中。
  3. temp2图层进行高斯滤波,结果存入temp3图层中。
  4. 以原图层image为基色,以temp3图层为混合色,将两个图层进行线性光混合得到图层temp4
  5. 考虑不透明度,修正上一步的结果,得到最终图像dst

若用Opacity表示图层4的不透明度,则5个步骤的综合公式为:
dst = (image * (100 - Opacity) + (image + 2 * GaussianBlur (bilateralFilter (image) - image + 128) - 256) * Opacity) /100 ;

将该算法用OpenCV实现的代码如下:

 Mat dst;

 int value1 = , value2 = ;     //磨皮程度与细节程度的确定

 int dx = value1 * ;    //双边滤波参数之一
double fc = value1*12.5; //双边滤波参数之一
int p = ; //透明度
Mat temp1, temp2, temp3, temp4; //双边滤波
bilateralFilter(image, temp1, dx, fc, fc); temp2 = (temp1 - image + ); //高斯模糊
GaussianBlur(temp2, temp3, Size( * value2 - , * value2 - ), , ); temp4 = image + * temp3 - ; dst = (image*( - p) + temp4*p) / ;
dst.copyTo(image);

细节上的难点处理

  • 获取识别结果:OpenCV人脸识别样例中给出的识别结果为圆心和半径,将其转换成矩形区域便于定义兴趣区域进行滤波。
  • 矫正定位结果:为了实现不同长短人脸的完全覆盖,将矩形长度扩大至原来的1.3倍。
  • 鲁棒性检查:
    • 若上一步矫正后矩形区域超过图片尺寸,则以图片尺寸为上下边界。
    • 若出现人脸不完整识别失败的情况,则对整张图片进行磨皮操作。
  • 确定磨皮程度和细节程度参数:经过反复试验,将磨皮程度value1:细节程度value2确定为3:1,并以此确定双边滤波的两个参数dxfc

4. 结果分析

  • 使用了Viola-Jones检测框架,能够实现较高的检测精度,使检测率和误检率分别保持在较高和较低的水平。
  • 磨皮算法效果较好,能够较好地掩盖人脸上的瑕疵,而且较大限度地保留细节、边缘与质感。
  • 在对人脸进行定位时,由于不同的人脸长短不同,Viola-Jones检测框架定位得到的结果不是很准确,导致某张人脸不能完全包括,或另一张人脸包括范围太大。在处理时采取了尽量选择较大范围的原则,在计算人脸矩形的长度时统一将半径扩大至了1.3倍,这样定位出的人脸区域不是很精确。
  • 下一步考虑使用基于HSV色彩空间的人脸分割方法,将人脸准确定位在一个非矩形的区域里,以得到更好的磨皮效果,避免“少磨”或“多磨”了部分区域。

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

转:opencv 美白磨皮人脸检测

-----------------------------------------

opencv实现photoshop 算法:http://download.csdn.net/user/c80486/uploads

opencv 美白磨皮人脸检测<转>的更多相关文章

  1. OpenCV例程实现人脸检测

    前段时间看的OpenCV,其实有很多的例子程序,参考代码值得我们学习,对图像特征提取三大法宝:HOG特征,LBP特征,Haar特征有一定了解后. 对本文中的例子程序刚开始没有调通,今晚上调通了,试了试 ...

  2. OpenCV + python 实现人脸检测(基于照片和视频进行检测)

    OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...

  3. OpenCV入门指南----人脸检测

    本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测(人脸识别).人脸检测可以说是学术界的宠儿,在不少EI,SCI高级别论文都能看到它的身影.甚至很多高校学生的毕业设计都会涉及到人脸检测.当然人脸 ...

  4. Android 中使用 dlib+opencv 实现动态人脸检测

    1 概述 完成 Android 相机预览功能以后,在此基础上我使用 dlib 与 opencv 库做了一个关于人脸检测的 demo.该 demo 在相机预览过程中对人脸进行实时检测,并将检测到的人脸用 ...

  5. OpenCV神技——人脸检测,猫脸检测

    简介   OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 ...

  6. Android—基于OpenCV+Android实现人脸检测

    导读 OpenCV 是一个开源的跨平台计算机视觉库, 采C++语言编写,实现了图像处理和计算机视觉方面的很多通用算法,同时也提供对Python,Java,Android等的支持,这里利用Android ...

  7. 手把手教你如何用 OpenCV + Python 实现人脸检测

    配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文. 必备知识 Haar-like Haar-like百科释义.通俗的来讲 ...

  8. opencv+python实时人脸检测、磨皮

    import numpy as np import cv2 cap = cv2.VideoCapture(0) face_cascade = cv2.CascadeClassifier("d ...

  9. 【转载】opencv实现人脸检测

    全文转载自CSDN的博客(不知道怎么将CSDN的博客转到博客园,应该没这功能吧,所以直接复制全文了),转载地址如下 http://blog.csdn.net/lsq2902101015/article ...

随机推荐

  1. R中的基本函数运算

    一.均值 1.均值:mean(X)#计算所有元素的均值,包括矩阵.向量 2.行均值:apply(x,1,mean) 3.行均值:apply(x,2,mean) 注:如果x是数据框,则返回的就是向量 e ...

  2. 任务1-1 了解Web基本概念

    1.认识网页 从图中可以看到,网页主要由文字.图像和超链接等元素构成.当然,除了这些元素,网页中还可以包含音频.视频及Flash. 为了快速了解网页是如何形成的,接下来查看一下网页的源代码

  3. Java中常见的比较器的实现方法

    在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题. 通常对象之间的比较可以从两个方面去看: 第一个方面:对象的地址是否一样,也就是是否引用自同一个对象.这种方式可以直接使用& ...

  4. 07-THREE.JS 各种形状的几何图形

    <!DOCTYPE html> <html> <head> <title>Example 02.04 - Geometries</title> ...

  5. 项目管理理论与实践(5)——UML应用(下)

    本篇文章介绍UML的相关知识.参考<UML从入门到精通> 六.状态机视图 1. 概述 状态机视图通过对类对象的生存周期建立模型来描述对象随时间变化的动态行为.状态是给定类的对象的一组属性值 ...

  6. 网络编程基础----并发编程 ---守护进程----同步锁 lock-----IPC机制----生产者消费者模型

    1  守护进程: 主进程 创建 守护进程   辅助主进程的运行 设置进程的 daemon属性 p1.daemon=True 1 守护进程会在主进程代码执行结束后就终止: 2 守护进程内无法再开启子进程 ...

  7. 浅谈FFT(快速傅里叶变换)

    本文主要简单写写自己在算法竞赛中学习FFT的经历以及一些自己的理解和想法. FFT的介绍以及入门就不赘述了,网上有许多相关的资料,入门的话推荐这篇博客:FFT(最详细最通俗的入门手册),里面介绍得很详 ...

  8. 如何加快Json 序列化?有哪些方法?

    1.使用阿里的fastjson 2.可以通过去除不必要属性加快序列化.如person对象,有id,name,address,我json需要用户姓名,此时序列化的时候就只序列化name,id和addre ...

  9. 【java规则引擎】之Drools引擎中模拟ReteooStatefulSession内部设计结构

    该片文章只是抽取drools中java代码实现的一些代码结构,帮助我们理解drools是如何实现rete算法的. 该部分只是抽取ReteooStatefulSession工作过程中的代码架构 利用了多 ...

  10. loj 6085.「美团 CodeM 资格赛」优惠券

    题目: 一个有门禁的大楼,初始时里面没有人. 现在有一些人在进出大楼,每个人都有一个唯一的编号.现在有他们进出大楼的记录,但是有些被污染了,只能知道这里有一条记录,具体并不能知道. 一个人只有进大楼, ...