使用OpenCV(C ++ / Python)進行人臉交換


--

 

 

 圖3.面部對齊。左:檢測到面部標志和凸包。中:凸包上的點的Delaunay三角剖分。右:通過仿射扭曲三角形進行面部對齊。

1 人臉對齊

1.1 臉部地標檢測

兩個臉部的幾何形狀非常不同,因此我們需要對源臉部進行一些扭曲以使其覆蓋目標臉部,但是我們還想確保我們不會使其扭曲而無法識別。

首先使用dlib在兩個圖像上檢測面部標志但是,與“ 臉部變形”不同,我們不也不應使用所有點進行臉部對齊。

我們只需要如圖所示的人臉外邊界上的點即可。

1.2 查找凸包
在計算機視覺和數學術語中,點或形狀的集合的邊界稱為“包”。沒有任何凹面的邊界稱為“凸殼”

在圖3中,左圖顯示了使用dlib檢測到的臉部界標為紅色,點的凸包顯示為藍色。

一組點的凸包可以使用OpenCV的concealHull函數來計算

python:

# points is numpy array of points obtained 
# using dlib.
hullIndex = cv2.convexHull(points, returnPoints = False)
# hullIndex is a vector of indices of points 
# that form the convex hull. 

 

c++:

vector<int> hullIndex;
// points is of type vector<Point2f> obtained 
// using dlib.
convexHull(points, hullIndex, false, false);
// hullIndex is a vector of indices of points 
// that form the convex hull.

 

 

1.3 Delaunay三角剖分
對齊的下一步是對凸包上的點進行Delaunay三角剖分在圖3的中間圖像中顯示了三角剖分。

這使我們可以將臉部分成較小的部分。我以前的文章詳細解釋了Delaunay三角剖分,請參見此處

1.4 仿射扭曲三角形

進行面對的最后步驟,以考慮源臉部和目標臉部之間的對應三角形,並將源臉部三角形仿射扭曲到目標臉部上。

有關我的臉部變形的更多信息,請參見我的文章

但是,如您在圖3的右圖中所看到的,對齊面部並將一個面部拍打在另一面部的上方看起來並不自然

由於兩個圖像之間的光照和膚色差異,可以看到接縫。下一步顯示如何無縫地組合兩個圖像。

 

 

2 無縫克隆

好的技術思想就像是魔術。優秀的魔術師結合了物理,心理學和良好的舊手技巧來達到令人難以置信的效果。

僅圖像扭曲看起來就很糟糕。將其與Seamless Cloning結合使用,結果是神奇的!我寫了一篇文章,解釋的細節在這里

這是OpenCV 3中的一項功能,可讓您無縫地將源圖像的一部分(由掩碼標識)克隆到目標圖像上。

python:

output = cv2.seamlessClone(src, dst, mask, center, cv2.NORMAL_CLONE)

 

c++:

seamlessClone(src, dst, mask, center, output, NORMAL_CLONE);

 

 

上面用法中src圖像如圖3所示。(右圖)。DST圖像是其上我們要混合源圖像(即特朗普的圖像)的圖像。

通過使用fillConvexPoly用白色填充凸包來計算蒙版,並且中心是包含蒙版的邊界框的中心。

 

總結:

臉部地標檢測(Facial Landmark)  點

查找凸包(Convex Hull ) 面

Delaunay三角剖分(Delaunay Triangulation ) 

仿射扭曲三角形(源臉部三角形仿射扭曲到目標臉部)(Affine warp triangles )

無縫克隆(Seamless Cloning)

 

 

 

 

 

 

 

 

 

 

 

--


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM