Python+OpenCV實現實時視訊3D換臉
阿新 • • 發佈:2018-11-27
目錄
-
開發環境
- Python 2.X或Python3.X
- OpenCV
- NumPy
- DLIB
- pygame
- PyOpenGL
- 必須從此處下載面部對齊模型:http://sourceforge.net/projects/dclib/files/dlib/v18.10/shape_predictor_68_face_landmarks.dat.bz2並將其解壓縮到主專案目錄。
-
執行機制
首先,我們獲取輸入影象(我們想要在自己的臉上看到的人的影象)並找到面部區域及其地標。一旦我們得到了我們將3D模型擬合到那些地標(稍後更多),投射到影象空間的模型的頂點將是我們的紋理座標。一旦完成並且所有內容都已初始化,相機將開始捕獲影象。對於每個捕獲的影象,執行以下步驟:
- 檢測面部區域並定位面部標誌。
- 3D模型適用於定位的地標。
- 使用pygame渲染3D模型,其中初始化期間獲得紋理。
- 使用羽化(α混合)和非常簡單的顏色校正將渲染模型的影象與從相機獲得的影象混合。
- 最終影象顯示給使用者。
整個過程中最關鍵的因素是3D模型的擬合。該模型本身包括:
- 中性面的3D形狀(頂點集),
- 一些混合形狀,可以新增到中性面,以產生張口,眉毛等,
- 面部形狀的一組三元組,形成面部的三角形網格,
- 兩組索引,用於建立由界標定位器找到的界標與3D面部形狀的頂點之間的對應關係。
使用以下等式將模型投影到影象空間中:
其中s是投影形狀,a是縮放參數,P是旋轉3D表面形狀的旋轉矩陣的前兩行,S_0是中性面形狀,w_1-n是混合形狀權重,S_1-n是blendshapes,t是2D平移向量,n是混合形狀的數量。
通過最小化投影形狀和區域性標誌之間的差異來完成模型擬合。使用高斯牛頓法,相對於混合形狀權重,縮放,旋轉和平移完成最小化。
-
案例效果
接下來使用實時視訊將愛因斯坦的臉移植到我的臉上~
原圖片如下:
移植後效果如下:
-
案例下載
案例Demo下載:https://download.csdn.net/download/m0_38106923/10593086