編者按:今天的介紹的教程輕松有趣,作者Adrian Rosebrock搭建了一款GIF動圖生成器,其中使用的是OpenCV,這一過程中會提到以下幾點技術:
如何用dlib庫進行人臉標記檢測并提取眼睛部分(因為動圖會在眼睛區域添加眼鏡)
如何計算旋轉角度,讓動圖眼鏡調整到合適位置
最后,如何用OpenCV生成動態GIF
想了解更多細節,就繼續讀下去吧!
準備工作和依賴環境
OpenCV和dlib
OpenCV是常用的人臉識別和基礎圖像處理工具,論智君此前也介紹過OpenCV,感興趣的同學可以閱讀:
用OpenCV實現八種不同的目標跟蹤算法
此外,Dlib是用來檢測面部標志的工具,可以讓我們定位眼睛在臉部的位置,并且讓“眼鏡”的圖標下降到這一位置。dlib的安裝教程:www.pyimagesearch.com/2018/01/22/install-dlib-easy-complete-guide/
ImageMagick
ImageMagick是一個跨平臺的、基于命令行的工具,能提供多種圖片處理功能,例如只用一行指令就能將PNG/JPG圖像轉換成PDF;多張圖片可以集合在一份PDF中;還可以繪制多邊形、線條或其他形狀。利用ImageMagick,我們還可以用一系列輸入圖像生成GIF圖片。
在Ununtu(或Raspbian)上用apt安裝ImageMagick的指令如下:
$ sudo apt-get install imagemagick
如果你用的是macOS,可能會用到HomeBrew:
$ brew install imagemagick
imutils
Imutils是一些列基礎圖像處理功能,包括轉換、旋轉、縮放等等。安裝指令:
$ pip install imutils
項目架構
我們的項目分為兩個目錄:
images/:也就是想要對其處理的原始圖像。
assets/:這一文件夾包含了我們的人臉探測器、面部標志檢測器和所有圖像以及相關掩碼。利用這些工具,我們會將“墨鏡”和“Deal With It”的文字添加到輸入圖像中。
由于配置參數較多,我決定創建一個JSON配置文件,不僅能在編輯參數時更容易,命令行的參數也更少。在這一任務中我們所需的所有配置參數都包含在config.json中。
用OpenCV生成GIFs
了解JSON配置文件
首先,我們從JSON配置文件開始。打開config.json,插入以下命令:
第2行和第3行是OpenCV深度學習人臉探測器的模型文件,第四行是dlib的面部標志探測器的路徑。
接下來我們打開一些圖片文件路徑:
5—8行是“墨鏡”和文字“Deal With It”以及相關掩碼的路徑,如下所示:
墨鏡
墨鏡的掩碼
文字
文字的掩碼
掩碼的作用是在照片上覆蓋對應的圖像。現在我們要對這個GIF生成器設置參數:
min_confidence表示人臉識別結果為正的最低概率。
steps表示生成的GIF所需要的幀數。每一個step我們都會將墨鏡從上至下逐幀移動,直到達到目標位置(眼睛)。
delay表示各幀之間的時間延遲。
final_delay表示最后一針的時間延遲。
loop表示GIF是否循環播放。
temp_dir表示臨時輸出的目錄,每一幀都會先存儲在這個文件夾中,再創建最終的GIF圖像。
開始創建
創建一個新文件夾,將其命名為create_gif.py,插入以下代碼,載入imutils、dlib、OpenCV:
接著,定義overlay_image函數:
overlay_image函數是將前景圖像(fg)覆蓋在背景圖像(bg)上,坐標coords通過(x, y)的坐標點表示。
之后,進行alpha合成完成重疊結果:
46—48行中,我們將前景、背景和alpha層轉換為[0,1]之間的浮點。接著,我們在51和52行執行alpha合成。最后,添加前景和背景,得出輸出,返回函數(37—40行)。
接著創建一個幫助函數,可以用ImageMagick從一系列圖片路徑中生成一個GIF:
create_gif函數可以處理一系列圖片,將它們組合成一張GIF動圖,并且還能在幀和幀之間設置一定的延遲或循環。具體來說,在這一函數中我們可以:
提取imagePaths(63行)
提取最后一張圖像的路徑,因為可能有分離的延遲(66行)
重新分配imagePaths,刪除最后一張圖片的路徑(67行)
組合命令行,開始執行convert創建GIF(72—75行)
創建自己腳本的命令行參數:
下載配置文件和“墨鏡”及其掩碼:
將OpenCV深度學習人臉檢測器載入內存中:
為了下載OpenCV的深度學習人臉檢測,我們會調用cv2.dnn.readNetFromCaffe(101和102行)。dnn模塊只能在OpenCV3.3及之后的版本中使用。人臉識別器會呈現出如下結果:
在103行,我們下載了dlib的人臉標志預測器,可以定位臉部以及各器官,例如眼睛、眉毛、鼻子、嘴巴、下巴等等:
接著,讓我們開始檢測臉部:
在這一部分,我們會:
下載輸入的照片image(106行)
創建一個blob,輸入進人臉檢測神經網絡(108和109行)
執行人臉檢測(113和114行)
確定人臉檢測的概率,檢查置信區間(119—124行)。如果標準不符合,我們就簡單地推出腳本(125行),反之則繼續。
提取面部并計算人臉的標記:
得到眼睛的坐標后,我們就能計算將“墨鏡”放置在哪里、應該怎樣放置:
首先,計算每只眼睛的中心以及二者之間的角度(145—151行)。之后對“墨鏡”進行旋轉(155行)和尺寸縮放(161和162行)。
之后,還要對掩碼進行移動,但是首先,我們需要將掩碼轉換成灰度并進行二值化運算(170和171行)。之后在進行旋轉和縮放(172和173行)。
創建GIF的幀:
動圖中,“墨鏡”會從上至下落到圖片中,所以每一幀都呈現的是墨鏡逐漸靠近人臉的過程。利用JSON配置變量steps對墨鏡位置進行調整。
最后一步是添加“DEAL WITH IT”的文字,這需要用另一個掩碼逐幀操作:
生成結果
現在可以看看我們的表情包生成器結果怎樣了,保證你已經下載了源代碼(原文地址見文末),打開終端,執行以下命令:
$ python create_gif.py --config config.json --image images/adrian.jpg
--output adrian_out.gif
[INFO] loading models...
[INFO] computing object detections...
[INFO] creating GIF...
[INFO] cleaning up...
可以看到,生成器能在不同角度檢測到眼睛的位置,結果比較理想!
-
圖像處理
+關注
關注
27文章
1295瀏覽量
56799 -
生成器
+關注
關注
7文章
317瀏覽量
21050 -
深度學習
+關注
關注
73文章
5507瀏覽量
121266
原文標題:用OpenCV創建GIFs,給你的照片戴上墨鏡
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論