opencv 美白磨皮人脸检测<转>
1. 简介
这学期的计算机视觉课,我们组的课程项目为“照片自动美化”,其中我负责的模块为人脸检测与自动磨皮。
功能为:用户上传一张照片,自动检测并定位出照片中的人脸,将照片中所有的人脸进行“磨皮”处理,使照片得到自动美化。
完整代码见于GitHub。
2. 重要步骤
人脸检测
OpenCV样例库中自带的训练结果采用的是Viola-Jones框架,选择了一种类Haar矩形特征,采用Ada-Boost这种自适应上升的算法来选择用于分类的特征并进行分类,最后使用弱分类器级联的架构来实现快速运算。
人脸检测使用了OpenCV自带的训练结果,且在OpenCV自带的样例库程序facedetect.cpp
的基础上修改而成,故不再放上此部分代码。
计划夏季学期中参考Kaggle上的人脸五官检测项目,换成卷积神经网络重新训练人脸检测模型,到时再更新此部分代码。
磨皮算法
尝试了多种滤波器之后,选用了PS教程《简单探讨可牛影像软件中具有肤质保留功能的磨皮算法及其实现细节》中介绍的算法:
- 对原图层
image
进行双边滤波,结果存入temp1
图层中。 - 将
temp1
图层减去原图层image
,将结果存入temp2
图层中。 - 对
temp2
图层进行高斯滤波,结果存入temp3
图层中。 - 以原图层
image
为基色,以temp3
图层为混合色,将两个图层进行线性光混合得到图层temp4
。 - 考虑不透明度,修正上一步的结果,得到最终图像
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,并以此确定双边滤波的两个参数dx
和fc
。
4. 结果分析
- 使用了Viola-Jones检测框架,能够实现较高的检测精度,使检测率和误检率分别保持在较高和较低的水平。
- 磨皮算法效果较好,能够较好地掩盖人脸上的瑕疵,而且较大限度地保留细节、边缘与质感。
- 在对人脸进行定位时,由于不同的人脸长短不同,Viola-Jones检测框架定位得到的结果不是很准确,导致某张人脸不能完全包括,或另一张人脸包括范围太大。在处理时采取了尽量选择较大范围的原则,在计算人脸矩形的长度时统一将半径扩大至了1.3倍,这样定位出的人脸区域不是很精确。
- 下一步考虑使用基于HSV色彩空间的人脸分割方法,将人脸准确定位在一个非矩形的区域里,以得到更好的磨皮效果,避免“少磨”或“多磨”了部分区域。
===============================================================================================
-----------------------------------------
opencv实现photoshop 算法:http://download.csdn.net/user/c80486/uploads
opencv 美白磨皮人脸检测<转>的更多相关文章
- OpenCV例程实现人脸检测
前段时间看的OpenCV,其实有很多的例子程序,参考代码值得我们学习,对图像特征提取三大法宝:HOG特征,LBP特征,Haar特征有一定了解后. 对本文中的例子程序刚开始没有调通,今晚上调通了,试了试 ...
- OpenCV + python 实现人脸检测(基于照片和视频进行检测)
OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...
- OpenCV入门指南----人脸检测
本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测(人脸识别).人脸检测可以说是学术界的宠儿,在不少EI,SCI高级别论文都能看到它的身影.甚至很多高校学生的毕业设计都会涉及到人脸检测.当然人脸 ...
- Android 中使用 dlib+opencv 实现动态人脸检测
1 概述 完成 Android 相机预览功能以后,在此基础上我使用 dlib 与 opencv 库做了一个关于人脸检测的 demo.该 demo 在相机预览过程中对人脸进行实时检测,并将检测到的人脸用 ...
- OpenCV神技——人脸检测,猫脸检测
简介 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 ...
- Android—基于OpenCV+Android实现人脸检测
导读 OpenCV 是一个开源的跨平台计算机视觉库, 采C++语言编写,实现了图像处理和计算机视觉方面的很多通用算法,同时也提供对Python,Java,Android等的支持,这里利用Android ...
- 手把手教你如何用 OpenCV + Python 实现人脸检测
配好了OpenCV的Python环境,OpenCV的Python环境搭建.于是迫不及待的想体验一下opencv的人脸识别,如下文. 必备知识 Haar-like Haar-like百科释义.通俗的来讲 ...
- opencv+python实时人脸检测、磨皮
import numpy as np import cv2 cap = cv2.VideoCapture(0) face_cascade = cv2.CascadeClassifier("d ...
- 【转载】opencv实现人脸检测
全文转载自CSDN的博客(不知道怎么将CSDN的博客转到博客园,应该没这功能吧,所以直接复制全文了),转载地址如下 http://blog.csdn.net/lsq2902101015/article ...
随机推荐
- MySql 创建/删除数据库
C:\Users\Mr.Black>mysql -u root -pEnter password: ****Welcome to the MySQL monitor. Commands end ...
- 解决:return _compile(pattern, flags).search(string) TypeError: expected string or buffer
今天写爬虫,爬取MM图片页面的标题时,遇到了一个问题,上图: 看看我的代码: import urllib import urllib2 import re class JPMSG: def __ini ...
- 3.4 常用的两种 layer 层 3.7 字体与文本
3.4 常用的两种 layer 层 //在cocos2d-x中,经常使用到的两种 layer 层 : CCLayer 和 CCLayerColor //CCLayer 的创建 CCLayer* la ...
- apache php配置 虚拟目录 和 虚拟主机 多域名配置 原理解析
虚拟目录配置 就是说,我们放项目放在D盘,F盘,而不是默认的www文件夹下也可以访问.比如这里,我在 D:/PHP/work 放入的项目文件. 在httpd.conf加入: (位置一般是在 </ ...
- vue-cli 脚手架项目-package.json
使用vue-cli脚手架新建的项目中,含有package.json. package.json是npm的配置文件,里面设定了脚本以及项目依赖的库. npm run dev 这样的命令就写在packag ...
- UVA - 10817 Headmaster's Headache (状压类背包dp+三进制编码)
题目链接 题目大意:有S门课程,N名在职教师和M名求职者,每名在职教师或求职者都有自己能教的课程集合以及工资,要求花费尽量少的钱选择一些人,使得每门课程都有至少两人教.在职教师必须选. 可以把“每个课 ...
- LintCode Sliding Window Matrix Maximum
原题链接在这里:http://www.lintcode.com/zh-cn/problem/sliding-window-matrix-maximum/ 题目: Given an array of n ...
- tp验证码
一.生成验证码 1.commonController.class.php class CommonController extends Controller{ public function getV ...
- MySQL 预处理语句prepare、execute、deallocate的使用
所以对于中文乱码,需要去check的地方有如下3个:1.mysql窗口的字符编码(xshell连接的远程工具的字符集设置):2.数据库的字符编码(show variables like '%char% ...
- Azure VNet介绍
Azure VNet的介绍 VNet是Azure云中逻辑隔离的虚拟网络.它包含两个含义: Azure的用户可以在VNet中创建自己的各种资源,感觉想自己的数据中心中一样; 在一个VNet中创建的资源和 ...