标题 | 基于人脸识别的人脸漫画处理系统 |
范文 | 储昭兵 王天宝 毛水凌 摘 要:为了简单、便捷、快速地实现人物肖像漫画创作,设计一种基于安卓平台的自动化肖像漫画生成系统。系统采用主动形状模型方法,对大量真实人脸进行特征分析得到平均人脸特征库,并对用户输入的人脸肖像进行特征检测、提取与筛选,然后结合漫画艺术家对人脸漫画的作画规律,对筛选的特征以及与平均人脸差异较大的特征进行归类。对不同特征采用不同夸张化方法,配以不同夸张尺度,再由计算机完成自动形变,以实现人脸肖像漫画的自动艺术化夸张,得到接近漫画创作者水平的人脸漫画。通过该系统可大幅减少漫画工作者的工作量,使普通用户也能便捷地进行人脸肖像漫画创作。 关键词:人脸识别;人脸漫画;肖像生成;特征提取;图像处理 DOI:10. 11907/rjdk. 181853 中图分类号:TP303文献标识码:A文章编号:1672-7800(2019)004-0036-05 0 引言 作为艺术的一种表达方式,人脸漫画一直是艺术家表达人类面部甚至性格特征的重要手段。随着现代漫画的兴起,肖像漫画风靡各大社交平台、报刊及论坛。然而,一方面漫画艺术表达需要艺术家经过长期刻苦训练,不断临摹、练习才能创作完成[1-2],另一方面,漫画家的绘画风格与技巧难以用清晰且不存在二义性的语法规则进行表示。因此漫画这种具有强烈主观性的艺术创作形式很难被计算机自动模拟,导致普通人几乎无法参与漫画创作。 PICASSO是国外应用较多的一种人脸编辑系统,其主要通过面部特征轮廓自动生成漫画,缺点是夸张不够平滑,无法很好地反映漫画的艺术化夸张风格。“T型规则”是陈文娟等[4]提出的一种人脸漫画特征规则,即将眼睛保持在水平轴,鼻子作为垂直轴,眼睛之间距离的变化应与鼻子长短保持协调。当眼睛之间距离变长,鼻子长度则应相应缩短,若眼睛之间距离变短,鼻子则应该变长。该规则较好地阐述了人脸眼部与鼻子之间的夸张形变关系,但未阐述人脸其它部位特征与漫画艺术之间的关系;阎芳等[5]提出一种基于人脸三庭五眼关系的形变方法。人脸五官的位置比例基本上体现在三庭的位置,而三庭之间的比例是上庭∶中庭∶下庭=1∶1∶1。由于一般人不会严格符合该比例,所以该比例可反映出人与人之间的差异。此时对三庭直接进行整体变形,可以粗略得到具有突出特征风格的漫画人脸,然后根据眼宽:鼻宽:嘴宽=2∶2∶3的比例关系再次进行形变,即可得到具有一定夸张程度的人脸肖像画。 本文使用ASM模型算法建立一套漫画生成系统,为普通人利用计算机自动化地完成漫画形象设计提供了简单的解决方案。 1 技术要点 1.1 漫画特征 (1)简化性:卡通漫画是以自然形象为原型,通过高度抽象、概括、提炼、艺术化而创作出来的具有象征性的对象[6]。 (2)鲜明性:创作者经常会通过夸张的手法设计出形象鲜明的漫画对象,以表达出与其夸张形象相对应的内在个性。 (3)亲和性:漫画应对普通大众有一种强烈吸引力,即漫画形象可引起人们的认可、喜爱或者憎恶。 (4)时尚性:漫画应与其传播媒介相互促进,走在科技与时尚的最前沿。 1.2 三庭五眼 三庭五眼是指人脸长宽之间的标准比例。三庭指人脸纵向长度比例,将人脸三等分,从前额发际线到眉心、眉心到鼻尖、鼻尖到下颌各占脸长的1/3;五眼指人脸横向比例,以人眼睛为量度单位,将人脸分为五等宽。两眼之间为一只眼睛的宽度,两眼两侧也分别为一只眼睛的宽度。 1.3 OpenCV OpenCV(Open Source Computer Vision Library)是一个具有跨平台能力的计算机视觉处理库,而且其完全开源,开发者能自由使用。其具有C、C++、Python和Java的接口,且支持Windows、Mac OS、iOS與Android等多个平台。OpenCV专为计算优化而设计,强调实时应用,并启用OpenCL实现硬件加速。C/C++编写的底层库可以利用计算机的多核处理能力加快图像、视频处理速度。本系统采用具有Java接口的OpenCV for Android库作为图像底层计算处理支持库。 1.4 Android-NDK Android-NDK(Native Development Kit,安卓原生开发工具包)提供了一系列工具,帮助开发者快速开发C/C++动态库,并能将生成的so包与Java应用一起打包成APK[10]。NDK集成了交叉编译器,并提供了相应的makefile文件以隔离CPU、平台、ABI等的差异,开发人员只需简单地修改makefile文件即可创建出与so平台对应的so包。 2 系统设计 本系统由人脸采集、人脸识别、边缘检测、特征点定位、背景去除、轮廓生成、人脸夸张形变与结果显示8个子模块组成。其中特征点定位、背景去除、轮廓生成和夸张形变为系统核心功能模块。具体模块及功能描述如表1所示。 系统流程设计如图1所示,界面设计如图2所示。 3 系统模块实现 3.1 人脸采集 人脸采集是系统的图像输入源,系统监听摄像头并截取图像。主要实现方法如下: (1)Camera getCameraInstance(Context context, int CameraId):摄像头控制接口,用于打开并获得安卓平台的摄像头信息。 (2)类CameraPreview:继承自SurfaceView类并实现SurfaceHolder.Callback接口,用于在界面上显示摄像头捕获的画面。 (3)onPreviewFrame(byte[] data, Camera camera):用于获取摄像头捕获画面的当前帧。 (4)onClick(View v):用于监听用户屏幕点击动作。 3.2 人脸识别 该模块主要用于识别输入图像中是否包含人脸。将模块MC-1中截取的图像作为输入,然后调用OpenCV开源图形库中的人脸检测算法,得到图像中包含人脸区域的坐标。将人脸区域用绿色方框圈出,主要实现方法如下: (1)Mat FaceDetect(Mat src, double scaleFactor, int minNeighbors, int minSize):用于调用Native()方法检测出人脸并返回人脸区域。 (2)Mat detectFacesAndExtractFace(Mat src, Mat face):传入参数是原图像与人脸区域图像,将其进行对比并将人脸在原图像中用绿色方框圈出。 (3)类FaceDetectThread:用于处理人脸检测的子线程类。 3.3 边缘检测 该模块主要用于检测人脸轮廓和背景轮廓,通过处理当前帧图像,显示摄像头捕捉的轮廓线条。其使用方法Mat CannyDetect(Mat src,double threshold1,double threshold2, int aperatureSize),并调用Native方法对当前帧图片边缘轮廓进行检测,最后返回。 3.4 特征点定位 ASM(Active Shape Model,主动形状模型)是一个基于点分布模型的算法,其通过已手动标记的大量样本,获得人脸各个识别定位点的特征分布统计信息[7],并且通过获取每一个特征的局部纹理,推断出附近特征点位置,以此迭代不断找出下一特征点。对于样本而言,所有特征点位置均为人工标定。 3.4.1 ASM训练与搜索 ASM进行人脸识别包括训练和搜索两个过程。 (1)ASM训练。训练样本集合包括n张样本图像,每张图像都包括已手动标记的k个特征点。对于每个图像而言,需要记录每个特征点坐标信息并保存到文本中。所有特征点[k]按照顺序组合为一个形状向量: 形状向量归一化的主要目的是消除图像中人脸由于不同角度、距离、姿态造成的非形状干扰。将所有形状向量通过仿射变换,在不更改点向量各点相对位置的前提下,将所有向量一一对齐到同一个新向量中。具体步骤为:①将训练的人脸样本模型对齐到新的人脸;②计算平均人脸模型[x];③将所有训练样本对齐到[x]上;④重复步骤②、③,直到收敛。采用该方式可将任何一个向量表示为[x≈x+PSbS]。 3.4.3 算法实现 首先加载已手动标识好特征点的人脸样本识别数据到内存;然后将采集到的人脸图像作为输入图像,运行人脸识别代码,检测到人脸后开始使用ASM算法进行人脸特征点定位;定位完成后,将结果以列表形式保存到内存中。特征点定位对于移动设备而言是耗时较多的工作,需要在非主线程中进行处理。主要实现方法为: (1)int[] FindFaceLandmarks(Mat src,float ratioW, float ratioH):用于调用Native寻找人脸识别点,并返回到一个int类型数组中。 (2)void findAsmLandmarks(Mat src):用于启动新线程。 (3)void drawAsmPoints(Mat src,List 3.5 背景去除 本模块用于去除背景信息对漫画的影响,分离人脸区域与背景区域。采用类BackgroundWipe去除人脸,尽量多地保存头发信息并去除无关背景信息。因为系統针对的人脸识别区域仅限于人脸,而不包括头发,因此本模块必须提取出包含头发和人脸的区域。 3.6 轮廓生成 轮廓生成是为了将人脸头像转变为线条更接近于漫画风格的图像[9]。对于通过MC-5模块去除背景的图像,首先直接将图片进行灰度化处理得到灰度图,之后进行二值化处理;由于所需的人脸轮廓部分刚好是灰度变化很大,且灰度值较低的部分,所以只需将灰度变化很大的区域采用黑色像素进行填充,其余部分采用白色像素填充,即完成了人脸轮廓生成[10];轮廓生成对于移动设备而言是十分耗时的,需要在非主线程中进行,因此需要开辟新线程,然后通过Message方式将结果发送到主线程中的handler;最后,利用类Threshold将已去除背景的人脸肖像线条化。 3.7 夸张形变 为了凸显相对于平均人脸差异较大的部分,模拟艺术家对不同部分人脸的夸张尺度[11],系统采用Feature类用于保存平均人脸五官、脸长宽与脸之间的比例关系。平均人脸符合三庭五眼规则,即人脸中上庭∶中庭∶下庭的比例为1∶1∶1;人脸宽度与眼睛之间的比例为5∶1,其中人眼之间的距离为一个眼睛的宽度,两边各占一个眼睛的宽度[12]。鼻子宽度为一个眼睛的宽度,嘴巴宽度为人脸的1/3。本模块使用的主要方法如下: (1)Map (2)List (3)Mat imgStitch(List (4)Mat mideye(double scale,Mat mat,List (5)Mat mouth(double scale,Mat mat,List (6)Mat eye(double scale,Mat mat,List (7)类Deformation:是用于人脸形变的主要类,构造方法为Deformation(Context context,Mat mat,List public void run() { mMap = new HashMap FindFeature find = new FindFeature(mList); mMap = find.getMap(); top = mMap.get("top")/(Feature.TOP/Feature.HEIGHT); //三庭 middle = mMap.get("middle")/(Feature.MIDDLE/Feature.HEIGHT); bottom = mMap.get("bottom")/(Feature.BOTTOM/Feature.HEIGHT); left = mMap.get("left")/(Feature.EYE/Feature.WIDTH);//五眼 right = mMap.get("right")/(Feature.EYE/Feature.WIDTH); mideye = mMap.get("mideye")/(Feature.EYE/Feature.WIDTH); eye = mMap.get("eye")/(Feature.EYE/Feature.WIDTH); nose = mMap.get("nose")/(Feature.NOSE/Feature.WIDTH); mouth = mMap.get("mouth")/(Feature.MOUTH/Feature.WIDTH); mMat = mideye(mideye, mMat, mList); mMat = mouth(mouth, mMat, mList);//嘴巴变化 mMat = eye(eye, mMat, mList); //眼睛变化 List mats = virticalSplit(mMat, mList); if (top>1) { if (middle>1) {//缩小下庭 double scaleRate = bottom*bottom*bottom; Mat temp = new Mat(); Size dsize = new Size(mMat.cols(), scaleRate*mats.get(2).rows()); Imgproc.resize(mats.get(2), temp, dsize); mats.set(2, temp); }else if (bottom>1) {//缩小中庭 double scaleRate = middle*middle*middle; Mat temp = new Mat(); Size dsize = new Size(mMat.cols(), scaleRate*mats.get(1).rows()); Imgproc.resize(mats.get(1), temp, dsize); mats.set(1, temp); }else {//放大上庭 double scaleRate = top*top; Mat temp = new Mat(); Size dsize = new Size(mMat.cols(), scaleRate*mats.get(0).rows()); Imgproc.resize(mats.get(0), temp, dsize); mats.set(0, temp); } }else if (middle>1) { if (bottom>1) {//缩小上庭 double scaleRate = top*top*top; Mat temp = new Mat(); Size dsize = new Size(mMat.cols(), scaleRate*mats.get(0)。rows()); Imgproc.resize(mats.get(0), temp, dsize); mats.set(0, temp); }else {//放大中庭 double scaleRate = middle*middle; Mat temp = new Mat(); Size dsize = new Size(mMat.cols(), scaleRate*mats.get(1).rows()); Imgproc.resize(mats.get(1), temp, dsize); mats.set(1, temp); } }else {//放大下庭 double scaleRate = bottom*bottom; Mat temp = new Mat(); Size dsize = new Size(mMat.cols(), scaleRate*mats.get(2).rows()); Imgproc.resize(mats.get(2), temp, dsize); mats.set(2, temp); } Message msg = new Message(); msg.what = Params.DeformationParams.DEFORMATION_DONE; msg.obj = imgStitch(mats); ((MainActivity)mContext).mHandler.sendMessage(msg);} 3.8 結果显示 这是系统处理的最后一步,即将已处理好的人脸漫画通过屏幕显示出来,并保存成PNG格式的本地图片文件。本文采用saveBitmap(Bitmap bitmap)方法将图片保存到本地。 4 实验结果 本系统实现了图像形变算法与主动形状模型的特征点定位方法,并解决了背景去除算法中的前景去除问题。在环境光充足的条件下,通过手机摄像头输入人脸,能够简单、便捷地完成对人脸的漫画化处理,得到具有一定艺术效果的人脸漫画。图3-图8为本文实验过程,由图8的实验结果可见,该图像具有一定的漫画效果。 5 结语 本系统经过分析、设计、实现、测试等多个阶段,最后实验结果表明,基于人脸识别的人脸漫画处理系统取得了一定效果,但还有很多不足与需要改进的部分。 (1)对于背景擦除模块,为尽可能擦除不必要的背景,采用的擦除算法迭代超过4次,因此非常耗时,尤其当图片分辨率很高时。未来需要改用更加高效的背景擦除算法。 (2)对于肖像形变过程,本文由于平台限制采用比较简单的形变方式,实际上人脸形变过程可以精确到人脸每一个小的部分。 (3)可添加分享模块将用户生成的漫画分享到各大社交平台。 (4)目前系统采用的形变方式是基于漫画家对人脸各个部分统一的夸张尺度,未来需添加可供用户自定义的夸张尺度。 参考文献: [1] 华博,李帅,湛永松. 基于相关分析的肖像素描漫画生成系统[J]. 计算机应用与软件,2015 (7):159-162. [2] 苏延辉,李帅,湛永松. 参数化的肖像漫画生成算法[J]. 计算机应用研究,2014 (5):1562-1565. [3] 寇毛蕊.基于Matlab的人脸识别系统设计[J].软件导刊,2018,17 (11):34-36. [4] 陈文娟,石民勇,孙庆杰. 利用人脸特征及其关系的漫画夸张与合成[J].计算机辅助设计与图形学学报,2010(1):121-128. [5] 阎芳,费广正,柳婷婷,等. 漫画风格的人脸肖像生成算法[J].计算机辅助设计与图形学学报,2007(4):442-447. [6] 卢丽稳.人脸肖像风格化绘制技术研究[D]. 昆明:云南大学,2012. [7] 文义玲. 基于改进ASM的人脸图像变形算法研究[D]. 西安:西安建筑科技大学,2011. [8] 张智敏. 人脸特征点定位算法研究及其在人脸卡通肖像中的应用[D]. 西安:西安理工大学,2010. [9] 韩燕丽,杨慧炯. 基于颜色量化的肖像漫画生成方法研究[J]. 软件工程师,2015(11):20-21. [10] 苏延辉,李帅,湛永松. 参数化的肖像漫画生成算法[J]. 计算机应用研究,2014(5):1562-1565. [11] 王海君,杨士颖,王雁飞. 基于NMF和LS-SVM的肖像漫画生成算法研究[J]. 电视技术,2013(19):233-236. [12] 李菁菁. 基于控制点平滑的人脸变形算法及其在人脸动画中的应用[D]. 湘潭:湘潭大学,2008. (责任编辑:黄 健) |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。