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 ...
随机推荐
- Spring boot学习整理
目录: Springboot结合hbase Springboot结合elasticsearch Springboot结合RestTemplate处理Http请求 Springboot的maven相关 ...
- 更改自己iCloud的地区
百度一大堆都是过时的,而且没有用,通过google后发现google+里有一个文章https://plus.google.com/+%E5%90%B4%E5%BF%97%E5%8B%8776/post ...
- sql 触发器回顾
一: 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约束. 二: SQL Server为每个触发器 ...
- Spinner使用一
Spinner使用一 一.使用方法 1.在layout中创建Spinner控件 <Spinner android:id="@+id/spinner1" android:lay ...
- 程序员怎样迈出从5K到1W的重要一步
为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝:而自己加班加点搞到天亮还做不完. 为什么用户提出需求变更后,大牛只需潇洒地敲敲键盘,改改配置:而自己将代码改了又改,删了又建,几乎晕 ...
- python之单元测试框架—unittest
一. 什么是单元测试?单元测试的对象是什么? 1: 什么是单元测试? 按照定义,单元测试就是对单个模块或者单个类或者单个函数进行测试,一般是开发做的,按照阶段分,一般就是单元测试.集成测试.系统测试. ...
- 缓存淘汰算法--LRU算法(转)
(转自:http://flychao88.iteye.com/blog/1977653) 1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访 ...
- Spring3.2.9 + JdbcTemplate 学习
applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xm ...
- Python正则表达式之 - ?: / ?= / ?!
Python正则表达式之 - ?: / ?= / ?! 用圆括号将所有选择项括起来,相邻的选择项之间用|分隔.但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作 ...
- LeetCode OJ:Path Sum II(路径和II)
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...