人臉融合?沒有想象中難!
顏如玉
顏如玉 —— python + opencv 人臉融合程式,可實現類似天天P圖瘋狂換臉、face++人臉融合效果
專案描述
最近隨著各種技術的發展,影像方面的人臉處理技術越來越廣泛。各大相機軟體都有美顏、貼圖、換髮型、變臉等功能。天天P圖與Face++也都推出人臉處理的 API,不過價格方面就有點不親民了。於是本人將之前研究完成的人臉融合演算法開源出來。
本文會一步步帶你瞭解人臉融合的實現過程。
效果對比
國際慣例,我們看看顏如玉與天天P圖、Face++合成效果的對比:
模特圖 與 待融合圖
結果對比
注:Face++ 為呼叫其官網 API 生成的效果,天天P圖則是直接使用該 APP 生成的效果
實現步驟
零、融合函式
先看看程式入口函式
core.face_merge(src_img='images/model.jpg', dst_img='images/20171030175254.jpg', out_img='images/output.jpg', face_area=[50, 30, 500, 485], alpha=0.75, blur_size=(15, 10), mat_multiple=0.95)
引數含義:
src_img —— 模特圖片
dst_img —— 待融合的圖片
out_img —— 結果圖片輸出路徑
face_area —— 指定模板圖中進行人臉融合的人臉框位置。四個正整數陣列,依次代表人臉框左上角縱座標(top),左上角橫座標(left),人臉框寬度(width),人臉框高度(height),透過設定改引數可以減少結果的大範圍變形,把變形風險控制在人臉框區域
alpha —— 融合比例,範圍 [0,1]。數字越大融合結果包含越多融合圖 (dst_img) 特徵。
blur_size—— 模糊核大小,用於模糊人臉融合邊緣,減少融合後的違和感
mat_multiple —— 縮放獲取到的人臉心型區域
一、 檢測及關鍵的定位
人臉的檢測以及關鍵點定位有多種實現方案
使用開源 Dlib 庫檢測及定位(定位68個關鍵點)
使用騰訊平臺的人臉識別及定位API (定位90個關鍵點)
使用Face++平臺的人臉識別定位API(定位106個關鍵點)
本文采用的是Face++的 api,因為商用情況下 Face++ 定位的定數最多
// 獲取兩張圖片的人臉關鍵點(矩陣格式與陣列格式)src_matrix, src_points, err = core.face_points(src_img) dst_matrix, dst_points, err = core.face_points(dst_img)
二、對齊人臉角度
在待融合圖人像不是側臉的情況下,我們可以同過調整平面位置及角度讓其與模特圖的人臉重合
// opencv 讀取圖片 src_img = cv2.imread(src_img, cv2.IMREAD_COLOR) dst_img = cv2.imread(dst_img, cv2.IMREAD_COLOR) dst_img = transformation_points(src_img=src_img, src_points=src_matrix[core.FACE_POINTS], dst_img=dst_img, dst_points=dst_matrix[core.FACE_POINTS])
注:src_points 已經 dst_points 傳入引數為第一步獲取的人臉關鍵點矩陣
對齊採用“常規 Procrustes 分析法”
具體演算法來源: 個人部落格步驟2
對齊結果:
結果展示
三、再次取點後融合臉部
對步驟二轉換後的帶融合圖片再次取關鍵的,然後與模特圖的關鍵點一起做三角融合成新的圖片
dst_img = morph_img(src_img, src_points, dst_img, dst_points, alpha)
融合結果:
結果展示
具體的三角融合演算法解說參考
四、處理加工模特圖片
再次對上一步的結果圖進行取點,然後運用三角仿射將模特圖片臉部輪廓、關鍵點變形成上一步得到的臉部關鍵點
src_img = tran_src(src_img, src_points, dst_points, face_area)
處理結果:
結果展示
五、將融合後的臉部貼到模特圖上
最後一步是將融合後的新圖片臉部區域用泊松融合演算法貼到模特圖上。泊松融合可直接使用opencv提供的函式
dst_img = merge_img(src_img, dst_img, dst_matrix, dst_points, k_size, mat_multiple)
def merge_img(src_img, dst_img, dst_matrix, dst_points, k_size=None, mat_multiple=None): face_mask = np.zeros(src_img.shape, dtype=src_img.dtype) for group in core.OVERLAY_POINTS: cv2.fillConvexPoly(face_mask, cv2.convexHull(dst_matrix[group]), (255, 255, 255)) r = cv2.boundingRect(np.float32([dst_points[:core.FACE_END]])) center = (r[0] + int(r[2] / 2), r[1] + int(r[3] / 2)) if mat_multiple: mat = cv2.getRotationMatrix2D(center, 0, mat_multiple) face_mask = cv2.warpAffine(face_mask, mat, (face_mask.shape[1], face_mask.shape[0])) if k_size: face_mask = cv2.blur(face_mask, k_size, center) return cv2.seamlessClone(np.uint8(dst_img), src_img, face_mask, center, cv2.NORMAL_CLONE)
函式示意圖:
步驟展示
總結
融合到此就大功告成了,具體的程式碼已經開源在本人 上。
融合後還可對結果進行美顏處理,以達到更好的效果!
感謝閱讀。
作者:zibin
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2370/viewspace-2803359/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Netty快速上手:Netty沒有你想象的那麼難Netty
- 相親原始碼中移動支付的實現,沒有想象中那麼難原始碼
- 升級struts2-2.5,其實並沒有想象中的那麼難
- 想拿到BAT的前端開發崗offer,並沒有想象中的那麼難!BAT前端
- 人臉融合簡單demo
- 全球“萬人迷”MySQL或許並沒有想象中的那麼“香”MySql
- 超越身邊80%的人,其實沒有你想象的那麼難!
- CSS 滾屏效果,要比想象中的難CSS
- 基本型號 14 英寸 MacBook Pro 可能沒有您想象中那麼快Mac
- 在遊戲裡新增簡單模式,沒有想象中那麼簡單遊戲模式
- 資料技術大融合,HSTAP資料庫有多少想象空間?資料庫
- 有沒有夫妻相?刷一下臉就知道!
- 復刻或重製老遊戲,可能並沒有想象中那麼簡單遊戲
- OLED螢幕還未普及,移動VR沒有想象中爆發那麼快VR
- 利用Python寫個開心消消樂小遊戲,並沒有想象中的複雜Python遊戲
- 人臉識別遇難題,平臺先行破局
- [譯] 我無法想象沒有 Git 別名的的場景Git
- 「碼農讀書」:我們並沒有自己想象的那麼理性
- 極客視角看安全:智慧生活遠沒想象中安全
- 遊戲技術中臺要想起作用,沒有3年很難遊戲
- Java轉python機器學習,並沒有大家想象的那麼美好!JavaPython機器學習
- 為什麼中國人沒有自己的程式語言?
- 人臉美化和人臉識別在美顏SDK中的具體應用
- pgsql 中沒有any()?SQL
- 解讀 App Store 稽核黑箱政策 —— 遠沒有你想象的那麼邪惡APP
- 人臉識別不斷解鎖新場景 想象空間待進一步開啟
- 目前人臉識別中存在的主要技術難題
- API 與 Webhook,其實並沒有那麼難懂APIWebHook
- Android 架構元件 - 讓天下沒有難做的 AppAndroid架構元件APP
- 無程式碼平臺之間的區別,和你想象中的無程式碼開發有沒差異?
- 快來看!這兒有個人比你還不要臉!
- C庫中沒有itoa以及C++中string沒有split方法的原因C++
- 人臉活體檢測人臉識別:眨眼+張口
- python ubuntu dlib人臉識別3-人臉對齊PythonUbuntu
- 【面試】工作中遇到的難點及解決方案——人臉解鎖相機衝突問題面試
- 人臉檢測識別,人臉檢測,人臉識別,離線檢測,C#原始碼C#原始碼
- linux系統中既沒有yum命令也沒有wget命令Linuxwget
- 人臉識別之特徵臉方法(Eigenface)特徵