肝!使用OpenCV为视频中美女加上眼线
計算機(jī)視覺是最令人興奮的領(lǐng)域之一,其應(yīng)用范圍非常廣泛。從醫(yī)學(xué)成像到創(chuàng)建最有趣的面部濾鏡等各個領(lǐng)域都充分見證了計算機(jī)視覺技術(shù)的強(qiáng)大。在本文中,我們將嘗試創(chuàng)建一個人造眼線筆來模仿Snapchat或Instagram濾波器,為視頻中的美女添加上美麗的眼線。最終的結(jié)果可以通過下面的動圖觀察到。
本文介紹的內(nèi)容適合想要通過計算機(jī)視覺來實(shí)現(xiàn)一個具有一定展示性功能的計算機(jī)視覺初學(xué)者。因此,在本文重我們會盡量簡化說明,如果您對完整的程序感興趣,可以在Github上找到完整的代碼。Github的鏈接在本文的文末給出。
在實(shí)現(xiàn)本文功能之前,我們需要設(shè)置一個新的虛擬環(huán)境并安裝所有必需的依賴項。這個過程比較簡單,我們也在Github里面給出了如何配置環(huán)境的具體過程。在本項目中,我們需要使用的工具有OpenCV,NumPy,imutils,SciPy和Dlib。有些小伙伴可能對這些工具和庫比較陌生,接下來我們簡單介紹一下每個模塊的作用。
OpenCV:用于圖像處理的最受歡迎的模塊之一。我們將使用OpenCV讀取,寫入和繪制圖像。
NumPy:在處理OpenCV項目時經(jīng)常使用NumPy。圖像本質(zhì)上是一個像素數(shù)組,OpenCV使用以NumPy數(shù)組形式存儲的這些數(shù)組,并對圖像執(zhí)行操作。
Imutils:Imutils附帶了自定義功能,使我們的計算機(jī)視覺工作變得更加輕松。在這里,我們將使用它來將dlib對象轉(zhuǎn)換為非常靈活且廣泛接受的numpy數(shù)組。
Scipy:顧名思義,SciPy用于python上的科學(xué)計算。我們將使用它來創(chuàng)建插值(如果現(xiàn)在沒有意義,可以的)。
Dlib:Dlib是一個包含各種ML算法的C ++庫。我們將使用dlib提取面部界標(biāo)點(diǎn)。
項目簡要介紹
該程序首先從每個面孔中提取68個界標(biāo)點(diǎn)。在這68個點(diǎn)中,點(diǎn)37–42屬于左眼,點(diǎn)43–48屬于右眼,具體形式如下圖所示。
因為我們的目標(biāo)是給面部添加眼線,所以我們只對37-48點(diǎn)感興趣,因此我們提取了這些點(diǎn)。我們將對這些提取的點(diǎn)進(jìn)行插值。插值意味著我們嘗試在兩個給定點(diǎn)之間插入點(diǎn)。我們可以使用的插值方式如下圖所示。
眼線算法的流程圖如下所示
接下來,我們將進(jìn)一步詳細(xì)描述該算法。如果小伙伴只對運(yùn)行代碼感興趣,可以跳至最后一部分。
算法介紹
我們首先需要提取臉部周圍邊界框的坐標(biāo)。
OpenCV將圖像轉(zhuǎn)換為NumPy數(shù)組。numpy.array(即圖像的矩陣表示形式)存儲在名為的變量中frame。我們使用一個名為face_detector()的函數(shù),該函數(shù)返回圍繞框架中所有臉部的包圍框的坐標(biāo)。這些邊界框坐標(biāo)存儲在一個名為bounding_boxes的變量中。遍歷循環(huán)bounding_boxes以將眼線應(yīng)用于幀中檢測到的每個臉部。face_landmark_points存儲68個坐標(biāo)點(diǎn)。eye_landmark_points是從getEyeLandmarkPts()函數(shù)中得到。
getEyeLandmarkPts()函數(shù)使用68個坐標(biāo)點(diǎn)作為輸入并返回具有左上眼瞼的坐標(biāo)4個矩陣,左上眼線(L_eye_top),左下眼線(L_eye_bottom)和相同的右眼(R_eye_top & R_eye_bottom)。這可以通過簡單的NumPy索引完成的。我們將端點(diǎn)(pt號37、40、43和46。請參見68個界標(biāo)點(diǎn)圖)向外移動5px,以使外觀更逼真。
現(xiàn)在,我們需要對這些點(diǎn)進(jìn)行插值以獲得平滑的曲線,進(jìn)而可以畫出眼線。我們需要對每個曲線進(jìn)行不同的處理(即L_eye_top,L_eye_bottom,R_eye_top,R_eye_bottom)。因此,我們?yōu)槊總€曲線使用單獨(dú)的變量名稱。interpolateCoordinates()用于在每條曲線上生成插值。重復(fù)使用該函數(shù),為每個曲線生成插值坐標(biāo)。這個函數(shù)為每個曲線返回一個插值點(diǎn)數(shù)組。
drawEyeLiner()函數(shù)將生成的插值點(diǎn)作為參數(shù),并在兩個連續(xù)點(diǎn)之間畫一條線。在兩個循環(huán)中為每個曲線完成此操作,一個循環(huán)用于左眼,另一個循環(huán)用于右眼。
調(diào)用項目
該項目的用發(fā)非常簡單,首先從Github上克隆到本地
接下來,打開命令提示符并鍵入以下代碼以運(yùn)行示例測試
python3 eyeliner.py -v "Media/Sample Video.mp4"我們也可以通過將視頻路徑放在參數(shù)中來使用自己的視頻。完整的CLI命令如下:
python eyeliner.py [-i image] [-v video] [-d dat] [-t thickness] [-c color] [-s save]每個參數(shù)的具體含義如下:
i?:要在其上繪制眼線的圖像的路徑
v?:要在其上繪制眼線的視頻的路徑。
v?:也可以通過網(wǎng)絡(luò)攝像頭獲取視頻。例如:python3 -v webcam -s "Webcam output"
t?:整數(shù)(整數(shù))以設(shè)置眼線的厚度。默認(rèn)值=?2。推薦的數(shù)值介于1-5之間
d:shape_predictor_68_face_landmarks.dat文件的路徑。默認(rèn)路徑在根目錄中。除非將shape_predictor_68_face_landmarks.dat文件存儲在其他位置,否則不需要使用此參數(shù)。
c :更改眼線的顏色。語法-c 255 255 255。默認(rèn)值=?0 0 0。其中每個數(shù)字代表其RGB值。
s?:要將輸出保存到的位置和文件名。注意程序在保存文件時會自動添加擴(kuò)展名。如果已經(jīng)存在同名文件,它將覆蓋該文件。
好了,對這個項目感興趣的小伙伴可以按照上面的說明來進(jìn)行嘗試,可以通過對程序的修改以達(dá)到自己的需求。如果小伙伴覺得這個項目比較有趣,文末給留個“好看”哦。
- End -
由于微信平臺算法改版,公號內(nèi)容將不再以時間排序展示,如果大家想第一時間看到我們的推送,強(qiáng)烈建議星標(biāo)我們和給我們多點(diǎn)點(diǎn)【在看】。星標(biāo)具體步驟為:
總結(jié)
以上是生活随笔為你收集整理的肝!使用OpenCV为视频中美女加上眼线的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 源码分享,仿英雄联盟对战游戏!
- 下一篇: 这7 款 MySQL 客户端工具,用了都