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