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