Android OpenGLES濾鏡開發之大眼效果

2021-08-31 21:00:16 字數 1646 閱讀 3196

前言

在很多美顏相機啊,抖音啊,都會有一些放大眼睛的效果,今天就來實現如何放大眼睛。

思路1、首先使用opencv定位到人臉

2、根據定位到的人臉去檢測人臉關鍵點,進而獲取到人眼睛的位置。

3、根據眼睛位置,對眼睛進行放大。

實現定位人臉

人臉的定位追蹤,在之前文章中已經寫過opencv實現人臉追蹤 當時是在xcode上寫的,把裡面的**移植到android中就可以了,這個是c寫的,所以需要移植到jni中。這裡的人臉模型,我採用的是opencv中提供的,當然也可以自己去訓練模型。

檢測人臉關鍵點

人臉關鍵點的檢測,有很多三方的sdk,比如說face++等等,都是要收費的,face++是檢測了68個關鍵點,這68個關鍵點都不是隨意分布的,都是有規律的。如下圖:

但是像face++這種,都是需要收費的,我從github上找了乙個免費的叫seetafaceengine它這個裡面有三個模組:人臉檢測模組(seetaface detection)、面部特徵點定位模組(seetaface alignment)以及人臉特徵提取與比對模組(seetaface identification)。這裡我用到的是seetaface alignment,用來檢測人臉的關鍵點。

它這裡面並不是定位了68個關鍵點,而是定位了5個關鍵點,即左眼(0)、右眼(1)、鼻子(2)、嘴巴左邊(3)、嘴巴右邊(4),這個分布也是有規律的,並不是隨便的點。**如下:將定位到的人臉,送去進行關鍵點的檢測

if

(faces.

size()

)}

放大眼睛

這裡是根據網上**中的乙個公式實現的, 大概在45頁左右有個這樣的描述,以及公式,就是根據這個來實現的。

這個公式是什麼意思呢?這個公式求出的值是採集的改變後的點距離眼睛中心點的位置,rmax表示的是最大放大的區域,r表示原來的點距離眼睛中心點的位置,a表示的是放大係數,所以當a=0的時候,公式的結果就是r,也就是沒有變化,不放大。

原理是什麼呢,就是在片元著色器,把眼睛周邊的需要放大的點取值成對應的眼睛內部的點的值,然後把這個值的座標賦值給gl_fragcolor,這樣就完成了眼睛的放大;

片元著色器:

// r:原來的點距離眼睛中心點的位置

//rmax: 放大區域

floatfs(

float r,

float rmax)

//根據需要採集的點 acoord 計算新的點(可能是需要改變為眼睛內部的點,完成放大的效果)

vec2 newcoorddistance

(vec2 coord,vec2 eye,

float rmax)

return newcoord;

}void

main()

效果圖

用最愛的明星做個效果圖,可以看出來眼睛部位是有明顯的放大的

Android OpenGL ES 開發入門

本系列文章圍繞關於使用opengl es繪圖的android開發者文件為主線,結合opengl程式設計指南來講述android opengl es開發入門。如果你沒有opengl相關知識,在閱讀opengl es demo 時,可能對圖形的繪製過程不太理解,以至於看完之後,也不知道如何繪製圖形。出於...

Android OpenGLES濾鏡開發之貼紙效果

前言 思路1 貼紙肯定也是需要定位到人臉的 2 找到貼紙需要放置的位置 3 將貼紙紋理和人本身紋理進行融合 實現人臉定位啥的,我就不說了,不清楚的可以去前面的文章看看,主要來看看貼紙是如何貼上去的 1.建立貼紙的紋理 opengl 紋理 mtextureid newint 1 openglutils...

Android OpenGL ES之新增動作

本文譯自 在螢幕上繪製物件是opengl的最基本功能,你可以使用其他的android圖形框架類,如 canvas 和drawable 物件來完成這些功能。opengles提供了一些用於在三維空間中移動和變換被繪製的物件的能力,以及其他的建立良好使用者體驗的獨特方式。在本文中,你需要使用前面幾篇博文中...