Obtenez et estimez la forme de la tête en utilisant Dlib et OpenCV avec python

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. images.jpeg

Recommended Posts

Obtenez et estimez la forme de la tête en utilisant Dlib et OpenCV avec python
Estimation de l'orientation de la tête avec Python et OpenCV + dlib
Estimer la posture du marqueur AR avec Python + OpenCV + drone
Lisez l'image du graphique avec OpenCV et obtenez les coordonnées du point final du graphique
Obtenez des visites d'articles et des likes avec l'API Qiita + Python
Obtenez le cours de l'action d'une entreprise japonaise avec Python et faites un graphique
Essayez de projeter la conversion d'image en utilisant OpenCV avec Python
Visualisez la gamme d'insertions internes et externes avec python
Obtenez l'état de fonctionnement de JR West avec Python
[Python] Utilisation d'OpenCV avec Python (basique)
Utiliser OpenCV avec Python @Mac
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
Débarrassez-vous des données sales avec Python et les expressions régulières
Exemple d'analyse HTTP GET et JSON avec Pepper Python
Jouez avec le mécanisme de mot de passe de GitHub Webhook et Python
Récupérez la source de la page à charger indéfiniment avec python.
Construction d'environnement de python et opencv
Briller la vie avec Python et OpenCV
L'histoire de Python et l'histoire de NaN
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
Réseau neuronal avec OpenCV 3 et Python 3
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
[Python] Utilisation d'OpenCV avec Python (détection des bords)
Obtenez la météo avec les requêtes Python
Obtenez la météo avec les requêtes Python 2
Coexistence de Python2 et 3 avec CircleCI (1.0)
Etude de base d'OpenCV avec Python
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
Remarque: obtenez les premier et dernier éléments de Python OrderedDict de manière non destructive
L'extraction de couleur avec Python + OpenCV a résolu le mystère du fond vert
Comment obtenir des abonnés et des abonnés de Python à l'aide de l'API Mastodon
[Python] Comment obtenir le premier et le dernier jour du mois
Alignement d'images numérisées de papier vidéo animé à l'aide d'OpenCV et de Python
Obtenez le titre et la date de livraison de Yahoo! News en Python
Le moyen le plus rapide d'obtenir régulièrement des images de caméra avec opencv de python
PhytoMine-I a essayé d'obtenir les informations génétiques de la plante avec Python
Utilisation de Python et MeCab avec Azure Databricks
Vérifier l'existence du fichier avec python
Essayez d'utiliser l'appareil photo avec OpenCV de Python
Capturer des images avec Pupil, python et OpenCV
Travailler avec OpenStack à l'aide du SDK Python
Introduction facile de la série python3 et d'OpenCV3
J'utilise tox et Python 3.3 avec Travis-CI
J'ai remplacé le calcul numérique de Python par Rust et comparé la vitesse
Calculer l'itinéraire le plus court d'un graphe avec la méthode Dyxtra et Python
Comment couper la partie inférieure droite de l'image avec Python OpenCV
Obtenez des images d'OpenStreetMap et de la carte de l'Institut géographique avec Python + py-staticmaps
Comment obtenir la différence de date et d'heure en secondes avec Python
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
Obtenez et convertissez l'heure actuelle dans le fuseau horaire local du système avec python
Retrouvez les termes généraux de la séquence de Tribonacci en algèbre linéaire et Python
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
Obtenez la valeur de retour d'un script shell externe (ls) avec python3
J'ai mesuré la vitesse de la notation d'inclusion de liste, pendant et pendant avec python2.7.
Essayez de séparer l'arrière-plan et l'objet en mouvement de la vidéo avec OpenCV
Reconnaître le contour et la direction d'un objet façonné avec OpenCV3 et Python3 (analyse des composants principaux: PCA, vecteur propre)
J'ai essayé d'obtenir et d'analyser les données statistiques de la nouvelle Corona avec Python: données de l'Université John's Hopkins
Hello World et détection de visage avec OpenCV 4.3 + Python
J'ai essayé de "lisser" l'image avec Python + OpenCV
Récupérer le contenu de git diff depuis python