--html
圖3.面部對齊。左:檢測到面部標誌和凸包。中:凸包上的點的Delaunay三角剖分。右:經過仿射扭曲三角形進行面部對齊。python
1 人臉對齊c++
1.1 臉部地標檢測less
兩個臉部的幾何形狀很是不一樣,所以咱們須要對源臉部進行一些扭曲以使其覆蓋目標臉部,可是咱們還想確保咱們不會使其扭曲而沒法識別。函數
首先使用dlib在兩個圖像上檢測面部標誌。可是,與「 臉部變形」不一樣,咱們不也不該使用全部點進行臉部對齊。spa
咱們只須要如圖所示的人臉外邊界上的點便可。code
1.2 查找凸包
在計算機視覺和數學術語中,點或形狀的集合的邊界稱爲「包」。沒有任何凹面的邊界稱爲「凸殼」。orm
在圖3中,左圖顯示了使用dlib檢測到的臉部界標爲紅色,點的凸包顯示爲藍色。htm
一組點的凸包可使用OpenCV的concealHull函數來計算。blog
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)
--