スポンサーリンク

ImageMagick+ffmpeg+Pythonで比較動画を作る

0.ImageMagickで画像を横に並べる方法

magick convert +append  [画像1ファイル名]   [画像2ファイル名]   [出力ファイル名]

具体例:

magick convert +append glass.png metalic.png ret.jpg

1.Pythonで「ディレクトリ内の全ての画像に対して」ImageMagickをかける

上記、magickのappendを、ディレクトリの中の全ての画像に対して行う関数を作成する。

このスクリプトで”glass/”ディレクトリと”metalic/”ディレクトリ内の連番画像をappendでつなげて”appends/”ディレクトリへ保存する

import subprocess  # コマンドラインを実行する
import os          # パス文字列の操作など
import glob        # ファイル一覧取得など

############################################
############################################

##
# @brief 画像データを横に二つ並べる処理を全ての画像に対して行う
# @param [in] dir_left 左側に配置する画像が存在するディレクトリ
# @param [in] dir_right 右側に配置する画像が存在するディレクトリ
# @param [in] dir_out 出力先のディレクトリ
def image_append(dir_left , dir_right , dir_out):

  # 各ディレクトリの中のファイル一覧
  L_images = glob.glob(dir_left  + "/*.png", recursive=True)
  R_images = glob.glob(dir_right + "/*.png", recursive=True)

  # L_images,R_imagesのリストの要素をそれぞれiL,iRとして
  for(iL,iR) in zip(L_images,R_images):
  
    # 拡張子なしの left側のファイル名を取得
    oname = os.path.splitext(os.path.basename(iL))[0]
    
    # 出力ファイル名作成
    opathname = dir_out + "/" + oname + ".png"
    
    
    # コマンド作成
    command = "magick convert +append " + iL + " " + iR + " " + opathname

    # 作成したコマンドの確認
    print(command)
    
    # コマンドの実行
    subprocess.call(command)


############################################
############################################

# 連番画像作成 引数は全てディレクトリ名
image_append("glass" , "metalic" , "appends")

2.連番画像を動画にするffmpegをPythonから呼び出す

これ単体ならわざわざPythonから呼び出す必要はないが、上記スクリプトに続けて呼び出したいのでPythonからcallする。

import subprocess  # コマンドラインを実行する
import os          # パス文字列の操作など
import glob        # ファイル一覧取得など


############################################
############################################

##
# @brief 連番画像から動画を作成
# @param [in] source 画像の場所とファイル名のパターン
# @param [in] outFileName 出力ファイル名
# @param [in] startNumber 画像の連番の開始番号
def mp4out(source,outFileName,startNumber):

  # コマンド作成
  command = f'ffmpeg -start_number {startNumber} -r 15 -i {source} -vcodec libx264 -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -framerate 60 {outFileName}'

  # コマンドの実行
  subprocess.call(command)


############################################
############################################


# 動画作成 ファイル名、出力ファイル名、連番の最初の番号
mp4out("appends/%04d.png","out.mp4",1)

3.まとめ

構成

C:\TEST\DATA
│  compmv.py ... pythonスクリプト
│  out.mp4   ... ffmpegで生成した動画ファイル。mp4outで生成される
│
├─appends
│      0000.png
│      0001.png
│      0002.png
│      0003.png
│      0004.png
│      .... 結合済み画像 image_appendで出力される
│
├─glass
│      0001.png
│      0002.png
│      0003.png
│      0004.png
│      .... 連番画像1
│
└─metalic
        0001.png
        0002.png
        0003.png
        0004.png
        .... 連番画像2

スクリプト全体

import subprocess  # コマンドラインを実行する
import os          # パス文字列の操作など
import glob        # ファイル一覧取得など

############################################
############################################

##
# @brief 画像データを横に二つ並べる処理を全ての画像に対して行う
# @param [in] dir_left 左側に配置する画像が存在するディレクトリ
# @param [in] dir_right 右側に配置する画像が存在するディレクトリ
# @param [in] dir_out 出力先のディレクトリ
def image_append(dir_left , dir_right , dir_out):

  # 各ディレクトリの中のファイル一覧
  L_images = glob.glob(dir_left  + "/*.png", recursive=True)
  R_images = glob.glob(dir_right + "/*.png", recursive=True)

  # L_images,R_imagesのリストの要素をそれぞれiL,iRとして
  for(iL,iR) in zip(L_images,R_images):
  
    # 拡張子なしの left側のファイル名を取得
    oname = os.path.splitext(os.path.basename(iL))[0]
    
    # 出力ファイル名作成
    opathname = dir_out + "/" + oname + ".png"
    
    
    # コマンド作成
    command = "magick convert +append " + iL + " " + iR + " " + opathname

    # 作成したコマンドの確認
    print(command)
    
    # コマンドの実行
    subprocess.call(command)

      
############################################
############################################

##
# @brief 連番画像から動画を作成
# @param [in] source 画像の場所とファイル名のパターン
# @param [in] outFileName 出力ファイル名
# @param [in] startNumber 画像の連番の開始番号
def mp4out(source,outFileName,startNumber):

  # コマンド作成
  command = f'ffmpeg -start_number {startNumber} -r 15 -i {source} -vcodec libx264 -pix_fmt yuv420p -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -framerate 60 {outFileName}'

  # コマンドの実行
  subprocess.call(command)
############################################
############################################

# 連番画像作成
image_append("glass" , "metalic" , "appends")

# 動画作成
mp4out("appends/%04d.png","out.mp4",1)

結果

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: