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.
Spécifiez la position de la face à l'aide d'OpenCV
MacBookPro 2019 Mémoire Core i5 2,4 GHz 16 Go OS:macOS Mojave10.14.6 Python(anaconda)
Il capture un visage à l'aide de la bibliothèque OpenCV et génère les points de coordonnées de la photo.
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. (Photo originale) (Résultat de sortie)
Je pense que j'ai pu le capturer d'une bonne manière.
Cependant, il y avait les problèmes suivants avec cette méthode. 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.
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.
À 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. 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.
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.
Pour toutes les images utilisées cette fois, j'ai utilisé les images de Pakutaso.
Recommended Posts