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. 企业环境中部署 ActiveMQ

    这一章讲述了怎么配置 ActiveMQ 集群.

  2. mysql: 模糊查询 feild like keyword or feild like keyword , concat(feild1,feild2,feild3) like keyword

    mysql: 模糊查询 feild like '%keyword%' or feild like'% keyword%' , 或者 concat(feild1,feild2,feild3) like ...

  3. web自动化:DOM对象

    一. 什么是DOM对象 定义:DOM(Document Object Mode,文档对象模型)是一套web标准,定义了访问HTML文档的一套属性.方法和事件 本质:网页与脚本语言沟通的桥梁.脚本语言通 ...

  4. Shell编程-运算符

    1.declare命令 declare声明变量类型:declare [+/-][选项] 变量名 -:给变量设定类型属性 +:取消变量的类型属性 -a:将变量声明为数组型 -i:整数型 -x:环境变量 ...

  5. pthread_cond_wait() 前使用 while 讲解

    pthread_cond_wait() 前使用 while 讲解 -- : LINUX环境下多线程编程肯定会遇到需要条件变量的情况,此时必然要使用pthread_cond_wait()函数.但这个函数 ...

  6. MFC获得当前应用程序目录的GetCurrentDirectory()和GetModuleFileName()函数

    在 开发过程中经常需要获得程序当前的运行目录,这时就可以使用GetCurrentDirectory()和GetModuleFileName()函 数,GetCurrentDirectory只是返回当前 ...

  7. UVALive - 4270 Discrete Square Roots (扩展欧几里得)

    给出一组正整数$x,n,r$,使得$r^2\equiv x(mod\: n)$,求出所有满足该等式的$r$. 假设有另一个解$r'$满足条件,则有$r^2-r'^2=kn$ 因式分解,得$(r+r') ...

  8. hdu 1937 Finding Seats

    Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  9. 如何让 PADS Layout 识别到板框

    如何让 PADS Layout 识别到板框 在很久很久以前 PADS Laout 还是 PowerPCB 的时候,铺铜是不认识板框的. 当有铺铜时必须复制一份板框再设置为铺铜才可以. 但到了 PADS ...

  10. 在C#中实现截获shell程序的输出

    在Windows环境下的所谓shell程序就是dos命令行程序,比如VC的CL.exe命令行编译器,JDK的javac编译器,启动java程序用的java.exe都是标准的shell程序.截获一个sh ...