使用Python+OpenCV進行面部合成

2021-02-13 大鄧和他的Python

原文 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

相關焦點

  • 手把手:使用OpenCV進行面部合成— C++ / Python
    點擊視頻:一分鐘告訴你如何進行面部合成這篇教程將教大家如何用OpenCV做面部合成,把一張臉演變為另外一張臉。
  • 使用OpenCv和Dlib進行打哈欠檢測
    打哈欠檢測與應用打哈欠檢測就是使用OpenCV和Dlib來檢測打哈欠(由於疲勞或無聊而張大嘴巴深吸氣)。可廣泛應用於自駕車、駕駛員疲勞檢測、駕駛員睡意檢測、駕駛員意識檢測等領域。安裝OpenCv和Dlib庫OpenCv的安裝如下:pip install opencv-pythonDlib的安裝如下:pip install cmake
  • 在Ubuntu中安裝OpenCV-Python | 三
    但是在本教程中,我們還使用Matplotlib進行一些簡單而又漂亮的繪圖目的(與OpenCV相比,我感覺好多了)。Matplotlib是可選的,但強烈建議使用。同樣,我們還將看到IPython,這是一個強烈推薦的交互式Python終端。
  • 使用Python+OpenCV實現圖像數據採集
    通常,數據科學家會建立一個圖像識別模型,觀察其準確性,如果足夠高,就表示工作完成了。
  • OpenCV Python 4.0安裝與開發注意事項
    /安裝OpenCV-Python如果你是第一次使用OpenCV Python開發包,想要安裝OpenCV Python4.0隻要執行如下命令行即可:pip install opencv-python上述命令行會成功安裝OpenCV4.0開發包如果你還想使用OpenCV Python的擴展模塊,執行如下命令行即可:pip install
  • opencv-python獲取圖像:面向對象與面向過程
    運行環境:win10系統 python==3.6 opencv-contrib-python== 4.1.0第一行「# -*- coding: utf-8 -*-」 告訴Python解釋器,按照UTF-8編碼讀取原始碼"""import cv2image=cv2.imread('lena.JPG') #讀取本地圖片,
  • Python中如何利用Opencv打開視頻或圖像並用PyQt控制項顯示
    OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS作業系統上,使用起來十分方便,把它與PyQt結合起來,就可以順利的操作視頻、圖像了。具體安裝請自行百度,這裡介紹使用方法。
  • 聽說你用Python?那你可別中招了!
    (1)公司員工直接使用pip install internal_package_name的方式從pypi.org安裝私有庫;(2)公司員工已配置默認從私有倉庫安裝,但使用--extra-index-url參數指定額外的倉庫。這種情況下pip會同時查找私有庫和額外指定的倉庫,選擇高版本進行安裝。
  • 使用Fast.ai和OpenCV進行視頻面部表情和意識檢測
    使用fast.ai庫訓練面部表情分類模型,從您的網絡攝像頭或視頻文件中讀取面部表情,最後添加面部標記以跟蹤您的眼睛以確定意識!在進行該項目時,面臨的一大挑戰是弄清楚如何使用經過訓練的分類器,使其能夠有效地用於實時視頻和視頻文件。第一步是用卷積神經網絡訓練圖像分類模型。
  • 用Python做一個縮放自如的聖誕老人
    實現,而opencv進行圖片縮放是極其容易的,不過這次我們要生成的是一組等比縮放的圖片,所以在cv2.resize方法的使用上可能跟以往略有出入,先來看函數原型:cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
  • 重磅發布 | OpenCV 4.0正式來了
    https://github.com/opencv/opencv/wiki/ChangeLogrelease note中介紹了OpenCV4.0 內含一些特別有用的新特性與新模塊,下面就來先睹為快!新特性1.A lot of C API from OpenCV 1.x has been removed.
  • 50 行代碼,看 Python + OpenCV 玩轉實時圖像處理!
    1、導入庫文件這裡主要使用PySimpleGUI、cv2和numpy庫文件,PySimpleGUI庫文件實現GUI可視化,cv2庫文件是Python的OpenCV接口文件,numpy庫文件實現數值的轉換和運算
  • OpenCV黑魔法之隱身衣 | 附源碼
    在這篇文章中,我們將學習如何使用OpenCV中的簡單計算機視覺技術創建我們自己的「隱形衣」。文末會分享 C++和python的代碼。哈利波特的隱身衣效果那是哈利·波特在試他的隱形衣!事實上,你可以用一種叫做顏色檢測和分割的圖像處理技術來創造這種神奇的體驗。
  • 用Python教你通過微信來控制電腦攝像頭
    如果說強大的標準庫奠定了Python發展的基石,豐富的第三方庫則是python不斷發展的保證
  • 學習Opencv不得不掌握的操作
    ;< img8 << endl;   //下面都是淺拷貝,指針指向同一個實例   Mat img9 = img8;   Mat img10(img8);   waitKey(0);   return 0;}兩種方法,全局固定閾值二值化和局部自適應閾值二值化全局固定閾值很容易理解,就是對整幅圖像都是用一個統一的閾值來進行二值化
  • OpenCV-Python 光流|四十八
    目標在本章中,我們將了解光流的概念及其使用Lucas-Kanade方法的估計。我們將使用cv.calcOpticalFlowPyrLK()之類的函數來跟蹤視頻中的特徵點。為了確定點,我們使用cv.goodFeaturesToTrack()。我們採用第一幀,檢測其中的一些Shi-Tomasi角點,然後使用Lucas-Kanade光流迭代地跟蹤這些點。對於函數cv.calcOpticalFlowPyrLK(),我們傳遞前一幀,前一點和下一幀。它返回下一個點以及一些狀態碼,如果找到下一個點,狀態碼的值為1,否則為零。
  • Python實時獲取攝像頭,給自己P上墨鏡菸斗特效
    1.從攝像頭獲取視頻流,並轉換為一幀一幀的圖像,然後將圖像信息傳遞給opencv這個工具庫處理,返回灰度圖像(就像你使用本地靜態圖片一樣)2.程序啟動後,根據監聽器信息,使用一個while循環,不斷的加載視頻圖像,然後返回給opencv工具呈現圖像信息。3.創建一個鍵盤事件監聽,按下"d"鍵,則開始執行面部匹配,並進行面具加載(這個過程是動態的,你可以隨時移動)。
  • 基於python+opencv的圖像目標區域自動提取
    因此我們要解決的問題變為:提取矩形的四個角落、進行透視變換。檢測矩形並提取坐標需要對圖像進行預處理、邊緣檢測、提取輪廓、檢測凸包、角點檢測。OpenCV實現基於特徵的圖像對齊中文簡歷表格提取,手寫漢字識別(Python+OpenCV)票據圖片複雜表格框識別(票據單元格切割)二、使用Python和OpenCV檢測和標記湖面輪廓我們將使用OpenCV探測地圖中湖面的輪廓,並標記面積最大的湖面。
  • python+ pycharm 環境安裝 + pycharm使用
    ,點擊Windows(因為這裡是Windows系統所以選擇Windows,你是Mac就選擇Mac)4.這裡全是迭代的歷史版本號,我們選擇最新的版本點擊進入5.進入後一直滑到最底下,根據自己的電腦是32位或者64位進行下載6.下載完成後開始安裝,打開下載好的安裝包
  • 使用OpenCV進行模糊檢測(拉普拉斯算子)
    接下來,我將向你展示如何使用OpenCV、Python和Laplacian算子計算圖像中的模糊量。在這篇文章的結尾,你將能夠應用Laplacian方法到你自己的照片來檢測模糊的程度。我們的目標是使用OpenCV進行模糊檢測並將圖像標記為模糊。正如你所看到的,有些圖像是模糊的,有些則不是。我們的目標是正確地標記每個圖像模糊或非模糊。