Cette fois, je voudrais extraire la forme de la tête en utilisant Dlib, OpenCV ou afficher l'ellipse comme modèle.
environnement ・ Python 3.7.5 ・ Opencv 4.1.2 ・ Dlib 19.18.0
Je me réfère aux sites suivants. →https://cppx.hatenablog.com/entry/2017/12/25/231121 J'ai téléchargé le modèle formé à partir du site suivant pour acquérir les organes du visage. http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2
Les programmes qui ont été réalisés jusqu'à présent sont les suivants.
head.py
import dlib
import cv2
detector = dlib.get_frontal_face_detector()#Détecteur de visage
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
#↑ Prédicteur(Spécification du chemin du modèle entraîné)
def get_center(gray_img):#Trouvez le centre de gravité de l'image ↓ opencv le fera pour vous
moments = cv2.moments(gray_img, False)
try:
return int(moments['m10'] / moments['m00']), int(moments['m01'] / moments['m00'])
except:
return None
#Parfois, 0 division se produit, nous la traitons donc ↑
#Les coordonnées obtenues avec ceci seront la position de l'élève ↑
def is_close(y0, y1):#Tes yeux sont fermés
if abs(y0 - y1) < 10:#Les arguments sont la coordonnée y de la paupière supérieure et la coordonnée y de la paupière inférieure.
return True #Distinguer par la différence entre les coordonnées y des paupières supérieures et inférieures
return False
def head_point(img,parts):
heads = [
parts[1],part[16],
]
#Obtenir les coordonnées des élèves
def eye_point(img, parts, left=True):
#Image du visage et coordonnées des organes du visage, œil gauche ou œil droit(Véritable œil gauche)
#Obtenez les coordonnées de la pièce maîtresse ↓
if left:
eyes = [
parts[36],
min(parts[37], parts[38], key=lambda x: x.y),
max(parts[40], parts[41], key=lambda x: x.y),
parts[39],
]
#Puisqu'il est du 36e au 39e, extrayez ces 4 points
else:
eyes = [
parts[42],
min(parts[43], parts[44], key=lambda x: x.y),
max(parts[46], parts[47], key=lambda x: x.y),
parts[45],
]
#Au bord de l'œil (36, 39), celui au-dessus de la paupière supérieure(37 or 38)
#Celui sous la paupière inférieure(40 or 41)
#Obtenez les coordonnées afin que le globe oculaire entier soit inclus lorsqu'il est entouré d'un carré
#Œil droit aux coordonnées de l'œil gauche+Obtenez 6 ↑
org_x = eyes[0].x
org_y = eyes[1].y
#↑ Sauvegardez les coordonnées pour aligner l'origine avec le globe oculaire
hrg_x = heads[0].x
if is_close(org_y, eyes[2].y):#Si vos yeux sont fermés, vous ne pouvez pas détecter vos yeux
return None
#Découvrez si vos yeux sont fermés
#↓ Coupez les globes oculaires et binarisez-les ↓
eye = img[org_y:eyes[2].y, org_x:eyes[-1].x]#garniture
_, eye = cv2.threshold(cv2.cvtColor(eye, cv2.COLOR_RGB2GRAY), 30, 255, cv2.THRESH_BINARY_INV)
#Binarisation
center = get_center(eye)#Recherche du centre de gravité
if center:
return center[0] + org_x, center[1] + org_y
return center
def p(img, parts, eye):#Les arguments sont l'image du visage, les coordonnées des organes du visage et les coordonnées de la pupille.(Gauche droite)
if eye[0]:#Les coordonnées de la pupille sont affichées sous forme de points verts et les coordonnées des organes du visage sont affichées sous forme de points bleus sur l'image du visage.
cv2.circle(img, eye[0], 3, (255, 255, 0), -1)
if eye[1]:
cv2.circle(img, eye[1], 3, (255, 255, 0), -1)
for i in parts:
cv2.circle(img, (i.x, i.y), 3, (255, 0, 0), -1)
cv2.imshow("face", img)
#Obtenir la vidéo de la caméra
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
#Ajouter le traitement ici---
#Par exemple, si vous souhaitez obtenir les coordonnées supérieures du nez
#parts[33].x
#parts[33].y
#↓ Obtenez les coordonnées des organes du visage
dets = detector(frame[:, :, ::-1])
if len(dets) > 0:
parts = predictor(frame, dets[0]).parts()
left_eye = eye_point(frame, parts)#En plus des organes du visage des yeux, les yeux sont également affichés
right_eye = eye_point(frame, parts, False)
p(frame, parts, (left_eye,right_eye))#frame*À 0*Si vous ne le faites pas 0
#Les points sont affichés en superposition sur l'image du visage d'origine
#
if cv2.waitKey(1) == 27:
break
#Relâchez la capture et fermez toutes les fenêtres
#Jusque là----
cap.release()
cv2.destroyAllWindows()
#Si vous n'avez pas d'appareil photo
#frame = cv2.imread("Chemin de l'image")
#cv2.imshow("me", frame) #Pour confirmation
#Ajouter le traitement ici---
#Jusque là----
#cv2.waitKey(0)
#cv2.destroyAllWindows()
Je voudrais ajouter plus à ce programme pour faire un modèle de la tête. J'aimerais pouvoir l'extraire, mais j'aimerais faire un modèle elliptique (modèle de tête) qui se connecte aux 68 repères 1 et 17 de l'image ci-dessous. J'ai fait beaucoup de recherches, mais cela n'a pas fonctionné, donc si quelqu'un peut le comprendre, faites-le moi savoir. J'ai hâte de travailler avec vous.
Recommended Posts