本篇內容主要講解“如何利用OpenCV dlib實現人臉采集”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何利用OpenCV dlib實現人臉采集”吧!
先上一張檢測完的圖:
也可以每一部分先標識出來:
面部標志主要是: 口 右眉 左眉 右眼 左眼 鼻子 下顎線
這一節即提取這些部分;
從圖中可以看到假設是以0為下標的數組:
嘴唇可以認為是: points [48, 68]. 內嘴唇:[60,68]
右眉毛 points [17, 22].
左眉毛 points [22, 27].
右眼 [36, 42].
左眼 [42, 48].
鼻子 [27, 35].
下頜 [0, 17].
已經知道下標,數組切片,并用不同的顏色來標識各個部位,imutils包,可以幫助我們更優雅的寫代碼的包;已經有封裝好方法face_utils 。
嘴唇等是閉合區域,用閉合的凸包表示,下頜用線勾勒;
面部標志檢測返回結果是:68個(x,y)坐標:
(1)先轉為適合OpenCV處理的 Numpy array,
(2)數組切片,用不同的顏色標識不同的面部結構部分;
# 安裝了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 # 構建命令行參數 # --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的面部檢測器,及形狀預測器 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) # 循環檢測到的面部 num = 0 for (i, rect) in enumerate(rects): # 確定面部區域進行面部標志檢測,并將其檢測到的68個點轉換為方便python處理的Numpy array shape = predictor(gray, rect) shape = face_utils.shape_to_np(shape) # 循環遍歷面部標志獨立的每一部分 for (name, (i, j)) in face_utils.FACIAL_LANDMARKS_IDXS.items(): # 復制一張原始圖的拷貝,以便于繪制面部區域,及其名稱 clone = image.copy() cv2.putText(clone, name, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) # 遍歷獨立的面部標志的每一部分包含的點,并畫在圖中 for (x, y) in shape[i:j]: cv2.circle(clone, (x, y), 1, (0, 0, 255), -1) # 要實際提取每個面部區域,我們只需要計算與特定區域關聯的(x,y)坐標的邊界框,并使用NumPy數組切片來提取它: (x, y, w, h) = cv2.boundingRect(np.array([shape[i:j]])) roi = image[y:y + h, x:x + w] # resize ROI區域為 寬度250,以便于更好的可視化 roi = imutils.resize(roi, width=250, inter=cv2.INTER_CUBIC) # 展示獨立的面部標志 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) # 應用visualize_facial_landmarks 功能為每個面部部位創建透明的覆蓋層。(transparent overlay) output = face_utils.visualize_facial_landmarks(image, shape) cv2.imshow("Image", output) cv2.waitKey(0)
到此,相信大家對“如何利用OpenCV dlib實現人臉采集”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。