在本教程中霜旧,我們將學(xué)習(xí)如何使用C ++和Python中的OpenCV和DLib將一個圖像上的面部換成另一個完全不同的面部棚潦。
為什么Face-Swap很難?
主要存在一下的四個方面的問題:
首先疮跑,不同的人面部的幾何形狀差別很大
其次组贺,臉部的光線與皮膚的色調(diào)相結(jié)合可以使圖像看起來非常不同。
第三祖娘,面部的姿勢(或攝像機角度失尖,如果你愿意)可以顯著變化。
最后渐苏,皮膚的質(zhì)地可以從光滑到幾乎像皮革一樣堅硬掀潮。
本文提出的技術(shù)將解決前兩個問題,但不是最后兩個問題琼富。
FaceSwap:使用OpenCV逐步完成
1.面部對齊:要將一個面替換為另一個面仪吧,我們首先需要將一個面大致放在另一個面上,以便覆蓋下面的面鞠眉。一個例子如圖1所示薯鼠。
圖1:左:檢測到的面部標(biāo)志和凸殼 中:delaunay三角剖分凸殼上的點 右:用過仿射warp三角形進行面部對齊
1.1面部地標(biāo)檢測
兩個面的幾何形狀是非常不同的择诈,因此我們需要稍微扭曲源面部以覆蓋目標(biāo)面部,但我們也希望確保我們不會將其扭曲到無法識別的位置出皇。為此羞芍,我們要實現(xiàn)這一目標(biāo)。首先使用dlib 檢測兩個圖像上的面部標(biāo)志郊艘。但是與面部變形不同荷科,我們不會也不應(yīng)該使用所有點進行面部對齊。我們只需要在圖像中顯示的面部外邊界上的點纱注。
1.2查找凸殼
在計算機視覺和數(shù)學(xué)術(shù)語中步做,點或形狀集合的邊界稱為“殼”。沒有任何凹陷的邊界稱為“凸殼”奈附。在圖1中,左側(cè)的圖像顯示了dlib檢測到的面部標(biāo)志使用紅色的點來描述煮剧,并且點的凸包顯示為藍(lán)色斥滤。可以使用OpenCV的convexHull函數(shù)計算一組點的凸包勉盅。
Python:
# 使用dlib來獲得面部的標(biāo)志點佑颇,類型是數(shù)組(包含所有檢測到的點)
hullIndex = cv2.convexHull(points, returnPoints =False)
# hullIndex 是一個點的索引組成的向量 ,來形成凸殼
1.3 Delaunay三角剖分
對齊的下一步是對凸包上的點進行Delaunay三角剖分草娜。三角剖分顯示在圖1中間的圖像中挑胸。這使我們可以將面部分成更小的部分。
1.4仿射經(jīng)線三角形
面部對齊的最后步驟宰闰,考慮到源面部和目標(biāo)面部之間的相應(yīng)三角形茬贵,我們將源面部三角形仿射到目標(biāo)面部上。但是正如你在圖1的右圖所示移袍,對齊臉部并將一張臉貼在另一面上幾乎看起來不自然解藻。由于兩個圖像之間的光照和膚色差異,接縫是可見的葡盗。下一步顯示如何無縫地組合兩個圖像螟左。
2.無縫克隆:良好的技術(shù)理念就像是好的魔法觅够。好的魔術(shù)師使用物理學(xué)胶背,心理學(xué)和良好的舊手法相結(jié)合來實現(xiàn)令人難以置信的。僅從圖像仿射warp上看結(jié)果非常糟糕(圖1中的左圖)喘先。但將它與無縫克隆相結(jié)合钳吟,結(jié)果是神奇的!
它是OpenCV 3中的一項功能苹祟,允許您將源圖像的一部分(由掩膜標(biāo)識)無縫復(fù)制到目標(biāo)圖像上砸抛。
output = cv2.seamlessClone(src, dst, mask, center, cv2.NORMAL_CLONE)
圖2:src-源面部 dst-目標(biāo)面部 output-面部交換結(jié)果
使用fillConvexPoly通過填充凸包來計算mask评雌,并且中心是包含mask的邊界框的中心。
openCV【實踐系列】6——使用OpenCV進行面部交換(換臉)
https://bbs.easyaiforum.cn/thread-705-1-1.html
(出處: 易學(xué)智能)