Ceci est une continuation de la fois précédente (Partie 2 Création de photoshop d'images fixes). Appliquez la superposition d'image fixe précédente au visage de la vidéo. Je me suis référé au site suivant. [Series] "Programmation CV utilisant python et OpenCV" 9th: OpenCV-python② Entrée / sortie vidéo et rappel souris / clavier avec highGUI
Tout d'abord, entrons et sortons la vidéo. Chargez simplement la vidéo et sortez-la telle quelle. Ci-dessous le code
export_movie.py
#coding=utf-8
import cv2
def export_movie():
#Spécifiez la vidéo à entrer et le chemin de sortie.
target = "target/test_input.mp4"
result = "result/test_output.m4v"
#Charger des vidéos et obtenir des informations sur la vidéo
movie = cv2.VideoCapture(target)
fps = movie.get(cv2.CAP_PROP_FPS)
height = movie.get(cv2.CAP_PROP_FRAME_HEIGHT)
width = movie.get(cv2.CAP_PROP_FRAME_WIDTH)
#Spécifiez MP4V comme format
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
#Ouvrez le fichier de sortie
out = cv2.VideoWriter(result, int(fourcc), fps, (int(width), int(height)))
#Lire la première image
if movie.isOpened() == True:
ret,frame = movie.read()
else:
ret = False
#Continuer à exporter des cadres tout en lisant avec succès les cadres
while ret:
#Ecrire le cadre de lecture
out.write(frame)
#Chargez l'image suivante
ret,frame = movie.read()
if __name__ == '__main__':
export_movie()
Super facile
Bien que la capacité ait presque triplé, j'ai pu lire la vidéo de sortie. Il semble que le code de code doit être introduit correctement dans ce domaine. Il n'y a pas de son.
Depuis que j'ai réussi à entrer et sortir la vidéo, je vais enfin créer une vidéo Photoshop diverse. Cependant, il vous suffit d'effectuer la reconnaissance faciale et la superposition avant de sortir la vidéo. Les images lues à partir de fichiers vidéo peuvent être traitées de la même manière que les fichiers image. En outre, la fin de la fonction overlayOnPart a changé de sorte que l'image de retour n'inclut pas le canal alpha (transparence). Ci-dessous le code.
overlay_movie.py
#coding=utf-8
import cv2
import datetime
import numpy as np
from PIL import Image
def overlay_movie():
#Spécifiez la vidéo à entrer et le chemin de sortie.
target = "target/test_input.mp4"
result = "result/test_output.m4v" #.J'obtiens une erreur si je n'utilise pas m4v
#Charger des vidéos et obtenir des informations sur la vidéo
movie = cv2.VideoCapture(target)
fps = movie.get(cv2.CAP_PROP_FPS)
height = movie.get(cv2.CAP_PROP_FRAME_HEIGHT)
width = movie.get(cv2.CAP_PROP_FRAME_WIDTH)
#Spécifiez MP4V comme format
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
#Ouvrez le fichier de sortie
out = cv2.VideoWriter(result, int(fourcc), fps, (int(width), int(height)))
#Acquérir la quantité de caractéristiques du classificateur en cascade
cascade_path = "haarcascades/haarcascade_frontalface_alt.xml"
cascade = cv2.CascadeClassifier(cascade_path)
#Chargement de l'image de superposition
ol_imgae_path = "target/warai_otoko.png "
ol_image = cv2.imread(ol_imgae_path,cv2.IMREAD_UNCHANGED)
#Lire la première image
if movie.isOpened() == True:
ret,frame = movie.read()
else:
ret = False
#Continuer à exporter des cadres tout en lisant avec succès les cadres
while ret:
#Convertir en échelle de gris
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#Effectuer la reconnaissance faciale
facerecog = cascade.detectMultiScale(frame_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))
if len(facerecog) > 0:
#Ajouter une image au visage reconnu
for rect in facerecog:
#Redimensionner l'image pour l'adapter à la plage de reconnaissance
resized_ol_image = resize_image(ol_image, rect[2], rect[3])
#Créer une image de superposition
frame = overlayOnPart(frame, resized_ol_image, rect[0],rect[1])
#Ecrire le cadre de lecture
out.write(frame)
#Chargez l'image suivante
ret,frame = movie.read()
#Progression de la sortie toutes les 100 images pour vérifier la progression
if movie.get(cv2.CAP_PROP_POS_FRAMES)%100 == 0:
date = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
print(date + 'Nombre actuel d'images:'+str(int(movie.get(cv2.CAP_PROP_POS_FRAMES))))
#Parce qu'il est long, il se termine dans le cadre du milieu
# if movie.get(cv2.CAP_PROP_POS_FRAMES) > 1000:
# break
print("Terminé")
def resize_image(image, height, width):
#Obtenez la taille d'origine
org_height, org_width = image.shape[:2]
#Rétrécir pour s'adapter à la plus grande taille
if float(height)/org_height > float(width)/org_width:
ratio = float(height)/org_height
else:
ratio = float(width)/org_width
resized = cv2.resize(image,(int(org_height*ratio),int(org_width*ratio)))
return resized
#Combinez des images à l'aide de PIL
def overlayOnPart(src_image, overlay_image, posX, posY):
#Obtenir la taille de l'image de superposition
ol_height, ol_width = overlay_image.shape[:2]
#Convertir les données d'image OpenCV en PIL
#Convertir de BGRA en RGBA
src_image_RGBA = cv2.cvtColor(src_image, cv2.COLOR_BGR2RGB)
overlay_image_RGBA = cv2.cvtColor(overlay_image, cv2.COLOR_BGRA2RGBA)
#Convertir en PIL
src_image_PIL=Image.fromarray(src_image_RGBA)
overlay_image_PIL=Image.fromarray(overlay_image_RGBA)
#Passer en mode RGBA pour la composition
src_image_PIL = src_image_PIL.convert('RGBA')
overlay_image_PIL = overlay_image_PIL.convert('RGBA')
#Préparez un campus transparent de la même taille
tmp = Image.new('RGBA', src_image_PIL.size, (255, 255,255, 0))
#Écraser le campus préparé
tmp.paste(overlay_image_PIL, (posX, posY), overlay_image_PIL)
#Combinez l'original et le campus et économisez
result = Image.alpha_composite(src_image_PIL, tmp)
# COLOR_COULEUR de RGBA2BGRA_Changé en RGBA2BGR. Si le canal alpha est inclus, il ne sera pas correctement transmis à la vidéo.
return cv2.cvtColor(np.asarray(result), cv2.COLOR_RGBA2BGR)
if __name__ == '__main__':
overlay_movie()
Cela devient de plus en plus long.
2016/03/11 21:57:04 Nombre actuel de vues: 100.0 2016/03/11 21:57:16 Nombre actuel de vues: 200.0 2016/03/11 21:57:28 Nombre actuel de vues: 300.0 ・ ・ ・ 2016/03/11 22:08:59 Nombre actuel d'images: 7100.0 Terminé
Il a été exécuté dans l'environnement de la mémoire Core i5-4670 3,40 GHz 16 Go pour la vidéo de taille d'image 718 × 480, 24fps, 5:00. Cela a pris un certain temps, mais j'ai pu sortir une vidéo Photoshop diverse.
Cependant, ceci est incomplet. Si vous avez plusieurs visages, vous pouvez tous les écraser,
Même un visage qui est reconnu par erreur sera écrasé au hasard.
La prochaine fois, je viserai à résoudre ce problème. Création de diverses vidéos Photoshop avec Python + OpenCV ④ Résolution des problèmes
Recommended Posts