[PYTHON] Je veux vérifier la position de mon visage avec OpenCV!

introduction

Lors de l'exécution d'un programme qui génère ce que vous entrez, comme un jeu "J'aimerais pouvoir reconnaître le visage et l'opérer?" J'y pensais. J'ai donc créé un programme qui utilise OpenCV pour réagir à la position du visage et trouver le point central du visage à partir de là. Cependant, même si je pense que oui, cela n'a pas de sens si je ne peux pas le détecter correctement avec des images fixes avant le programme qui traite la vidéo, j'ai donc créé un programme qui peut traiter la photo et ensuite rendu possible de la gérer avec la vidéo.

Présentation de la création

Spécifiez la position de la face à l'aide d'OpenCV

Environnement de développement

MacBookPro 2019 Mémoire Core i5 2,4 GHz 16 Go OS:macOS Mojave10.14.6 Python(anaconda)

Contenu

Il capture un visage à l'aide de la bibliothèque OpenCV et génère les points de coordonnées de la photo.

Lire l'image

Pour le moment, j'ai créé quelque chose qui spécifie un visage sans y penser en utilisant une bibliothèque qui existe déjà.

Face_photo.ipynb


import cv2
import matplotlib.pyplot as plt

image_name = input("File Name?")

src=cv2.imread(image_name)
image_gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #Échelle de gris
color=(0,0,255) #Mec Kakomu(rouge)
color_c=(255,0,0) #Celui qui frappe(point,Bleu)
cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml") #Importation des données d'entraînement

#Trouver un visage
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(50,50))

