先日こんな記事を発見!!
note.com
さっそく妻に
"コマ撮りしてみないか?"
と誘ってみたところ、
"昔やってみたけどうまく行かなかった。"
"ただ興味はあるから協力してくれたらやる!!"
とのこと。
こんなご時世なのでお外に出づらいこともあり、
休日のお家時間として作業を行うことにしました!!
と言っても、、、
・妻:コマ撮り画像を作成
・私:画像を動画化
の分担となり、ほとんど私は何もしなかったのですがw。
動画作成後日談は別ブログに載せるとして、、、
こちらでは連番画像を動画化した時のコードを載せておきたいと思います!!
下記画像はコマ撮り映像に使用した画像です!!
■環境
・OS:windows10
・言語:python
・プラットフォーム:anaconda
■連番画像の作成
動画化に入る前に連番画像になるように画像の名前をリネームしていきたいと思います。
今回使用した画像は写真撮影時間が名前に入っていたのですでに連番画像として扱おうと思えば扱えたのですが、
ちょっと分かりにくかったので番号名に変換しました。
その時のコードがこちら。
filepath_list = sorted(glob.glob('Photos/*')) shutil.rmtree("./copyed") os.mkdir("./copyed") j = 0 for filename in filepath_list: #os.rename(filename, "copyed\photo"+str(j)+".jpg") #ファイルのリネームの場合 shutil.copyfile(filename, "copyed\photo"+str(j)+".jpg") #別フォルダにコピーする場合 j+=1
まず、
filepath_list = sorted(glob.glob('Photos/*'))
でフォルダ内のソートを行い、
shutil.rmtree("./copyed") os.mkdir("./copyed")
で名前変換後にコピーするフォルダを再作成。
実施当初はリネームのみしていたのですが、
動画作成時の妻の要望が多かったためこちらのコードにしました。
最後に、
for filename in filepath_list: #os.rename(filename, "copyed\photo"+str(j)+".jpg") #ファイルのリネームの場合 shutil.copyfile(filename, "copyed\photo"+str(j)+".jpg") #別フォルダにコピーする場合 j+=1
でファイル毎に名前をphoto0.jpgといった名前にリネームないしは別フォルダにコピーしています。
ファイルをリネームするだけか別フォルダにコピーするかはお好みで。
■連番画像から動画化
では本題の連番画像から動画にしてみたいと思います。
と言ってもコードは結構単純なので載せてしまいます。
for i in range(0, j): filepath = "copyed\photo"+str(i)+".jpg" _img = cv2.imread(filepath) if _img is None: print("can't read") break img = cv2.resize(_img, (1616,1080)) video.write(img) video.release()
まず、
fourcc = cv2.VideoWriter_fourcc('m','p','4','v') video = cv2.VideoWriter("video.mp4",fourcc,3.5, (1616,1080)) filepath = "copyed\photo"+str(i)+".jpg" _img = cv2.imread(filepath) if _img is None: print("can't read") break
で各ファイル毎にimreadで画像を読み出します。
画像名を連続番号に変更しているため単純なfor文で読み出しが可能になっています。
もし、画像が読み出せなかったら、
"can't read"
と出力し処理を抜けています。
そして、
video.write(img)
にて画像を1フレームとしてvideowriterに書き込んでいます。
videowriterですが、
fourcc = cv2.VideoWriter_fourcc('m','p','4','v') video = cv2.VideoWriter("video.mp4",fourcc,3.5, (1616,1080))
として、3.5fpsのmp4動画に変換しています。
3.5fpsの理由ですが、、、
コマ撮り動画を見ながら調整しました。
4fpsだと早いし3fpsだと遅いとのこと。
まぁ、こちらは環境や好みで変更ください。
■おまけ
画像の保存時間でソート、連番画像を作成する場合にはこちらのコードで行えます。
#files = os.listdir("Photos/") xs = [] j = 0 for root, dir, files in os.walk("copyed/"): for f in files: path = os.path.join(root, f) xs.append((os.path.getmtime(path), path)) for mtime, path in sorted(xs): name = os.path.basename(path) t = datetime.datetime.fromtimestamp(mtime) print(t, name) #os.rename('Photos\\' +name, "Photos\photo"+str(j)+".jpg") j+=1
■全体コード
コード全体はこちらのようになりました。
import sys import cv2 import os import glob import re import time import datetime import shutil fourcc = cv2.VideoWriter_fourcc('m','p','4','v') video = cv2.VideoWriter("video.mp4",fourcc,3.5, (1616,1080)) if not video.isOpened(): print("can't be opened") sys.exit() #保存時間でソート・リネームする場合はこちらを利用. ''' #files = os.listdir("Photos/") xs = [] j = 0 for root, dir, files in os.walk("copyed/"): for f in files: path = os.path.join(root, f) xs.append((os.path.getmtime(path), path)) for mtime, path in sorted(xs): name = os.path.basename(path) t = datetime.datetime.fromtimestamp(mtime) print(t, name) #os.rename('Photos\\' +name, "Photos\photo"+str(j)+".jpg") j+=1 ''' #ファイル名でのソートはこちらを利用. filepath_list = sorted(glob.glob('Photos/*')) shutil.rmtree("./copyed") os.mkdir("./copyed") j = 0 for filename in filepath_list: #os.rename(filename, "copyed\photo"+str(j)+".jpg") shutil.copyfile(filename, "copyed\photo"+str(j)+".jpg") j+=1 for i in range(0, j): filepath = "copyed\photo"+str(i)+".jpg" _img = cv2.imread(filepath) if _img is None: print("can't read") break img = cv2.resize(_img, (1616,1080)) video.write(img) video.release()
■最後に
画像を連番画像となるように名前をリネームし動画化するまでを行いました。
コマ撮り映像はこちらのようになりました。
よろしかったら見てみてください!!
www.youtube.com
今後も続ける予定なようなので、動画にするコードもアプリとして使用できるようにしようかな?