原文 http://www.learnopencv.com/face-morph-using-opencv-cpp-python/
作者:SATYA MALLICK
在本篇教程中將教大家如何用OpenCV做面部合成,把一張臉演變為另外一張臉。
圖片合成圖片合成首次在電影《Willow》(《風雲際會》)中得到大量運用,這是由工業光魔(譯者註:Industrial Light and Magic/ILM,電影特效製作公司)開發的一項技術。下面是電影的一個場景片段。
這個圖片合成背後的想法相當簡單。給定兩張圖片I和J,通過混合而成一張中間圖M。圖片I和J的混合程度由參數α控制,α的值在0和1之間(0≤α≤1)。當α= 0時,圖片M看似I;當α= 1時,圖片M看似J。簡單來講,你可以用以下方程在每個像素點(x,y)混合圖片
但是,用以上方程(假設α= 0.5)得到的國務卿希拉蕊•柯林頓與參議員特德•克魯茲的混合圖片,是下面這個有點糟糕的結果。
這個混合圖片看起來很鬧心,但它似乎在向你喊著要解決方案,懇求你無論如何在混合前把眼睛和嘴巴對準。當你想把兩位不同政治思想家的觀點糅合,如果沒有事先統一他們的思想,你會得到同樣鬧心的結果——這有點離題了。
所以,為了將圖片I過渡合成到圖片J,我們需要先在兩張圖片之間建立對應像素點。換句話說,對於圖片I中的每一個像素點 ,我們需要在圖片J中找到對應像素點 。假設我們已經神奇般地找到了所有對應點,我們可以用兩個步驟將圖片混合。第一步,我們需要計算合成圖片中像素點 的位置。可以由以下方程算出
第二步,我們需要利用以下方程找到像素點的像素強度
這就是合成過程,我們已經完成了。現在,讓我們去給川普投票吧!開玩笑的!就像川普一樣,我省略掉了一些重要的細節。想要在圖片I中找到圖片J中的每一個對應像素點,就如同在美國和墨西哥之間建10英尺高的牆一樣難。當然這不是不可能,只是有點費力不討好。
但是,找到部分對應點還是比較容易的。想要合成兩個相異的物體,比如一張貓的臉和一張人的臉,我們可以點擊兩張圖片中的部分像素點來建立對應關係,對於其餘的像素點則採用插值法來得到最終結果。我們接下來會看到面部合成的具體步驟,這種方法可以應用於任意兩個物體。
面部合成:一步一步來以下步驟可以合成兩張臉。為了簡化,我們假定這兩張圖片大小相同,但實際上這並不必要。
1.用「面部特徵檢測」找到對應點讓我們從獲取對應點開始。首先,我們可以通過檢測面部特徵點自動(或手工)獲得大量像素點。我用dlib庫檢測到68個對應點。接下來,我手工增加了4個點(1個在右側耳朵,1個在脖子處,2個在肩膀處)。最後,我增加了圖片的角點和邊的中點作為對應點。毋庸置疑,在頭部和頸部增加越多的點,得到的圖片效果就更好;反之,去掉手工點(只剩下自動點),得到的圖片效果就要差一些。
2.德洛內三角剖分算法我們從之前的步驟得到了兩個80個點的集合——每個圖片有一個集合。我們可以計算出兩個集合中對應點的平均值,由此獲得一個新的集合。我們在這個均值點集上使用德洛內三角剖分算法。這個算法將返回一個三角形列表,該列表由80個點的數組中點的索引表示(譯者註:點的「索引」在此為保存80個像素點坐標文件的行數,即每個數字代表一個點的坐標)。在這個例子中,三角剖分法根據80個點產生了149個三角形。該結果以三列數組的形式保存。以下顯示的是數組的前幾行。
Triangulation
38 40 37
35 30 29
38 37 20
18 37 36
33 32 30
…
該列表表示點38,40和37組成了一個三角形,以此類推。三角剖分法的結果顯示在下面的圖中。
請注意,兩張圖中的三角形抓取了近乎相似的區域。我們從對應點開始,由於使用了三角剖分,可以得到對應三角(或區域)。
3.圖片變形和alpha混合處理現在,我們具備智能混合兩張圖片的條件了。正如前文所言,混合的程度是由參數控制的。可以按以下步驟創建一張合成圖片。
找到合成圖片中的特徵點坐標:在合成圖片M中,我們可以用方程(1)找到全部80個點的坐標 。
計算仿射變換:我們有了圖片1中80個點的集合,圖片二中80個點的集合,以及合成圖片的80個點的集合。我們也知道這些像素點所確定的三角形。選取圖片1中的一個三角形和合成圖片中的對應三角形,計算仿射變換,將圖片1的三角形的三個頂點映射到合成圖片的對應三角形的三個頂點。在OpenCV中,可以使用getAffineTransform來計算149對三角形各自的仿射變換。最後,在圖片2和合成圖片間重複這個過程即可。
三角形變形:對於圖片1中的每個三角形,用之前步驟計算出的仿射變換來將三角形內的所有像素點變形到合成圖片中。對圖片1中的所有三角形重複使用這個變形過程,可得到圖片1的變形版。同樣的,可以得到圖片2的變形版。在OpenCV中,可以用warpAffine函數來實現這個變形。然而,warpAffine的輸入要求為一個圖像,而不是一個三角形。有個竅門是算出三角形的邊界框,在邊界框內用warpAffine變形所有像素點,然後遮蓋掉三角形外的像素點。可以用fillConvexPoly創建三角形狀的遮片。一定要確保用warpAffine的同時使用blendMode BORDERREFLECT101。這樣會將接合處隱藏得很好——比國務卿柯林頓藏她的郵箱藏得好多了!(譯者註:請搜索柯林頓的Email Scandal,這位美國政界的女性翹楚似乎不大滿意白宮配發給她的郵箱啊~)
Alpha混合變形圖像:在之前的步驟裡我們得到了圖片1和圖片2的變形版。這些圖片可以用方程(2)做alpha混合,會得到最終的合成圖片。在我提供的代碼裡,把三角形變形和alpha混合組合成簡單的一步。
面部合成結果應用以上技巧合成的結果如下方所示。中間的圖片是將左、右兩圖按50%的比例進行混合。本文的第一個視頻展示了使用不同alpha數值的動畫。動畫可以很好地掩蓋合成過程的一些瑕疵;參議員特德•克魯茲也喜歡這樣的小把戲。
大多數面部特徵是對準的。但臉部外側的部分重合得不好,因為在那些區域我們選取的對應點較少。你可以手工增加額外的像素點來修正未對準的部分,以此獲得更棒的效果。
selenium驅動器配置詳解
抓取單博主的所有微博及其評論
爬蟲神器PyQuery的使用方法
pyquery一些自定義的用法
【視頻】貓途鷹網站評論數據抓取
【視頻講解】在scrapy框架中如何使用selenium?
【實戰視頻】使用scrapy寫爬蟲-爬知乎live
簡易SQLite3資料庫學習
【視頻教程】對視頻進行基本操作
【視頻】抓包小練習-B站評論數據抓取
fake-useragent庫:值得花2分鐘學習的庫
【視頻】爬取餓了麼平臺上的門店信息
如何抓取視頻資源-以頭條視頻為例
當爬蟲遭遇驗證碼,怎麼辦
【視頻】手把手教你抓美女~
【視頻】有了selenium,小白也可以自豪的說:「去TMD的抓包、cookie」
【視頻】快來get新技能--抓包+cookie,爬微博不再是夢
【視頻教程】用python批量抓取簡書用戶信息
識別假貨有絕招,就用python爬淘寶評論
用Python抓取百度地圖裡的店名,地址和聯繫方式
文本處理分析gensim:用Word2Vec進行文本分析
Python NLP中的五大英雄
用SenticNet庫做細粒度情感分析
如何對csv文件中的文本數據進行分析處理
複雜網絡分析數據準備篇
文本分析之網絡關係
用詞雲圖解讀「於歡案」
基於共現發現人物關係的python實現
用pyecharts製作詞雲圖
OpenCV:快速入門圖片人臉識別
好玩的OpenCV:圖片操作的基本知識(1)
好玩的OpenCV:圖像操作的基本知識(2)
OpenCV:計算圖片有多色
如何對數據進行各種排序?
其他【視頻】初學者必看:python環境配置
開扒皮自己微信的秘密
初識裝飾器函數
計算運行時間-裝飾器實現
花十分鐘,給愛機安裝個MongoDB
chardet庫:輕鬆識別文件的編碼格式
使用Python登錄QQ郵箱發送QQ郵件
WTF Python: 開啟你的懵逼模式
8行代碼實現微信聊天機器人
WTF Python: 開啟你的懵逼模式
WTF Python:開啟懵逼模式第二彈
本文不是原創,無需給我紅包。如果覺得大鄧給力,可將本文分享給親朋好友,謝謝大家支持。
項目代碼
連結: https://pan.baidu.com/s/1i5Bvdo5 密碼: ipv6