2013/07/25(木) [n年前の日記]
#1 [cg_tools] インチキ黒板アニメが作れないか実験
昨日、「進撃の巨人」OP映像を黒板アニメで再現した映像を某所で目にして、「すげえなあ。よくやるなあ。たいしたもんだなあ」と感心していたのだけど。
動画につけられたコメントの中に、「黒板アニメと思い込んでるヤツが居るぞゲラゲラ」みたいな一文があって。「ああ、なるほど。その気になればCGで似たようなことができるかもしれないなあ」と興味が湧いてきたり。
てなわけで実験。
こんな感じになった。 …うむ。ダメだね。絵が綺麗過ぎる。コンピュータは、仕事が正確過ぎますな。なので、やはり、自分が目にした件の映像は、実際の黒板アニメか、もしくはそれに相当する手間暇がかかってそうな予感。
動画の各フレームを、1枚1枚手描きの線でトレースしていけばそれらしくなりそうだな、とも思ったけど。結局ソレってロトスコープなので、黒板アニメほどではないにしても作業としてシンドイことに違いはないわけで。こういう映像は、楽してサクッと作れませんな…。
ただ、この程度でも、例えば音楽PVの中で一瞬出して「おっ?」と思わせる、みたいな使い方はできるかもなと思えたり。一瞬で流れて消えていく映像だったら、結構ソレっぽく見えるかもしれない。
あるいは、写真をめっちゃ手描き風にしてくれる有償プラグイン等が世の中にはあるかもしれないし、常日頃AEを弄ってる人なら「こうすりゃもっと手描き風になるぜ」的ノウハウを持ってるかもしれないので、人・環境によっては、もっとそれっぽい映像を自動的に作れるかもなと思ったりもして。
とりあえず、Pythonスクリプトも載せときます。環境は Windows7 x64 + Python 2.6.6 + PIL。
PIL じゃなくて ImageMagick を使えば、色調補正等がもっと細かくできるから、アナログ感が増す予感も。なので本当はそっちを使いたかったのだけど、batファイル中で乱数を生成して渡す方法を知らなくて。…まあ、Python や Ruby から convert を呼び出す形でも実現できそうな気もするけど。
動画につけられたコメントの中に、「黒板アニメと思い込んでるヤツが居るぞゲラゲラ」みたいな一文があって。「ああ、なるほど。その気になればCGで似たようなことができるかもしれないなあ」と興味が湧いてきたり。
てなわけで実験。
- blender で元動画を作って、連番画像として出力。
- 写真を手描き風にしてくれる、XnSketch というフリーのソフトで、何枚かを手描き風に変換。…コマンドラインから呼んで一気に変換できると楽なんだけど、できるかどうか不明だったので、仕方なくチマチマと手作業で。助けて。
- ImageMagick で白黒反転。
- 画像素材を公開してくれている PAKUTASO さんから、黒板が写ってる画像を入手してトリミング。
- Python + PIL でスクリプトを書いて合成。
こんな感じになった。 …うむ。ダメだね。絵が綺麗過ぎる。コンピュータは、仕事が正確過ぎますな。なので、やはり、自分が目にした件の映像は、実際の黒板アニメか、もしくはそれに相当する手間暇がかかってそうな予感。
動画の各フレームを、1枚1枚手描きの線でトレースしていけばそれらしくなりそうだな、とも思ったけど。結局ソレってロトスコープなので、黒板アニメほどではないにしても作業としてシンドイことに違いはないわけで。こういう映像は、楽してサクッと作れませんな…。
ただ、この程度でも、例えば音楽PVの中で一瞬出して「おっ?」と思わせる、みたいな使い方はできるかもなと思えたり。一瞬で流れて消えていく映像だったら、結構ソレっぽく見えるかもしれない。
あるいは、写真をめっちゃ手描き風にしてくれる有償プラグイン等が世の中にはあるかもしれないし、常日頃AEを弄ってる人なら「こうすりゃもっと手描き風になるぜ」的ノウハウを持ってるかもしれないので、人・環境によっては、もっとそれっぽい映像を自動的に作れるかもなと思ったりもして。
とりあえず、Pythonスクリプトも載せときます。環境は Windows7 x64 + Python 2.6.6 + PIL。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# -*- mode: python;Encoding: utf8n -*-
'''
PILを使って画像合成するPythonスクリプト。
BG画像の、位置や明度をランダムに変化させながら、白黒画像を重ねていく。
'''
import glob
from PIL import Image, ImageOps, ImageEnhance, ImageChops
import random
infile = "frame_src\\*.png"
outfile = "output\\%08d.png"
outsize = 640, 360
dbg = False
def main():
bg = Image.open('bg.png')
cnt = 0
for file in glob.glob(infile):
# 画像読み込み
im = Image.open(file)
# キャンバス相当を作成
om = Image.new('RGBA', im.size, (0, 0, 0, 0))
# BG画像の位置や明度を変更
rw = bg.size[0] - im.size[0]
rh = bg.size[1] - im.size[1]
sx = - random.randint(0, rw / 2)
sy = - random.randint(0, rh / 2)
enh = ImageEnhance.Brightness(bg)
bg2 = enh.enhance(1.0 + random.random() * 0.25)
om.paste(bg2, (sx, sy))
# 画像の明るさを変更しつつ重ねる
if True:
enh = ImageEnhance.Brightness(im)
im2 = enh.enhance(2.0 + random.random() * 0.5)
out = ImageChops.lighter(om, im2)
else:
enh = ImageEnhance.Contrast(im)
im2 = enh.enhance(2.0 + random.random() * 0.4)
out = ImageChops.screen(om, im2)
# 縮小
out.thumbnail(outsize, Image.ANTIALIAS)
if dbg:
out.show()
break
else:
fn = outfile % cnt
out.save(fn) # 画像保存
print "output %s" % fn
cnt += 1
if __name__ == '__main__':
main()
PIL じゃなくて ImageMagick を使えば、色調補正等がもっと細かくできるから、アナログ感が増す予感も。なので本当はそっちを使いたかったのだけど、batファイル中で乱数を生成して渡す方法を知らなくて。…まあ、Python や Ruby から convert を呼び出す形でも実現できそうな気もするけど。
[ ツッコむ ]
以上です。
