超詳細(xì)注釋之OpenCV dlib實(shí)現(xiàn)人臉采集
上一篇博客中,我們了解了什么是面部標(biāo)志,以及如何使用dlib,OpenCV和Python檢測它們。利用dlib的HOG SVM的形狀預(yù)測器獲得面部ROI中面部區(qū)域的68個(gè)點(diǎn)(x,y)坐標(biāo)。
這一篇博客中,將演示如何使用NumPy數(shù)組切片魔術(shù)來分別訪問每個(gè)面部部分并提取眼睛,眉毛,鼻子,嘴巴和下巴的特征。
1. 效果圖
先上一張檢測完的圖:
也可以每一部分先標(biāo)識出來:
2. 原理
面部標(biāo)志主要是: 口 右眉 左眉 右眼 左眼 鼻子 下顎線
這一節(jié)即提取這些部分;
從圖中可以看到假設(shè)是以0為下標(biāo)的數(shù)組:
嘴唇可以認(rèn)為是: points [48, 68]. 內(nèi)嘴唇:[60,68]
右眉毛 points [17, 22].
左眉毛 points [22, 27].
右眼 [36, 42].
左眼 [42, 48].
鼻子 [27, 35].
下頜 [0, 17].
已經(jīng)知道下標(biāo),數(shù)組切片,并用不同的顏色來標(biāo)識各個(gè)部位,imutils包,可以幫助我們更優(yōu)雅的寫代碼的包;已經(jīng)有封裝好方法face_utils 。
嘴唇等是閉合區(qū)域,用閉合的凸包表示,下頜用線勾勒;
面部標(biāo)志檢測返回結(jié)果是:68個(gè)(x,y)坐標(biāo):
(1)先轉(zhuǎn)為適合OpenCV處理的 Numpy array,
(2)數(shù)組切片,用不同的顏色標(biāo)識不同的面部結(jié)構(gòu)部分;
3. 源碼
# 安裝了dlib # imutils 是最新的版本 # python detect_face_parts.py --shape-predictor shape_predictor_68_face_landmarks.dat --image images/girl.jpg from imutils import face_utils import numpy as np import argparse import imutils import dlib import cv2 import shutil import os # 構(gòu)建命令行參數(shù) # --shape-predictor 必須 形狀檢測器位置 # --image 必須 待檢測的圖片 ap = argparse.ArgumentParser() ap.add_argument("-p", "--shape-predictor", required=True, help="path to facial landmark predictor") ap.add_argument("-i", "--image", required=True, help="path to input image") args = vars(ap.parse_args()) temp_dir = "temp" shutil.rmtree(temp_dir, ignore_errors=True) os.makedirs(temp_dir) # 初始化dlib中基于HOG的面部檢測器,及形狀預(yù)測器 detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor(args["shape_predictor"]) # 加載待檢測的圖片,resize,并且裝換為灰度圖 image = cv2.imread(args["image"]) image = imutils.resize(image, width=500) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 在灰度圖中檢測面部 rects = detector(gray, 1) # 循環(huán)檢測到的面部 num = 0 for (i, rect) in enumerate(rects): # 確定面部區(qū)域進(jìn)行面部標(biāo)志檢測,并將其檢測到的68個(gè)點(diǎn)轉(zhuǎn)換為方便python處理的Numpy array shape = predictor(gray, rect) shape = face_utils.shape_to_np(shape) # 循環(huán)遍歷面部標(biāo)志獨(dú)立的每一部分 for (name, (i, j)) in face_utils.FACIAL_LANDMARKS_IDXS.items(): # 復(fù)制一張?jiān)紙D的拷貝,以便于繪制面部區(qū)域,及其名稱 clone = image.copy() cv2.putText(clone, name, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) # 遍歷獨(dú)立的面部標(biāo)志的每一部分包含的點(diǎn),并畫在圖中 for (x, y) in shape[i:j]: cv2.circle(clone, (x, y), 1, (0, 0, 255), -1) # 要實(shí)際提取每個(gè)面部區(qū)域,我們只需要計(jì)算與特定區(qū)域關(guān)聯(lián)的(x,y)坐標(biāo)的邊界框,并使用NumPy數(shù)組切片來提取它: (x, y, w, h) = cv2.boundingRect(np.array([shape[i:j]])) roi = image[y:y + h, x:x + w] # resize ROI區(qū)域?yàn)?寬度250,以便于更好的可視化 roi = imutils.resize(roi, width=250, inter=cv2.INTER_CUBIC) # 展示獨(dú)立的面部標(biāo)志 cv2.imshow("ROI", roi) cv2.imshow("Image", clone) cv2.waitKey(0) num = num + 1 p = os.path.sep.join([temp_dir, "{}.jpg".format( str(num).zfill(8))]) print('p: ', p) cv2.imwrite(p, output) # 應(yīng)用visualize_facial_landmarks 功能為每個(gè)面部部位創(chuàng)建透明的覆蓋層。(transparent overlay) output = face_utils.visualize_facial_landmarks(image, shape) cv2.imshow("Image", output) cv2.waitKey(0)
參考
https://www.pyimagesearch.com/2017/04/10/detect-eyes-nose-lips-jaw-dlib-opencv-python/
到此這篇關(guān)于超詳細(xì)注釋之OpenCV dlib實(shí)現(xiàn)人臉采集的文章就介紹到這了,更多相關(guān)OpenCV 人臉采集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python rabbitMQ如何實(shí)現(xiàn)生產(chǎn)消費(fèi)者模式
這篇文章主要介紹了Python rabbitMQ如何實(shí)現(xiàn)生產(chǎn)消費(fèi)者模式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Python遠(yuǎn)程控制Windows服務(wù)器的方法總結(jié)
在信息時(shí)代的洪流中,掌握一門編程語言已經(jīng)成為一項(xiàng)必備技能,Python,這門以簡潔、易學(xué)、強(qiáng)大著稱的編程語言,更是成為無數(shù)開發(fā)者的大寶劍,今天,我們要探討的就是如何用 Python 遠(yuǎn)程控制 Windows 服務(wù)器,需要的朋友可以參考下2024-07-07python利用后綴表達(dá)式實(shí)現(xiàn)計(jì)算器功能
這篇文章主要為大家詳細(xì)介紹了python利用后綴表達(dá)式實(shí)現(xiàn)計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-02-02python-itchat 統(tǒng)計(jì)微信群、好友數(shù)量,及原始消息數(shù)據(jù)的實(shí)例
今天小編就為大家分享一篇python-itchat 統(tǒng)計(jì)微信群、好友數(shù)量,及原始消息數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02python用pdfplumber提取pdf表格數(shù)據(jù)并保存到excel文件中
在實(shí)際研究中我們經(jīng)常需要獲取大量數(shù)據(jù),而這些數(shù)據(jù)很大一部分以pdf表格的形式呈現(xiàn),如公司年報(bào)、發(fā)行上市公告等,下面這篇文章主要給大家介紹了關(guān)于利用python提取pdf表格數(shù)據(jù)并保存到excel文件中的相關(guān)資料,需要的朋友可以參考下2022-07-07Python實(shí)現(xiàn)基本Socket服務(wù)端與客戶端通信的完整代碼
這篇文章主要介紹了Python實(shí)現(xiàn)基本Socket服務(wù)端與客戶端通信,分步詳解與完整代碼都有,按需所求即可,對Python Socket服務(wù)端與客戶端通信相關(guān)知識感興趣的朋友一起看看吧2023-06-06sublime3之內(nèi)網(wǎng)安裝python插件Anaconda的流程
這篇文章主要介紹了sublime3之內(nèi)網(wǎng)安裝python插件Anaconda的流程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11Python進(jìn)程Multiprocessing模塊原理解析
這篇文章主要介紹了Python進(jìn)程Multiprocessing模塊原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02python Tcp協(xié)議發(fā)送和接收信息的例子
今天小編就為大家分享一篇python Tcp協(xié)議發(fā)送和接收信息的例子,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07