if len(facerect) > 0:
    for rect in facerect:
        cv2.rectangle(src,tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]),color,thickness = 2) #Ligne entourant le visage
        cv2.circle(src,tuple(rect[0:2]+rect[2:4]//2),5,color_c,thickness=-10) #Point au centre
        print(rect[0:2]+rect[2:4]//2)#Sortie du point central

cv2.imwrite(image_name+"_result.jpg ",src)#Celui à sauver

Cela vous permet de tracer des points sur votre visage. En conséquence, cela ressemble à ceci. baby0FTHG7355_TP_V.jpg (Photo originale) baby0FTHG7355_TP_V.jpg_result.jpg (Résultat de sortie)

Je pense que j'ai pu le capturer d'une bonne manière.

problème

Cependant, il y avait les problèmes suivants avec cette méthode. EJ0zkEnUwAACV5f.jpeg Si vous regardez le trou dans le nez et regardez le bas du nez comme le nez, c'est un visage (Kippari)

Je ne peux rien dire, donc je dois aussi résoudre ce problème.

Jugez le plus grand visage

Alors, cette fois, réfléchissons-y avec le corps que nous devrions reconnaître une personne. La raison en est que le but ultime est d'opérer avec le visage, il n'est donc pas nécessaire d'assumer beaucoup de gens. Alors, reconnaissons seulement le grand visage.

Face_Photo.ipynb


import cv2
import matplotlib.pyplot as plt

image_name = input("File Name?")

# image_name = "27708.jpg " #Capturez des photos

src=cv2.imread(image_name)
image_gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #Échelle de gris
color=(0,0,255) #Mec Kakomu(rouge)
color_c=(255,0,0) #Celui qui frappe(point,Bleu)

big_face=(0,0,0,0)

cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml") #Importation des données d'entraînement

#Un sort à gérer
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(50,50))

if len(facerect) > 0:
    for rect in facerect:
        print(rect)
        if(big_face[2]<rect[2]):
            big_face= rect

cv2.rectangle(src,tuple(big_face[0:2]),tuple(big_face[0:2]+big_face[2:4]),color,thickness = 2) #Ligne entourant le visage
cv2.circle(src,tuple(big_face[0:2]+big_face[2:4]//2),5,color_c,thickness=-10) #Point au centre
print("résultat:%d" + (big_face[0:2]+big_face[2:4]//2))#Sortie du point central

cv2.imwrite(image_name+"_result.jpg ",src)#Celui à sauver

J'ai décidé de sauver le plus gros visage dans quelque chose appelé big_face. Cela ressemble à un mauvais mot, mais ce n'est pas le cas. Bien sûr, c'est maintenant un bon moyen de sauver votre plus gros visage.

Reconnaître avec la vidéo

À ce stade, c'est la phase finale. Je l'ai fait fonctionner avec la vidéo.

Face_Video.ipynb


import cv2
import matplotlib.pyplot as plt

# image_name = input("File Name?")

# image_name = "27708.jpg " #Capturez des photos

cap=cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH,640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,480)

while True:
    ret,src=cap.read()

    if not ret:
        print("Couldn't detect camera.")
        break

    key=cv2.waitKey(1)&0xff
    if key==ord("q"):
        print("Given a exit command.")
        break
        
    image_gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #Échelle de gris
    color=(0,0,255) #Mec Kakomu(rouge)
    color_c=(255,0,0) #Celui qui frappe(point,Bleu)

    big_face=(0,0,0,0)

    cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml") #Importation des données d'entraînement

    #Un sort à gérer
    facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(50,50))

    if len(facerect) > 0:
        for rect in facerect:
            if(big_face[2]<rect[2]):
                big_face= rect

        cv2.rectangle(src,tuple(big_face[0:2]),tuple(big_face[0:2]+big_face[2:4]),color,thickness = 2) #Ligne entourant le visage
        cv2.circle(src,tuple(big_face[0:2]+big_face[2:4]//2),5,color_c,thickness=-10) #Point au centre
        print(big_face[0:2]+big_face[2:4]//2)#Sortie du point central

    cv2.imshow("result",src)
    cv2.waitKey(1)
    
cv2.destroyAllWindows()
cap.release()

Si vous pouvez le faire jusqu'à présent, cela ressemblera à celui ci-dessous. 名称未設定-1.gif Maintenant, cela fonctionne correctement. De plus, la position du nez lui-même ici peut également être sortie sous forme de valeur numérique, donc si vous l'utilisez, vous pourrez opérer à la position du visage. Au fait, j'ai mis que ça se termine quand j'appuie sur q, mais ça n'a pas répondu avec Jupyter. chagrin.

problème

Cependant, il y a un problème avec cette méthode et elle ne répond pas s'il s'agit d'un profil. Cela ne veut pas dire que le profil est le Shinkansen, mais il y a un problème qu'il ne répond pas car ce sont les données apprises en utilisant la face avant en premier lieu. Donc, si vous avez une caméra et un écran complètement devant vous et que vous les utilisez dans un jeu, je pense que vous pouvez en tirer pleinement parti.

C'est tout pour la capture de visage avec OpenCV.

Supplément

Pour toutes les images utilisées cette fois, j'ai utilisé les images de Pakutaso.

Recommended Posts

Je veux vérifier la position de mon visage avec OpenCV!
Je veux exprimer mes sentiments avec les paroles de Mr. Children
Je veux détecter des objets avec OpenCV
Je veux sortir le début du mois prochain avec Python
Je souhaite personnaliser l'apparence de zabbix
Je souhaite arrêter la suppression automatique de la zone tmp dans RHEL7
Je veux grep le résultat de l'exécution de strace
Je veux hériter de l'arrière avec la classe de données python
Je veux bien comprendre les bases de Bokeh
Je veux recadrer l'image le long du contour au lieu du rectangle [python OpenCV]
Je souhaite augmenter la sécurité de la connexion SSH
Je veux tracer les informations de localisation de GTFS Realtime sur Jupyter! (Avec ballon)
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
Je souhaite spécifier une autre version de Python avec pyvenv
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
Je souhaite utiliser uniquement le traitement de normalisation SudachiPy
Je veux obtenir des informations sur le fonctionnement de Yahoo Route
J'ai fait une fonction pour vérifier le modèle de DCGAN
Je veux changer le drapeau japonais en drapeau des Palaos avec Numpy
Je veux colorier des photos en noir et blanc de souvenirs avec GAN
[Python] Je souhaite utiliser l'option -h avec argparse
Je veux déterminer l'authenticité d'un élément du tableau numpy
Je veux connaître la nature de Python et pip
Keras Je veux obtenir la sortie de n'importe quelle couche !!
Je veux connaître la légende du monde des technologies informatiques
Je veux déboguer avec Python
J'ai essayé la reconnaissance faciale avec OpenCV
J'ai essayé de visualiser la consommation électrique de ma maison avec Nature Remo E lite
Je veux obtenir le nom de la fonction / méthode en cours d'exécution
[Pytorch] Je souhaite attribuer manuellement les paramètres d'entraînement du modèle
Je veux connaître la météo avec LINE bot avec Heroku + Python
Familiarisez-vous avec (voulez être) autour du pipeline de spaCy
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
[Introduction à StyleGAN] J'ai joué avec "The Life of a Man" ♬
J'ai essayé de traiter l'image en "style croquis" avec OpenCV
Développement LINEbot, je souhaite vérifier le fonctionnement dans l'environnement local
J'ai essayé de traiter l'image dans un "style de dessin au crayon" avec OpenCV
J'ai essayé d'agrandir la taille du volume logique avec LVM
Pour le moment, je veux convertir n'importe quel fichier avec ffmpeg !!
J'ai utilisé la commande coupe du monde pour vérifier le résultat de la Coupe du monde.
Je veux connaître la population de chaque pays du monde.
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
Je veux épingler Spyder à la barre des tâches
Je veux sortir froidement sur la console
J'ai vérifié les options de copyMakeBorder d'OpenCV
Comment vérifier la version de Django
Je veux gérer la rime part1
Je souhaite extraire une URL arbitraire de la chaîne de caractères de la source html avec python
Je veux écrire un blog avec Jupyter Notebook
Vérifier l'existence du fichier avec python
Je veux gérer la rime part3
Je veux installer Python avec PythonAnywhere
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
Je veux afficher la barre de progression
[Twitter] Je veux faire des tweets téléchargés (de mon compte) dans un beau CSV
Je veux gérer la rime part2
Je veux gérer la rime part5
Je veux gérer la rime part4
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons