dlib19.9+opencv3.4人臉檢測自動加墨鏡
今天我們來驗證一下dlib的人臉識別的5點特徵點提取效果,並利用這五個點給人臉加上一個墨鏡。
5個特徵點
dlib提供了人臉5個特徵點的提取模板,但在官網的目錄下已經打不開了,瀏覽器中點擊時出現一堆亂碼,不知是什麼原因。我在github上搜索,還好,找到一個利用這5個特徵點給人體自動加上一頂聖誕帽的項目,在那裡可以找到shape_predictor_5_face_landmarks.dat文件,當然,68個特徵點的模板文件也一樣無法打開,在csdn上搜索,或者在dlib原來託管的sourceforge網站上可以下載,感興趣的同學可以自行查找。
提取5個特徵點的python語句也非常簡單,首先建立一個探測器來檢測人臉:
detector = dlib.get_frontal_face_detector()
讀入圖片進行檢測:
faces = detector(img,1)
建立提取特徵點的函數:
landmark_predictor = dlib.shape_predictor("shape_predictor_5_face_landmarks.dat")
將檢測到的人臉方框輸入進行提取:
shape = landmark_predictor(img,d)
5個特徵點的坐標就包含在shape中,分別用shape.part(0-4)來表示。
5個特徵點分別為左右眼角和人中位置。
這裡給出實例如下:
人臉加墨鏡
5個特徵點只能大概標識出人臉的位置,可以用於在人臉上增加一些有趣的小飾件,比如墨鏡之類。
我在網路上進行搜索,奇怪的是,dlib發行了這麼久,網路上關於人臉加墨鏡的例子也很多,但可以自適應人臉傾斜角度的文章卻幾乎找不到,問這個問題的帖子倒是很多,本博文給出一個簡單的解決方案,供感興趣的同學參考。
墨鏡準備
首先我們要找到一個經過摳圖的墨鏡,這個墨鏡logo的尺寸大有講究,假如墨鏡本身的尺寸為w,h,那麼背景的尺寸應該為墨鏡尺寸對角線長度的正方形,即sqrt(w**2+h**2)。這樣才能根據人臉的角度來旋轉墨鏡。
墨鏡logo的樣板如下:
旋轉
然後我們根據5個特徵點中的第0點和第2點來計算人臉的角度。
根據計算出的角度對墨鏡logo進行旋轉,比如旋轉30°效果如下:
製作蒙版
分別製作兩個互反的正版和負版,分別對墨鏡和圖片人臉相應區域進行摳圖,蒙版的效果如下:
複合
將墨鏡和人臉的蒙版效果圖疊加,並將疊加後的圖片重新賦值給原圖片,就實現了自動給人臉加墨鏡的效果。
最終的效果如下:
圖片中墨鏡位置好像有一點點偏差,這是因為我在製作墨鏡logo時,墨鏡並未嚴格處於背景的中心,時間關係,就留著這一點瑕疵吧。
代碼可以在我的csdn上搜索同名博客即可。
動態驗證
我的電腦實在太過古老,速度太慢,勉強看吧。
TAG:艾克思 |