detectクラスの改造

  • 検出をOpenCVではなくdlibでやってみる

Detector.py

import cv2
import dlib
import numpy as np
import imutils
from imutils import face_utils

#顔と口を検出するクラス
#引数:detector 顔判別器  predictor 口などを検出するときに使うやつ
#detect()は画像のパスを入力すると顔検出と口検出をしてくれる.
#flag = 1 だと画像に検出結果を描画して表示する. flag = 0 なら描画しない
#出力は検出された顔と口の矩形領域
#形式 face = [[左上のx座標, y座標, 右下のx座標,y座標]...[]]
#     mouth = [[x,y]...] (1つの口につき20点ずつ)
class Detector():
    def __init__(self,detector,predictor):
        self.detector = detector
        self.predictor = predictor
        
        
    def detect(self,img_path, plot_flag):
        img = cv2.imread(img_path)
        img = imutils.resize(img, width=500)
        img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        mouth=[]
        face = []
        temp = []
        # frontal_face_detectorクラスは矩形, スコア, サブ検出器の結果を返す
        dets, scores, idx = self.detector.run(img_rgb, 1)
        if len(dets) > 0:
            clone = img.copy()
            for det in dets:
                if plot_flag == 1:
                    cv2.rectangle(clone, (det.left(), det.top()), (det.right(), det.bottom()), (0, 0, 255))
                buf = [det.left(),det.top(),det.right(),det.bottom()]
                face.append(buf)
            j = 0
            #口検出
            for i, rect in enumerate(dets):
                shape = self.predictor(img_rgb, rect)
                shape = face_utils.shape_to_np(shape)
                #口検出結果の処理
                for (x, y) in shape[48:68]:
                    if plot_flag == 1 :                      
                        cv2.circle(clone, (x, y), 1, (0, 0, 255), -1)
                        temp.append([x,y])
                mouth.append(temp[j*20 : (j+1)*20])
                j+=1
            if plot_flag == 1 :
                cv2.imshow('img', clone)
                c = cv2.waitKey(0)
            return face ,mouth 
            
        else :
            return None,None
            

test.py

from Detector import Detector
import cv2
import dlib
import numpy as np
import imutils
from imutils import face_utils


img = "image/frame_098.jpg"
predictor_path = "./shape_predictor_68_face_landmarks.dat"
predictor = dlib.shape_predictor(predictor_path)
detector = dlib.get_frontal_face_detector()
det = Detector(detector,predictor)
face, mouth = det.detect(img,1)

結果

out.jpg

seminar-personal/fukumoto2017


添付ファイル: fileout.jpg 179件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-01-22 (水) 23:51:58