Dies ist eine Fortsetzung der vorherigen Zeit (Teil 2 Photoshop-Erstellung von Standbildern). Wenden Sie die vorherige Standbildüberlagerung auf das Gesicht des Videos an. Ich habe auf die folgende Seite verwiesen. [Serie] "CV-Programmierung mit Python und OpenCV" 9 .: OpenCV-Python® Videoeingabe / -ausgabe und Maus- / Tastaturrückruf mit HighGUI
Lassen Sie uns zunächst das Video eingeben und ausgeben. Laden Sie das Video einfach und geben Sie es unverändert aus. Unten ist der Code
export_movie.py
#coding=utf-8
import cv2
def export_movie():
#Geben Sie das einzugebende Video und den Ausgabepfad an.
target = "target/test_input.mp4"
result = "result/test_output.m4v"
#Laden von Videos und Abrufen von Videoinformationen
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)
#Geben Sie MP4V als Format an
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
#Öffnen Sie die Ausgabedatei
out = cv2.VideoWriter(result, int(fourcc), fps, (int(width), int(height)))
#Lesen Sie den ersten Frame
if movie.isOpened() == True:
ret,frame = movie.read()
else:
ret = False
#Exportieren Sie weiterhin Frames, während Sie Frames erfolgreich lesen
while ret:
#Schreiben Sie den Leserahmen
out.write(frame)
#Laden Sie den nächsten Frame
ret,frame = movie.read()
if __name__ == '__main__':
export_movie()
Super einfach
Obwohl sich die Kapazität fast verdreifacht hat, konnte ich das Ausgabevideo abspielen. Es scheint, dass der Code-Code in diesem Bereich ordnungsgemäß eingeführt werden muss. Da ist kein Ton.
Da es mir gelungen ist, das Video einzugeben und auszugeben, werde ich endlich ein anderes Photoshop-Video erstellen. Sie müssen jedoch nur die Gesichtserkennung und Überlagerung durchführen, bevor Sie das Video ausgeben. Aus Videodateien gelesene Frames können wie Bilddateien behandelt werden. Außerdem hat sich das Ende der Funktion overlayOnPart geändert, sodass das Rückgabebild nicht den Alphakanal enthält (Transparenz). Unten ist der Code.
overlay_movie.py
#coding=utf-8
import cv2
import datetime
import numpy as np
from PIL import Image
def overlay_movie():
#Geben Sie das einzugebende Video und den Ausgabepfad an.
target = "target/test_input.mp4"
result = "result/test_output.m4v" #.Ich erhalte eine Fehlermeldung, wenn ich m4v nicht verwende
#Laden von Videos und Abrufen von Videoinformationen
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)
#Geben Sie MP4V als Format an
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
#Öffnen Sie die Ausgabedatei
out = cv2.VideoWriter(result, int(fourcc), fps, (int(width), int(height)))
#Ermitteln Sie die Merkmalsmenge des Kaskadenklassifikators
cascade_path = "haarcascades/haarcascade_frontalface_alt.xml"
cascade = cv2.CascadeClassifier(cascade_path)
#Overlay-Bild wird geladen
ol_imgae_path = "target/warai_otoko.png "
ol_image = cv2.imread(ol_imgae_path,cv2.IMREAD_UNCHANGED)
#Lesen Sie den ersten Frame
if movie.isOpened() == True:
ret,frame = movie.read()
else:
ret = False
#Exportieren Sie weiterhin Frames, während Sie Frames erfolgreich lesen
while ret:
#In Graustufen konvertieren
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
#Gesichtserkennung durchführen
facerecog = cascade.detectMultiScale(frame_gray, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))
if len(facerecog) > 0:
#Fügen Sie dem erkannten Gesicht ein Bild hinzu
for rect in facerecog:
#Passen Sie die Bildgröße an den Erkennungsbereich an
resized_ol_image = resize_image(ol_image, rect[2], rect[3])
#Overlay-Bilderstellung
frame = overlayOnPart(frame, resized_ol_image, rect[0],rect[1])
#Schreiben Sie den Leserahmen
out.write(frame)
#Laden Sie den nächsten Frame
ret,frame = movie.read()
#Ausgabefortschritt alle 100 Frames, um den Fortschritt zu überprüfen
if movie.get(cv2.CAP_PROP_POS_FRAMES)%100 == 0:
date = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
print(date + 'Aktuelle Anzahl der Frames:'+str(int(movie.get(cv2.CAP_PROP_POS_FRAMES))))
#Weil es lang ist, endet es im mittleren Rahmen
# if movie.get(cv2.CAP_PROP_POS_FRAMES) > 1000:
# break
print("Erledigt")
def resize_image(image, height, width):
#Holen Sie sich die Originalgröße
org_height, org_width = image.shape[:2]
#Schrumpfen, um der größeren Größe zu entsprechen
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
#Kombinieren Sie Bilder mit PIL
def overlayOnPart(src_image, overlay_image, posX, posY):
#Ermitteln Sie die Größe des Überlagerungsbilds
ol_height, ol_width = overlay_image.shape[:2]
#Konvertieren Sie OpenCV-Bilddaten in PIL
#Konvertieren Sie von BGRA zu RGBA
src_image_RGBA = cv2.cvtColor(src_image, cv2.COLOR_BGR2RGB)
overlay_image_RGBA = cv2.cvtColor(overlay_image, cv2.COLOR_BGRA2RGBA)
#In PIL konvertieren
src_image_PIL=Image.fromarray(src_image_RGBA)
overlay_image_PIL=Image.fromarray(overlay_image_RGBA)
#Wechseln Sie zum Compositing in den RGBA-Modus
src_image_PIL = src_image_PIL.convert('RGBA')
overlay_image_PIL = overlay_image_PIL.convert('RGBA')
#Bereiten Sie einen transparenten Campus derselben Größe vor
tmp = Image.new('RGBA', src_image_PIL.size, (255, 255,255, 0))
#Überschreiben Sie den vorbereiteten Campus
tmp.paste(overlay_image_PIL, (posX, posY), overlay_image_PIL)
#Kombinieren Sie Original und Campus und speichern Sie
result = Image.alpha_composite(src_image_PIL, tmp)
# COLOR_FARBE von RGBA2BGRA_In RGBA2BGR geändert. Wenn der Alphakanal enthalten ist, wird er nicht richtig im Video ausgegeben.
return cv2.cvtColor(np.asarray(result), cv2.COLOR_RGBA2BGR)
if __name__ == '__main__':
overlay_movie()
Es wird immer länger.
2016/03/11 21:57:04 Aktuelle Anzahl der Frames: 100.0 2016/03/11 21:57:16 Aktuelle Anzahl der Frames: 200.0 2016/03/11 21:57:28 Aktuelle Anzahl der Frames: 300.0 ・ ・ ・ 2016/03/11 22:08:59 Aktuelle Anzahl der Frames: 7100.0 Erledigt
Es wurde in der Umgebung des Core i5-4670 3,40 GHz-Speichers mit 16 GB für das Video mit einer Bildgröße von 718 × 480, 24 fps und 5:00 ausgeführt. Es hat eine ganze Weile gedauert, aber ich konnte ein anderes Photoshop-Video ausgeben.
Dies ist jedoch unvollständig. Wenn Sie mehrere Gesichter haben, können Sie alle überschreiben.
Sogar ein Gesicht, das fälschlicherweise erkannt wird, wird zufällig überschrieben.
Nächstes Mal werde ich versuchen, dieses Problem zu lösen. Erstellen verschiedener Photoshop-Videos mit Python + OpenCV ④ Beheben von Problemen
Recommended Posts