J'ai essayé de reconnaître le visage de la vidéo (OpenCV: version python)

Déclencheur

Comment ne sauvegarder qu'une partie d'une longue vidéo en utilisant OpenCV Comment prendre une image capturée à partir d'une vidéo (OpenCV) J'ai utilisé OpenCV de la vidéo de candidature pour préparer l'environnement qui semble nécessaire au traitement de l'image. À partir de là, traitons à l'aide de fonctions et de bibliothèques. Le premier est la reconnaissance faciale.

Préparation

Puisqu'il est développé sur Mac, installez-le depuis Homebrew.

brew install opencv

Par conséquent, sous / usr / local / Cellar / opencv / 4.1.1_2 / share / opencv4 / haarcascades /, il y a une partie appelée cascade (distributeur) qui est nécessaire pour reconnaître le visage et tout le corps. Les types sont décrits dans [Reconnaissance faciale à l'aide d'OpenCV (classificateur d'entités de type Haar)](https://qiita.com/hitomatagi/items/04b1b26c1bc2e8081427#haar-like feature classifier).

ici,

--haarcascade_frontalface_alt_tree.xml face avant --haarcascade_eye.xml Les deux yeux --haarcascade_righteye_2splits.xml œil droit --haarcascade_lefteye_2splits.xml Œil gauche

J'essaierai d'utiliser.

Flux de processus

ici

  1. Le visage est dans le cadre
  2. Découpez l'image qui sera le ROI (région d'intérêt) de 1. Divisé en zone droite et zone gauche respectivement (méthode Baron Ashura).
  3. Déterminez si les yeux droit et gauche sont affichés dans l'image en 2. 4.3 Si les conditions de 3 sont remplies, entourer le visage, l'œil droit et l'œil gauche d'un carré

Est en cours de traitement.

développement de

Développé sur la base du flux de traitement ci-dessus.

Version jugée en divisant l'œil droit et l'œil gauche


import cv2
import os
import time

if __name__ == '__main__':

	cap = cv2.VideoCapture('one_minutes.mp4')

	cap_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
	cap_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
	fps = cap.get(cv2.CAP_PROP_FPS)

	fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
	writer = cv2.VideoWriter('detect_face.mp4',fourcc, fps, (cap_width, cap_height))

	cascade_base_path = "/usr/local/Cellar/opencv/4.1.1_2/share/opencv4/haarcascades/"
    #Préparez-vous en cascade
	face_cascade = cv2.CascadeClassifier(os.path.join(cascade_base_path, 'haarcascade_frontalface_alt_tree.xml'))
	right_eye_cascade = cv2.CascadeClassifier(os.path.join(cascade_base_path, 'haarcascade_righteye_2splits.xml'))
	left_eye_cascade = cv2.CascadeClassifier(os.path.join(cascade_base_path, 'haarcascade_lefteye_2splits.xml'))

	start = time.time()

	try :
		while True:

			if not cap.isOpened():
				break

			ret, frame = cap.read()

			img_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            # 1.Le visage est dans le cadre
			face_points = face_cascade.detectMultiScale(img_gray)
			
			for (fx,fy,fw,fh) in face_points:
				
                #2. ROI(Region of Interest:Zone cible)Découpez l'image qui devient
                #Divisé en zone droite et zone gauche respectivement(Méthode Baron Ashura)
				width_center = fx + int(fw * 0.5)
				face_right_gray = img_gray[fy:fy+fh, fx:width_center]
				face_left_gray = img_gray[fy:fy+fh, width_center:fx+fw]
				#3.Déterminez si les yeux droit et gauche sont visibles
				right_eye_points = right_eye_cascade.detectMultiScale(face_right_gray)
				left_eye_points = left_eye_cascade.detectMultiScale(face_left_gray)

				if 0 < len(right_eye_points) and 0 < len(left_eye_points):
					(rx,ry,rw,rh) = right_eye_points[0]
					(lx,ly,lw,lh) = left_eye_points[0]
				        
                    #4.Entourez le visage, l'œil droit et l'œil gauche d'un carré
					#L'œil droit est orange
					cv2.rectangle(frame,(fx+rx,fy+ry),(fx+rx+rw,fy+ry+rh),(0,255,255),2)
					#L'œil gauche est rouge
					cv2.rectangle(frame,(width_center+lx,fy+ly),(width_center+lx+lw,fy+ly+lh),(0,0,255),2)
					#Tout le visage est vert
					cv2.rectangle(frame,(fx,fy),(fx+fw,fy+fh),(0,255,0),2)

			writer.write(frame)
	except cv2.error as e:
		print(e)

	print("temps de traitement{}Secondes".format(time.time() - start))
	writer.release()
	cap.release()

A titre de comparaison, je vais également donner celui qui utilise les deux yeux haarcascade_eye.xml.

Version les deux yeux


import cv2
import os
import time

if __name__ == '__main__':

	cap = cv2.VideoCapture('one_minutes.mp4')

	cap_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
	cap_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
	fps = cap.get(cv2.CAP_PROP_FPS)

	fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
	writer = cv2.VideoWriter('detect_face_2.mp4',fourcc, fps, (cap_width, cap_height))

	cascade_base_path = "/usr/local/Cellar/opencv/4.1.1_2/share/opencv4/haarcascades/"

	face_cascade = cv2.CascadeClassifier(os.path.join(cascade_base_path, 'haarcascade_frontalface_alt_tree.xml'))
	eyes_cascade = cv2.CascadeClassifier(os.path.join(cascade_base_path, 'haarcascade_eye.xml'))

	start = time.time()

	try :
		while True:

			if not cap.isOpened():
				break

			ret, frame = cap.read()

			img_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
			face_points = face_cascade.detectMultiScale(img_gray)
			
			for (fx,fy,fw,fh) in face_points:
				
				face_gray = img_gray[fy:fy+fh, fx:fx+fw]				
				eyes_points = eyes_cascade.detectMultiScale(face_gray)
				
				if 0 < len(eyes_points):
					for (ex,ey,ew,eh) in eyes_points:
						#Les yeux sont orange
						cv2.rectangle(frame,(fx+ex,fy+ey),(fx+ex+ew,fy+ey+eh),(0,255,255),2)
						#Tout le visage est vert
						cv2.rectangle(frame,(fx,fy),(fx+fw,fy+fh),(0,255,0),2)

			writer.write(frame)
	except cv2.error as e:
		print(e)

	print("temps de traitement{}Secondes".format(time.time() - start))
	writer.release()
	cap.release()

résultat

face_main.gif

face_sub.gif

Ce que j'ai trouvé

――Il était plus précis de juger en séparant l'œil droit et l'œil gauche. Surtout quand j'ai vu la compétition, je l'ai reconnue plus que les deux yeux! C'est une reconnaissance des deux yeux, mais une méconnaissance autre que les yeux ――Même si votre visage est légèrement incliné, la précision diminuera fortement. Je n'ai pas cassé N ○ H: Fatigué_face: Il semble qu'il ne se reconnaisse pas sans une cascade qui entraîne des images inclinées et des images redimensionnées. Il peut être préférable d'utiliser le Deep Learning maintenant. Certes, je pense que la précision semble bonne car j'apprends après avoir dupliqué une donnée dans la bibliothèque en inclinant, redimensionnant, floutant, etc. Est-ce ...: fatigué: je n'ai pas l'énergie et la force physique: thermometer_face :)

en conclusion

Il y a quelques jours, Essayez la détection de visage en temps réel avec OpenCV a été publié et a été abandonné: scream: Il a fallu plus de temps pour mettre en place que pour développer: fatigué:

Lien référencé

Recommended Posts

J'ai essayé de reconnaître le visage de la vidéo (OpenCV: version python)
J'ai essayé d'afficher le temps de lecture de la vidéo (OpenCV: version Python)
J'ai essayé la reconnaissance faciale avec OpenCV
J'ai essayé de faire de la vidéo de diffusion Masami comme IPPON Grand Prix (OpenCV: version Python)
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé de "différencier" l'image avec Python + OpenCV
J'ai essayé de "binariser" l'image avec Python + OpenCV
J'ai essayé la reconnaissance faciale avec Face ++
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé d'utiliser la bibliothèque Python de Ruby avec PyCall
J'ai essayé la reconnaissance faciale du problème du rire en utilisant Keras.
Essayez la reconnaissance faciale avec python + OpenCV
Reconnaissance faciale avec caméra avec opencv3 + python2.7
J'ai essayé de changer le script python de 2.7.11 à 3.6.0 sur Windows10
J'ai essayé de couper une image fixe de la vidéo
J'ai essayé le rendu non réaliste avec Python + opencv
J'ai essayé d'utiliser l'API UnityCloudBuild de Python
[python, openCV] base64 Reconnaissance faciale dans les images
Python: j'ai essayé le problème du voyageur de commerce
J'ai essayé le framework de test Python Tornado
[Python] J'ai essayé de remplacer le nom de la fonction par le nom de la fonction
J'ai essayé d'accéder à l'API Qiita depuis le début
vprof - J'ai essayé d'utiliser le profileur pour Python
J'ai essayé la détection d'objets en utilisant Python et OpenCV
J'ai essayé de simuler "Birthday Paradox" avec Python
J'ai essayé la méthode des moindres carrés en Python
J'ai essayé Python! ] Diplômé aujourd'hui de "Tout le monde Python! Qu'est-ce que Python!"!
J'ai essayé la programmation python pour la première fois.
Essayez Progate Free Edition [Python I]
J'ai essayé d'utiliser le module Datetime de Python
J'ai essayé d'utiliser le filtre d'image d'OpenCV
[IBM Cloud] J'ai essayé d'accéder à la table Db2 on Cloud à partir de Cloud Funtions (python)
J'ai essayé d'exécuter deux PWM matériels Jetson Nano à partir de la bibliothèque Jetson.GPIO Python.
[Python] J'ai essayé d'obtenir le nom du type sous forme de chaîne de caractères à partir de la fonction type
[Python] J'ai essayé le même calcul que la prédiction de LSTM à partir de zéro [Keras]
J'ai essayé Python> autopep8
J'ai essayé Python> décorateur
J'ai essayé de représenter graphiquement les packages installés en Python
J'ai essayé Python sur Mac pour la première fois.
J'ai essayé pipenv et asdf pour le contrôle de version Python
J'ai essayé de détecter l'iris à partir de l'image de la caméra
[Python] Extrayez l'ID vidéo de l'URL de la vidéo YouTube [Remarque]
J'ai essayé de toucher un fichier CSV avec Python
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
J'ai essayé d'exécuter python à partir d'un fichier chauve-souris
J'ai essayé de résoudre Soma Cube avec python
J'ai essayé python pour la première fois avec heroku
Je voulais utiliser la bibliothèque Python de MATLAB
[Python] J'ai essayé de représenter graphiquement le top 10 des ombres à paupières
J'ai essayé de résoudre le problème avec Python Vol.1
Python Open CV a essayé d'afficher l'image sous forme de texte.
J'ai essayé la "conversion de morphologie" de l'image avec Python + OpenCV
J'ai essayé de frapper l'API avec le client python d'echonest
J'ai essayé de résumer les opérations de chaîne de Python
J'ai augmenté la version Python de 2 à 3, mais chaque fois que je redémarre le terminal ubuntu, la version reste 2.
(Python: OpenCV) J'ai essayé de générer une valeur indiquant la distance entre les régions tout en binarisant la vidéo en temps réel.
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python