关于人脸化妆的一些思考

          

         做美妆这个项目很久了,是时候梳理一下自己的想法了。写下这篇文章,希望对大家有所帮助。

         说到图片编辑,就不得不提该领域的大哥Photoshop这款软件了。Photoshop的功能是如此强大与流行,以至于这款产品的商标被动词化(photoshopped)了,而且这个术语广泛用来指任何数码照片的编辑,不管是不是用的Photoshop软件。Adobe公司试图防止该术语的泛化,也没有起到效果。国内流行的说法则是“P图”,为了顺应国内民情,大公司衍生出美图秀秀、天天P图等这样的软件。

         其实,我对化妆行业也是不甚了解,所以搜索了很多相关资源。与肤色相关的美白、祛痘磨皮,与头发相关的发型、染发,与眉毛相关的纹眉,与眼睛相关的美瞳、眼线、眼影,与腮部相关的腮红,与鼻子相关的隆鼻,与嘴巴相关的唇彩,与脸型相关的瘦脸等。

         尝试组合Photoshop与上面的关键词,可以搜索到相关的化妆教程。与现实中的身体化妆不同的是,这个可以通过拍照,在软件里画妆,预先知道化妆后的效果,通过对比效果,然后再确定是否化妆、以及应用哪一款妆容。过程类似穿衣试衣,但是物理化妆这个程序更需要耐心,有点耗时。软件化妆更有玩味儿,打造属于自己不同的风格。

         我们要做到换妆的自动产业化处理,而不是找来一个Photoshop高手,一次又一次的修图,对脸部进行美容化妆。这样会累坏一个人的。要达到自动,我们需要能识别出人脸的各个区域,如今的人脸识别技术已经很不错了。我们要做的,就是自动识别出人脸,接着将Photoshop 美妆的各种步骤转换成自己工程的代码,以达到自动化。

         好在市场上有很多相关的应用,我们不是从零做起,可以从别人的产品中长长经验。调研市场上的同类产品,体验一下别人的劳动成果。搜索关键词:相机、图像处理、滤镜、化妆。以下直接列出几款产品。

玩图美妆         com.fotoable.makeup                 北京云图微动科技有限公司
美图秀秀         com.mt.mtxx.mtxx                    厦门美图网科技有限公司

美颜相机         com.meitu.meiyancamera          厦门美图网科技有限公司

美妆相机         com.meitu.makeup                   厦门美图之家科技有限公司

天天P图          com.tencent.ttpic                      腾讯公司,优图团队

美人妆           com.gangyun.makeup               深圳港云科技有限公司

MIX滤镜大师   com.pinguo.edit.sdk                 成都品果科技有限公司

Camera360    vStudio.Android.Camera360     成都品果科技有限公司

You Makeup   com.fotoable.makeup               云图微动科技有限公司

 

下面两个重在社交,分享美妆心得:

美啦               com.meilapp.meila                  深圳市品汇科技有限公司

美妆心得         com.buykee.princessmakeup    杭州贝宇网络科技有限公司

 

下面两个是国外公司的,有很多可借鉴的元素:

完美365          com.arcsoft.perfect365           Arcsoft(虹软公司)

Handy Photo   com.advasoft.handyphoto       ADVA Soft

 

         重点介绍一下美图公司,美图公司成立于2008年10月,总部设于厦门。美图公司成立于2008年10月,围绕着“美”创造了美图秀秀、美颜相机、美图手机、美拍、美妆相机、潮自拍等一系列软硬件产品。美图公司的产品美妆相机,2016年10月底,宣布用户破亿。接着,在该年的12月初上市。

         体验过后,大概知道要做的内容。在网上搜索了一些化妆美容的教程,加深了对化妆行业领域的理解,有些建议对算法的实现也有帮助。我做过几年Android开发,对Android平台很了解。为了加深理解,也做过反编译上面的APK文件,很有收获。反编译不是这篇的重点,如果有需要的话,我会另写文章。

         先放工程代码 https://github.com/KAlO2/PerfectShow,再慢慢分析算法与实现细节。感兴趣的朋友可以Star一下工程。

 

         工程采用了业界常用的图像处理库OpenCV,最新版3.2,发布于2016年12月23日。3.X版本应该都行,很多人、已经网上的一些教材还是停留在 2.4.9或2.4.13版本,注意到新版本加入了一些新的功能,包括 Seamless clone 功能(写这篇文章的时候链接失效了,微软可能在调整自己的门户网站)。

         做出demo后,效果还可以,但是对倾斜的脸、刘海儿齐眉毛的女生处理有问题,为了增加健壮性,从头又修改了算法。以前代码利用了 Android 平台的 2D graphicis 包处理画图、模糊、图层混合效果等,demo 写得很快。iOS上也有对应的2D图形库 The UIKit Graphics SystemQuartz 2D Programming Guide 可以用,用系统的库,效率应该不成问题。后期为了来回切换以及维护成本,还是将代码和一些算法从Java改写成C++,调试花了两个星期的时间。虽然OpenCV 提供Java/Python 等语言的接口绑定,以后可以在Win32平台上使用化妆的代码。最后代码越来越多,需要时间整理和重构,去除冗余代码,添加API注释(注释是按照 javadoc 的文档格式写的,可以用 Doxygen 工具生成文档),统一调用接口。

         额外的一点需要说明,Android 底层用的Skia库,内存布局一般是RGBA内存布局,但 Android 上层的 android.graphics.Color 以及 OpenCV 用的是 BGRA 内存布局。Android 的 Bitmap 解码后是 RGBA 内存布局,虽然上层的 Bitmap#getPixel() 以及 Bitmap$Config.ARGB_8888 会误导你,让你以为下层用的是BGRA。在代码中我用宏 USE_BGRA_LAYOUT 控制,Android 平台就用 RGBA,X86平台用 BGRA,这样可以避免来来回回的RGB2BGR BGR2RGB转换。RGBA大行其道,各种 HLSL/GLSL/Cg Shader 都采用这种格式,至于为什么出现BGRA这种怪异的格式?是因为一些历史原因,这跟为什么现代铁轨的宽度是古代两匹马屁股的宽度一样。一种推测是在小端(little endian)字节序机器上,RGB的表示为0x00bbggrr,读起来就是BGR顺序了。

 

 

 

延伸链接:
1. 美妆相机宣布用户破亿 三大动向引发业界关注
2. PS人物照片美化教程:Photoshop给人物脸部化妆
3. <AOSP>/platform/external/skia
4. Why does OpenCV use BGR color format ?

 

 

posted @ 2017-03-20 15:28  KAlO2  阅读(2471)  评论(3编辑  收藏  举报