[PYTHON] LGTM --Composez des images LGTM avec des vidéos et des photos et produisez une animation GIF

J'ai essayé de produire une animation GIF pour LGTM avec un script à partir de vidéos et de photos prises en voyage. Réduisez magnifiquement les photos avec l'anti-aliasing Ceci est une suite de l'article. Le tremblement de la caméra est plus grave que prévu, je voudrais donc ajouter une logique de correction du tremblement de la caméra comme objectif futur. Vous devriez pouvoir le faire en extrayant les points caractéristiques de l'image et le motif correspondant ...

Produit fini

b_lgtm.gif

lgtm.gif

Flux de traitement

  1. Convertissez la vidéo en image avec ffmpeg
  2. Réduisez l'image avec PIL
  3. Combinez les images LGTM avec PIL
  4. Convertissez des images en vidéos GIF avec imagemagick

Installation

Confirmé pour fonctionner uniquement dans l'environnement python2.7 de mac

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

#installation d'imagemagick
brew install imagemagick

#confirmation d'installation
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

#Installation de ffmpeg
brew install ffmpeg

Combinez une image LGTM avec une image et convertissez en vidéo GIF

lgtm.py


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

#Pixels de hauteur d'image lors de la réduction
PHOTO_HEIGHT = 300

#Dossier avec images
BASE_DIR = "/Users/XXXX/Desktop/Photos"

#Nom d'expression régulière de l'image
PHOTO_REGEX = r"P.*.[jpg|JPG]"

#Préfixe d'image après redimensionnement
PHOTO_RESIZE_PREFIX = "r_"

#Image LGTM
LGTM_PATH = "/tmp/lgtm.png "

#Coordonnées pour la composition d'images LGTM
LGTM_PASTE_X_Y = (120, 0)


def main():
    #Obtenir le chemin complet de l'image
    _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)]

    #Générer un dossier pour la sortie
    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)  #Rétrécir


def resize(before, after, height=PHOTO_HEIGHT, filename="", aa_enable=True, lgtm_enable=True):
    """
Redimensionner l'image
    :param str before:Chemin du fichier image d'origine
    :param str after:Chemin du fichier image après le redimensionnement
    :param int height:Hauteur de l'image après le redimensionnement
    :param bool aa_enable:Activer l'anticrénelage
    :param bool lgtm_enable:Activer ou non la composition d'images LGTM
    :return:
    """
    #Ouvrir l'image en lecture seule
    img = Image.open(before, 'r')
    #Calculer les pixels de l'image après le redimensionnement
    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:
        #Rétrécir avec l'anticrénelage
        resize_img.thumbnail((x, y), Image.ANTIALIAS)
    else:
        #Rétrécir sans antialiasing
        resize_img = resize_img.resize((x, y))

    #composition d'image lgtm
    if lgtm_enable:
        lgtm = Image.open(LGTM_PATH)
        resize_img.paste(lgtm, LGTM_PASTE_X_Y, lgtm)  #Je synthétise en faisant correspondre les coordonnées

    #Enregistrer l'image après le redimensionnement
    resize_img.save(after, 'jpeg', quality=100)
    print "RESIZED!:{}[{}x{}] --> {}x{}".format(filename, before_x, before_y, x, y)

#Courir
main()

#génération d'animation gif
cmd = "convert -layers optimize -loop 0 -delay 60 {}/output/*.* {}/lgtm.gif".format(BASE_DIR, BASE_DIR)
output = commands.getoutput(cmd)
print output

Résultat d'exécution


>>>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

Sortie vidéo image par image avec ffmpeg

sample


$ ffmpeg -i [INPUT_FILE] -f image2 -vcodec png -r 4 "./%03d.png "
-je fichier d'entrée
-format f
-codec vcodec
-r Nombre d'images par seconde
%03d numéro à 3 chiffres

référence

Celui que j'utilise souvent avec ffmpeg

Recommended Posts

LGTM --Composez des images LGTM avec des vidéos et des photos et produisez une animation GIF
Obtenez des images et des vidéos de la chronologie des médias avec Python + Tweepy
Visualisez l'écoulement de la cavité avec matplotlib et enregistrez-le en tant qu'animation gif
Extrayez des vidéos de YouTube et créez des animations GIF pour LGTM à partir d'elles
[IOS] Démontez l'animation GIF avec Pythonista3.
Faisons une image LGTM avec GIMP! (Python-fu)
Charger une image gif avec Python + OpenCV
Animation facile avec matplotlib (mp4, gif)
Télécharger et télécharger des images avec Falcon
Recevez des tweets avec la fonction Google Cloud et enregistrez automatiquement les images dans Google Photos
Capturer des images avec Pupil, python et OpenCV
Ajouter des images à des photos iOS avec Pythonista
Créer une animation GIF avec surveillance des dossiers
Importer et exporter des images GeoTiff avec Python
Découpez et connectez des images avec ImageMagick