[PYTHON] LGTM - Erstellen Sie LGTM-Bilder mit Videos und Fotos und geben Sie GIF-Animationen aus

Ich habe versucht, eine GIF-Animation für LGTM mit einem Skript aus Videos und Fotos auszugeben, die auf Reisen aufgenommen wurden. Fotos mit Anti-Aliasing wunderschön reduzieren Dies ist eine Fortsetzung des Artikels. Das Verwackeln der Kamera ist stärker als erwartet, daher möchte ich als zukünftiges Ziel die Logik zum Verwackeln der Kamera hinzufügen. Sie sollten dazu in der Lage sein, indem Sie die Merkmalspunkte des Bild- und Mustervergleichs extrahieren ...

Fertiges Produkt

b_lgtm.gif

lgtm.gif

Verarbeitungsablauf

  1. Konvertieren Sie Videos mit ffmpeg in Bilder
  2. Reduzieren Sie das Bild mit PIL
  3. Kombinieren Sie LGTM-Bilder mit PIL
  4. Konvertieren Sie Bilder mit imagemagick in GIF-Videos

Installation

Es wurde bestätigt, dass es nur in der Python2.7-Umgebung von Mac funktioniert

#PIL-Installation
pip install PIL --allow-external PIL --allow-unverified PIL

#imagemagick installieren
brew install imagemagick

#Installationsbestätigung
convert --version
>>> Version: ImageMagick 6.9.2-5 Q16 x86_64 2015-11-01 http://www.imagemagick.org
>>> Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
>>> License: http://www.imagemagick.org/script/license.php
>>> Features: Cipher DPC Modules 
>>> Delegates (built-in): bzlib freetype jng jpeg ltdl lzma png tiff xml zlib

#Fmpeg installieren
brew install ffmpeg

Kombinieren Sie LGTM-Bild mit Bild und konvertieren Sie es in GIF-Video

lgtm.py


# -*- coding: utf-8 -*-
import commands
import Image
import re

#Bildhöhenpixel beim Verkleinern
PHOTO_HEIGHT = 300

#Ordner mit Bildern
BASE_DIR = "/Users/XXXX/Desktop/Photos"

#Name des Bildes für reguläre Ausdrücke
PHOTO_REGEX = r"P.*.[jpg|JPG]"

#Bildpräfix nach Größenänderung
PHOTO_RESIZE_PREFIX = "r_"

#LGTM-Bild
LGTM_PATH = "/tmp/lgtm.png "

#Koordinaten zum Zusammensetzen von LGTM-Bildern
LGTM_PASTE_X_Y = (120, 0)


def main():
    #Holen Sie sich den vollständigen Bildpfad
    _cmd = "cd {} && ls".format(BASE_DIR)
    l = commands.getoutput(_cmd)
    l = l.split("\n")
    l = [_l for _l in l if re.match(PHOTO_REGEX, _l)]

    #Generieren Sie einen Ordner für die Ausgabe
    assert len(BASE_DIR) > 5, "BASE_DIR is too short"
    commands.getoutput("rm -rf {}/output".format(BASE_DIR))
    commands.getoutput("mkdir {}/output".format(BASE_DIR))

    for _l in l:
        before_path = '{}/{}'.format(BASE_DIR, _l)
        filename = '{}{}'.format(PHOTO_RESIZE_PREFIX, _l)
        after_path = '{}/output/{}'.format(BASE_DIR, filename)
        resize(before_path, after_path, filename=_l)  #Schrumpfen


def resize(before, after, height=PHOTO_HEIGHT, filename="", aa_enable=True, lgtm_enable=True):
    """
Bildgröße anpassen
    :param str before:Pfad der Originalbilddatei
    :param str after:Bilddateipfad nach Größenänderung
    :param int height:Bildhöhe nach Größenänderung
    :param bool aa_enable:Gibt an, ob Antialiasing aktiviert werden soll
    :param bool lgtm_enable:Gibt an, ob das Zusammensetzen von lgtm-Bildern aktiviert werden soll
    :return:
    """
    #Bild schreibgeschützt öffnen
    img = Image.open(before, 'r')
    #Berechnen Sie die Bildpixel nach der Größenänderung
    before_x, before_y = img.size[0], img.size[1]
    x = int(round(float(height / float(before_y) * float(before_x))))
    y = height
    resize_img = img
    if aa_enable:
        #Mit Antialiasing schrumpfen
        resize_img.thumbnail((x, y), Image.ANTIALIAS)
    else:
        #Schrumpfen ohne Antialiasing
        resize_img = resize_img.resize((x, y))

    #lgtm Bildkomposition
    if lgtm_enable:
        lgtm = Image.open(LGTM_PATH)
        resize_img.paste(lgtm, LGTM_PASTE_X_Y, lgtm)  #Ich synthetisiere, indem ich die Koordinaten anpasse

    #Speichern Sie das Bild nach der Größenänderung
    resize_img.save(after, 'jpeg', quality=100)
    print "RESIZED!:{}[{}x{}] --> {}x{}".format(filename, before_x, before_y, x, y)

#Lauf
main()

#Generierung von GIF-Animationen
cmd = "convert -layers optimize -loop 0 -delay 60 {}/output/*.* {}/lgtm.gif".format(BASE_DIR, BASE_DIR)
output = commands.getoutput(cmd)
print output

Ausführungsergebnis


>>>python ./lgtm.py 
RESIZED!:P1050400.JPG[4592x3448] --> 400x300
RESIZED!:P1050401.JPG[4592x3448] --> 400x300
RESIZED!:P1050402.JPG[4592x3448] --> 400x300
RESIZED!:P1050403.JPG[4592x3448] --> 400x300
RESIZED!:P1050404.JPG[4592x3448] --> 400x300
RESIZED!:P1050405.JPG[4592x3448] --> 400x300
RESIZED!:P1050406.JPG[4592x3448] --> 400x300

Video Bild für Bild mit ffmpeg ausgeben

sample


$ ffmpeg -i [INPUT_FILE] -f image2 -vcodec png -r 4 "./%03d.png "
-Ich gebe Datei
-f Format
-vcodec codec
-r Anzahl der Bilder pro Sekunde
%03d 3-stellige Nummer

Referenz

Die, die ich oft mit ffmpeg verwende

Recommended Posts

LGTM - Erstellen Sie LGTM-Bilder mit Videos und Fotos und geben Sie GIF-Animationen aus
Mit Python + Tweepy können Sie Bilder und Videos der Medienzeitleiste abrufen
Visualisieren Sie den Hohlraumfluss mit matplotlib und speichern Sie ihn als GIF-Animation
Extrahieren Sie Videos von YouTube und erstellen Sie daraus GIF-Animationen für LGTM
[IOS] Zerlegen Sie die GIF-Animation mit Pythonista3.
Machen wir ein LGTM-Bild mit GIMP! (Python-Fu)
Laden Sie das GIF-Bild mit Python + OpenCV
Einfache Animation mit matplotlib (mp4, gif)
Laden Sie Bilder mit Falcon hoch und laden Sie sie herunter
Erhalten Sie Tweets mit der Google Cloud-Funktion und speichern Sie Bilder automatisch in Google Fotos
Bilder mit Pupil, Python und OpenCV aufnehmen
Fügen Sie mit Pythonista Bilder zu iOS-Fotos hinzu
Erstellen Sie eine GIF-Animation mit Ordnerüberwachung
Importieren und Exportieren von GeoTiff-Bildern mit Python
Schneiden Sie Bilder aus und verbinden Sie sie mit ImageMagick