佳木斯湛栽影视文化发展公司

主頁 > 知識(shí)庫 > 超詳細(xì)注釋之OpenCV dlib實(shí)現(xiàn)人臉采集

超詳細(xì)注釋之OpenCV dlib實(shí)現(xiàn)人臉采集

熱門標(biāo)簽:銀行業(yè)務(wù) 呼叫中心市場需求 美圖手機(jī) 網(wǎng)站文章發(fā)布 鐵路電話系統(tǒng) 檢查注冊(cè)表項(xiàng) 智能手機(jī) 服務(wù)器配置

上一篇博客中,我們了解了什么是面部標(biāo)志,以及如何使用dlib,OpenCV和Python檢測(cè)它們。利用dlib的HOG SVM的形狀預(yù)測(cè)器獲得面部ROI中面部區(qū)域的68個(gè)點(diǎn)(x,y)坐標(biāo)。
這一篇博客中,將演示如何使用NumPy數(shù)組切片魔術(shù)來分別訪問每個(gè)面部部分并提取眼睛,眉毛,鼻子,嘴巴和下巴的特征。

1. 效果圖

先上一張檢測(cè)完的圖:

也可以每一部分先標(biāo)識(shí)出來:

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)識(shí)各個(gè)部位,imutils包,可以幫助我們更優(yōu)雅的寫代碼的包;已經(jīng)有封裝好方法face_utils 。
嘴唇等是閉合區(qū)域,用閉合的凸包表示,下頜用線勾勒;

面部標(biāo)志檢測(cè)返回結(jié)果是:68個(gè)(x,y)坐標(biāo):
(1)先轉(zhuǎn)為適合OpenCV處理的 Numpy array,
(2)數(shù)組切片,用不同的顏色標(biāo)識(shí)不同的面部結(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 必須 形狀檢測(cè)器位置
# --image 必須 待檢測(cè)的圖片
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的面部檢測(cè)器,及形狀預(yù)測(cè)器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(args["shape_predictor"])

# 加載待檢測(cè)的圖片,resize,并且裝換為灰度圖
image = cv2.imread(args["image"])
image = imutils.resize(image, width=500)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 在灰度圖中檢測(cè)面部
rects = detector(gray, 1)

# 循環(huán)檢測(cè)到的面部
num = 0
for (i, rect) in enumerate(rects):
    # 確定面部區(qū)域進(jìn)行面部標(biāo)志檢測(cè),并將其檢測(cè)到的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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 超詳細(xì)注釋之OpenCV實(shí)現(xiàn)視頻實(shí)時(shí)人臉模糊和人臉馬賽克
  • 手把手教你利用opencv實(shí)現(xiàn)人臉識(shí)別功能(附源碼+文檔)
  • opencv基于Haar人臉檢測(cè)和眼睛檢測(cè)
  • OpenCV-Python實(shí)現(xiàn)人臉磨皮算法
  • 基于Opencv制作的美顏相機(jī)帶你領(lǐng)略美顏特效的效果

標(biāo)簽:沈陽 滄州 河南 長治 樂山 新疆 紅河 上海

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《超詳細(xì)注釋之OpenCV dlib實(shí)現(xiàn)人臉采集》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    乐业县| 兴安县| 凤翔县| 斗六市| 太湖县| 邛崃市| 根河市| 孟津县| 古田县| 武强县| 乐都县| 灌阳县| 修水县| 三门峡市| 平果县| 曲周县| 栾川县| 内黄县| 静安区| 舞钢市| 田阳县| 桃园市| 保山市| 静乐县| 乌海市| 农安县| 太湖县| 光山县| 焦作市| 绥棱县| 通榆县| 大安市| 阿巴嘎旗| 金川县| 德兴市| 辉南县| 腾冲县| 儋州市| 安远县| 沭阳县| 芦山县|