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.
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.
ici
Est en cours de traitement.
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()
――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 :)
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é: