陳昊天 劉雪飛 王碩珩 羅凱鴻 段棟梁 吳靖文
摘要:為了使用戶獲得更加專業(yè)的人像處理支持,并且提供更加智能、便捷的人像圖片操作功能,實現(xiàn)了基于一些特定的人像情景的人像深度處理軟件。該軟件使用Android studio進行開發(fā),使用OpenCV和OpenGL實現(xiàn)人像五官的細化處理、人像的補強裝飾、區(qū)域渲染、離屏渲染等,實現(xiàn)了一個擁有完整布局、人機交互友好,具有針對人像進行美化、裝飾功能的軟件。
關鍵詞:Android;OpenCV;OpenGL
1 背景
隨著經(jīng)濟的發(fā)展和人民生活水平的進一步提高,人們對于休閑娛樂的質(zhì)量需求也在日益提高,無論是在微信朋友圈,QQ空間還是微博,隨處可見臉部精美、五官端正的人像照片。目前,各大社交軟件,例如QQ、微信等都自帶簡易的圖片處理功能,然而,這些軟件都不能對人像進行復雜處理或者進行二次加工以提高圖片輸出的質(zhì)量。另外,PS等專業(yè)軟件進行圖片處理對使用者的要求又比較高。即使市場上已有大量諸如此類的圖片處理軟件,如美圖秀秀、VSCO等,但大部分已上市的app在一些功能方面仍然具有局限性,不能完全滿足使用者的個性化需求。因此,開發(fā)一個可滿足用戶個性化需求的圖像處理軟件很有必要。
本文實現(xiàn)了一款人像深度處理app,本軟件能根據(jù)用戶的個性化需求,對于一張未經(jīng)處理的圖片,在使用本軟件進行個性化處理后,呈現(xiàn)出自然、美觀的效果。并且給用戶提供更加智能、便捷的圖片操作過程,操作過程簡潔明了,只需幾步便可完成復雜的操作,對于圖片處理不太擅長的用戶,還提供了方案市場這一功能,使用已經(jīng)預留好的方案,一鍵即可完成人像處理。而那些精通圖片處理的用戶,也可以將自己設計的方案上傳至方案市場,供其他用戶使用。
2 核心技術概述
2.1 OpenGL ES
OpenGL ES(OpenGL for Embeded System)是OpenGL(Open Graphics Library)的精簡子集,是以手持和嵌入式設備為目標的高級3D圖形API,如現(xiàn)在火爆的智能手機,支持桌面系統(tǒng),還是瀏覽器3D圖形標準WebGL[1]的基礎,支持多個平臺,如桌面端的Linux、Windows,移動端的Android、iOS等。
開發(fā)者可以使用Android自帶的OpenGL ES實現(xiàn)創(chuàng)建二維或者三維圖形,以及對圖片進行渲染的功能?,F(xiàn)在大多數(shù)用的是OpenGL ES2.0[2],較第一個版本增加特殊的效果,能利用最新的硬件所提供的優(yōu)勢。通過OpenGL ES,將圖片進行著色器渲染。
2.2 OpenCV
OpenCV作為一款開源的計算機視覺框架,封裝了超過1000個常見的圖像處理算法,其SDK語言支持Java、C++、Python等。借助OpenCV提供的SDK,Android開發(fā)可以實現(xiàn)圖像處理、識別、關鍵點定位、實時視頻分析與處理等移動端應用開發(fā)。
對于人像處理,要實現(xiàn)對皮膚細節(jié)的模糊,保留眼睛、鼻子、嘴等部分,通過OpenCV識別這些關鍵點[3],用OpenGL ES著色器渲染,將對應點映射過去,實現(xiàn)離屏渲染。
3 軟件界面設計
3.1 基本界面布局
對于軟件界面的設計,使用activity,一共設計6個界面,分別為主界面、圖片處理界面、選擇方案界面、自定義方案界面、簡易方案界面和設置界面。每個activity包含了用xml編寫的前端界面和用Java編寫的后端代碼。
3.2 前端界面設計
主界面樣式如圖1所示。
先是要選擇處理的文件類型。視頻擬定在下一步改善功能時添加,這里先預留好入口。主頁用來實現(xiàn)核心功能,方案市場提供了一個用戶自由免費分享方案碼的場所。所謂方案碼,是一種儲存每次生成人像方案的一串不規(guī)則字符,每個用戶都可以使用這一個方案碼生成同一種方案供自己使用。
簡易方案界面樣式如圖2所示。
簡易方案界面擬設定一屏幕的按鈕,每個按鈕代表了一個簡易功能,包括打馬賽克、濾鏡、翻轉(zhuǎn)等功能,用戶可以選擇一個或多個功能進行組合,達到自己想要的效果。相對于自定義方案,選擇簡易方案對于那些修圖要求不高的用戶來說可以大大節(jié)省時間成本而獲得一個較為滿意的結(jié)果。
4 基于OpenCV和OpenGL渲染實現(xiàn)
4.1 環(huán)境搭建
軟件開發(fā)基于Android Studio,android自帶OpenGL ES,所以不需要另外下載,只需要調(diào)用android的OpenGL庫。而OpenCV需要額外配置,大致步驟為將OpenCV的Android版本導入到工程中,之后在Modules選項中,將其中的OpenCVLibrary420的Sdk version和tools version改為和app中的Sdk version和tools version相同的版本。配置完之后,將下載好的OpenCV中的兩個文件復制到工程中。通過JNI配置OpenCV環(huán)境。
4.2 渲染機制
圖3為OpenGL渲染[4]的流程線。UI對象使用CPU處理為多維圖形與紋理,然后通過OpenGL ES調(diào)用GPU,使用GPU對圖形進行光柵化[5],之后開始繪制渲染后的圖形,渲染完成后再屏幕顯示。
OpenGL通過GLSurfaceView類,將結(jié)果直接顯示到屏幕,在頂點里進行紋理的操作,通過片源著色器渲染,可以看到效果。實際中有很多情況并不需要渲染到屏幕上,這個時候使用幀緩沖對象(FBO)就可以很方便地實現(xiàn)這類需求。幀緩沖對象可以讓渲染不渲染到屏幕上,而是渲染到離屏Buffer中,在FBO中進行特效的描述。將每種效果寫到單獨的一個類,并且在屏幕顯示之前的所有效果都不需要顯示到屏幕中,在屏幕顯示之前都將其使用幀緩沖對象進行緩存[6]。
4.3 進行渲染繪制的原理
OpenGL的顯示效果通過一個攝像頭進行,根據(jù)攝像頭的不同位置和坐標,會呈現(xiàn)出不同的效果。下面的圖4至圖7展示了部分本軟件使用的技術的原理。
通過OpenGL進行渲染的模板如圖4和圖5所示。在Java層聲明OpenGL世界坐標中的頂點數(shù)據(jù),將頂點著色器實例化到OpenGL,通過put方法放入到GPU中。在GPU中聲明的mVertexBuffer只聲明了內(nèi)存,處于游離狀態(tài)。在GPU中同樣包含一個片元著色器,將游離狀態(tài)的mVertexBuffer綁定到vPosition,確定要進行的操作。GPU中單獨存在一個采樣器中,對攝像頭進行采樣,從攝像頭中不斷獲取到數(shù)據(jù)。
以濾鏡處理為例,以上渲染方式可以使用圖5這張更加精簡的圖來概括。
簡要來說,可以將渲染濾鏡的步驟分為三步,第一步是攝像頭收集SurfaceTexture類采集到的數(shù)據(jù),第二步是使用OpenGL進行處理,最后一步是將處理好的結(jié)果再次渲染到攝像頭。
圖6顯示了兩個所需的著色器程序的調(diào)用過程。這兩個著色器程序位于GPU,在頂點著色器中,vPosition為攝像頭采樣形狀,vCoord將坐標傳遞給aCoord,aCoord經(jīng)過vary修飾,從頂點著色器傳遞到片元著色器,使片元著色器確定上色位置。在片元著色器上,控制vTexture等參數(shù)實現(xiàn)改變顏色、質(zhì)感等操作。
圖7顯示了攝像頭通過FBO的渲染過程。在這里,攝像頭采集到的數(shù)據(jù)直接輸出到屏幕上是無效數(shù)據(jù),需要用FBO進行截流,進行編輯即濾鏡處理,之后傳遞給攝像頭,以實現(xiàn)效果。
4.4 軟件實現(xiàn)特效舉例
下面展示一類渲染過程:眼睛部分渲染,如圖8。
先聲明眼睛坐標的屬性索引。在設置視窗后,要渲染到FBO緩存中,不直接顯示到屏幕。之后使用著色器程序,進行渲染和傳值。編寫頂點數(shù)據(jù),傳值后激活;紋理坐標,傳值后激活;傳mFace眼睛坐標給著色器,分別進行左右眼的換算到紋理坐標的操作。
之后進行激活圖層、綁定、傳遞參數(shù)、通知OpenGL繪制、解綁FBO、返回FBO的紋理id。
5 結(jié)束語
本文基于Android的渲染過程出發(fā),立足于研究Android、OpenCV、OpenGL相關技術和方法,克服了直接通過攝像頭渲染的不足和延遲過高等缺點,實現(xiàn)了通過FBO緩存渲染的方法。運用Android技術實現(xiàn)離屏渲染圖片,便于用戶能夠快速地進行圖片渲染分析,實現(xiàn)了快捷的圖片操作,能更好地適用于處理大量圖片和提高渲染效率,有利于用戶在更短的時間獲得更優(yōu)質(zhì)的體驗。下一階段將進一步研究實現(xiàn)對圖片像素操作的關聯(lián)分析和智能渲染,使其成為功能更加豐富,性能更加強大的人像深化處理的專業(yè)軟件。
參考文獻:
[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標準的圖像處理單元設計與實現(xiàn)[D].西安:西安電子科技大學,2017.
[3] 沈娟,徐英君.基于OpenCV的視頻人臉檢測[J].數(shù)碼世界,2019(10):1-2.
[4] 官酩杰.基于OpenGL ES的移動平臺圖形渲染引擎研究與實現(xiàn)[D].北京:北京交通大學,2010.
[5] 王志方.嵌入式GPU中圖元光柵化的設計與實現(xiàn)[D].長沙:湖南大學,2016.
[6] 高光磊,陳炳發(fā).基于FBO和GPU的動態(tài)CEM算法及實現(xiàn)[J].世界科技研究與發(fā)展,2008,30(4):440-442.
【通聯(lián)編輯:謝媛媛】