基于人像识别的图片处理App的设计与实现
2021-04-13陈昊天刘雪飞王硕珩罗凯鸿段栋梁吴靖文
陈昊天 刘雪飞 王硕珩 罗凯鸿 段栋梁 吴靖文
摘要:为了使用户获得更加专业的人像处理支持,并且提供更加智能、便捷的人像图片操作功能,实现了基于一些特定的人像情景的人像深度处理软件。该软件使用Android studio进行开发,使用OpenCV和OpenGL实现人像五官的细化处理、人像的补强装饰、区域渲染、离屏渲染等,实现了一个拥有完整布局、人机交互友好,具有针对人像进行美化、装饰功能的软件。
关键词:Android;OpenCV;OpenGL
1 背景
随着经济的发展和人民生活水平的进一步提高,人们对于休闲娱乐的质量需求也在日益提高,无论是在微信朋友圈,QQ空间还是微博,随处可见脸部精美、五官端正的人像照片。目前,各大社交软件,例如QQ、微信等都自带简易的图片处理功能,然而,这些软件都不能对人像进行复杂处理或者进行二次加工以提高图片输出的质量。另外,PS等专业软件进行图片处理对使用者的要求又比较高。即使市场上已有大量诸如此类的图片处理软件,如美图秀秀、VSCO等,但大部分已上市的app在一些功能方面仍然具有局限性,不能完全满足使用者的个性化需求。因此,开发一个可满足用户个性化需求的图像处理软件很有必要。
本文实现了一款人像深度处理app,本软件能根据用户的个性化需求,对于一张未经处理的图片,在使用本软件进行个性化处理后,呈现出自然、美观的效果。并且给用户提供更加智能、便捷的图片操作过程,操作过程简洁明了,只需几步便可完成复杂的操作,对于图片处理不太擅长的用户,还提供了方案市场这一功能,使用已经预留好的方案,一键即可完成人像处理。而那些精通图片处理的用户,也可以将自己设计的方案上传至方案市场,供其他用户使用。
2 核心技术概述
2.1 OpenGL ES
OpenGL ES(OpenGL for Embeded System)是OpenGL(Open Graphics Library)的精简子集,是以手持和嵌入式设备为目标的高级3D图形API,如现在火爆的智能手机,支持桌面系统,还是浏览器3D图形标准WebGL[1]的基础,支持多个平台,如桌面端的Linux、Windows,移动端的Android、iOS等。
开发者可以使用Android自带的OpenGL ES实现创建二维或者三维图形,以及对图片进行渲染的功能。现在大多数用的是OpenGL ES2.0[2],较第一个版本增加特殊的效果,能利用最新的硬件所提供的优势。通过OpenGL ES,将图片进行着色器渲染。
2.2 OpenCV
OpenCV作为一款开源的计算机视觉框架,封装了超过1000个常见的图像处理算法,其SDK语言支持Java、C++、Python等。借助OpenCV提供的SDK,Android开发可以实现图像处理、识别、关键点定位、实时视频分析与处理等移动端应用开发。
对于人像处理,要实现对皮肤细节的模糊,保留眼睛、鼻子、嘴等部分,通过OpenCV识别这些关键点[3],用OpenGL ES着色器渲染,将对应点映射过去,实现离屏渲染。
3 软件界面设计
3.1 基本界面布局
对于软件界面的设计,使用activity,一共设计6个界面,分别为主界面、图片处理界面、选择方案界面、自定义方案界面、简易方案界面和设置界面。每个activity包含了用xml编写的前端界面和用Java编写的后端代码。
3.2 前端界面设计
主界面样式如图1所示。
先是要选择处理的文件类型。视频拟定在下一步改善功能时添加,这里先预留好入口。主页用来实现核心功能,方案市场提供了一个用户自由免费分享方案码的场所。所谓方案码,是一种储存每次生成人像方案的一串不规则字符,每个用户都可以使用这一个方案码生成同一种方案供自己使用。
简易方案界面样式如图2所示。
简易方案界面拟设定一屏幕的按钮,每个按钮代表了一个简易功能,包括打马赛克、滤镜、翻转等功能,用户可以选择一个或多个功能进行组合,达到自己想要的效果。相对于自定义方案,选择简易方案对于那些修图要求不高的用户来说可以大大节省时间成本而获得一个较为满意的结果。
4 基于OpenCV和OpenGL渲染实现
4.1 环境搭建
软件开发基于Android Studio,android自带OpenGL ES,所以不需要另外下载,只需要调用android的OpenGL库。而OpenCV需要额外配置,大致步骤为将OpenCV的Android版本导入到工程中,之后在Modules选项中,将其中的OpenCVLibrary420的Sdk version和tools version改为和app中的Sdk version和tools version相同的版本。配置完之后,將下载好的OpenCV中的两个文件复制到工程中。通过JNI配置OpenCV环境。
4.2 渲染机制
图3为OpenGL渲染[4]的流程线。UI对象使用CPU处理为多维图形与纹理,然后通过OpenGL ES调用GPU,使用GPU对图形进行光栅化[5],之后开始绘制渲染后的图形,渲染完成后再屏幕显示。
OpenGL通过GLSurfaceView类,将结果直接显示到屏幕,在顶点里进行纹理的操作,通过片源着色器渲染,可以看到效果。实际中有很多情况并不需要渲染到屏幕上,这个时候使用帧缓冲对象(FBO)就可以很方便地实现这类需求。帧缓冲对象可以让渲染不渲染到屏幕上,而是渲染到离屏Buffer中,在FBO中进行特效的描述。将每种效果写到单独的一个类,并且在屏幕显示之前的所有效果都不需要显示到屏幕中,在屏幕显示之前都将其使用帧缓冲对象进行缓存[6]。
4.3 进行渲染绘制的原理
OpenGL的显示效果通过一个摄像头进行,根据摄像头的不同位置和坐标,会呈现出不同的效果。下面的图4至图7展示了部分本软件使用的技术的原理。
通过OpenGL进行渲染的模板如图4和图5所示。在Java层声明OpenGL世界坐标中的顶点数据,将顶点着色器实例化到OpenGL,通过put方法放入到GPU中。在GPU中声明的mVertexBuffer只声明了内存,处于游离状态。在GPU中同样包含一个片元着色器,将游离状态的mVertexBuffer绑定到vPosition,确定要进行的操作。GPU中单独存在一个采样器中,对摄像头进行采样,从摄像头中不断获取到数据。
以滤镜处理为例,以上渲染方式可以使用圖5这张更加精简的图来概括。
简要来说,可以将渲染滤镜的步骤分为三步,第一步是摄像头收集SurfaceTexture类采集到的数据,第二步是使用OpenGL进行处理,最后一步是将处理好的结果再次渲染到摄像头。
图6显示了两个所需的着色器程序的调用过程。这两个着色器程序位于GPU,在顶点着色器中,vPosition为摄像头采样形状,vCoord将坐标传递给aCoord,aCoord经过vary修饰,从顶点着色器传递到片元着色器,使片元着色器确定上色位置。在片元着色器上,控制vTexture等参数实现改变颜色、质感等操作。
图7显示了摄像头通过FBO的渲染过程。在这里,摄像头采集到的数据直接输出到屏幕上是无效数据,需要用FBO进行截流,进行编辑即滤镜处理,之后传递给摄像头,以实现效果。
4.4 软件实现特效举例
下面展示一类渲染过程:眼睛部分渲染,如图8。
先声明眼睛坐标的属性索引。在设置视窗后,要渲染到FBO缓存中,不直接显示到屏幕。之后使用着色器程序,进行渲染和传值。编写顶点数据,传值后激活;纹理坐标,传值后激活;传mFace眼睛坐标给着色器,分别进行左右眼的换算到纹理坐标的操作。
之后进行激活图层、绑定、传递参数、通知OpenGL绘制、解绑FBO、返回FBO的纹理id。
5 结束语
本文基于Android的渲染过程出发,立足于研究Android、OpenCV、OpenGL相关技术和方法,克服了直接通过摄像头渲染的不足和延迟过高等缺点,实现了通过FBO缓存渲染的方法。运用Android技术实现离屏渲染图片,便于用户能够快速地进行图片渲染分析,实现了快捷的图片操作,能更好地适用于处理大量图片和提高渲染效率,有利于用户在更短的时间获得更优质的体验。下一阶段将进一步研究实现对图片像素操作的关联分析和智能渲染,使其成为功能更加丰富,性能更加强大的人像深化处理的专业软件。
参考文献:
[1] Kang S,Lee J.Developing a tile-based rendering method to improve rendering speed of 3D geospatial data with HTML5 and WebGL[J].Journal of Sensors,2017,2017:1-11.
[2] 李文瑞.基于OpenGL2.0标准的图像处理单元设计与实现[D].西安:西安电子科技大学,2017.
[3] 沈娟,徐英君.基于OpenCV的视频人脸检测[J].数码世界,2019(10):1-2.
[4] 官酩杰.基于OpenGL ES的移动平台图形渲染引擎研究与实现[D].北京:北京交通大学,2010.
[5] 王志方.嵌入式GPU中图元光栅化的设计与实现[D].长沙:湖南大学,2016.
[6] 高光磊,陈炳发.基于FBO和GPU的动态CEM算法及实现[J].世界科技研究与发展,2008,30(4):440-442.
【通联编辑:谢媛媛】