假若直接等比例放大則會使眼睛範圍邊界有不自然的切割感
我們可以透過 Interactive Image Warping 中下面的 scaling 公式來消除切割感
這個方法簡單來說,越靠近圓邊,則取得的位置會越接近與原本位置,來達到視覺上的平滑
公式會回傳更新後與圓心的距離,例如原本位置距離圓心為 0.8,帶入公式後假如得到 0.2 ,代表就是回傳該方向距離位置的顏色來顯示
- fs(r) : 最後會得到的距離
- r : 目前與中心距離
- r max : 範圍半徑
- a : 表示強度 instensity (大於0 為放大,小於0 為縮小)
由下面表格發現,在越接近邊緣時會越收斂
套入公式
於是我們將剛剛公式套入 fragement 中,並且加入左眼與右眼
首先我們先定義由外面帶入 Uniform 的 struct,並且新增了左右兩眼的眼睛範圍與兩眼的瞳孔,以及強度
若在放大瞳孔放大範圍內,則套用公式取得新的位置
最後在 fragment function 裡判斷是否在左右眼範圍內,是的話則透過上面 enlargePosition function 將目前顯示座標改為偏移後的座標,若在範圍外則顯示原本座標
成果
可以補上一個 slider 調整 instensity 的縮放大小
當然也可以用在相機錄影上,只要透過 GPUImage camera 的 delegate 將影像 pixelBuffer 給 Vision 接著與 Image 處理方式一樣
總結
透過 Vision 臉部偵測 與 GPUImage Metal 繪製來達到簡單的眼睛放大效果,但也有些缺點,就是與目前商用訓練模型的臉部偵測精準度與特徵數量上有差距,以及再根據部位的放大方法可以再加強,例如眼睛放大範圍貼合度,而非單純的使用原形,會使得眼睛細長在放大部分會變得很不自然(甚至將眉毛變形)