大きくなったら大蛇に

Python始めたての初心者による学習ブログです

ステレオグラムの作り方_実践編4(GIFアニメを作る)

■どんなステレオグラムを作ろうか

ステレオグラムを見るのは目のピント調節機能を鍛えるから、目にいいといいますが、いかんせん同じ画像をボケーっと見てるのは飽きるんですよね。慣れるとすぐピントを合わせられちゃうからピント調節の訓練している気がしないし。

私にとってのステレオグラムの欠点って「飽きる」なのです。

そこで、楽しく飽きずにステレオグラムを見続けられるためにステレオグラムを動かしたいと思いました。

 

ステレオグラムの深度マップを動かしてみよう

今までに習得したあれこれで3Dの深度マップを作ってみました。

これで、人が歩いているようなアニメにしてみたい。

そこでもう一枚準備しました。

この2枚の画像でステレオグラムを作って、それをパラパラ漫画にしたら歩いているように見えるんじゃないかと。

よし、とりあえずやってみよう。

それぞれの画像から作ったステレオグラムは↓


ではパラパラ漫画にしてみましょう!

★GIFアニメを作るコマンド★

ln[1]  #インポートするライブラリ

from PIL import Image

ln[2]  #画像の入れ物を準備

img_walking=[]

ln[3] #画像をどんどん入れていく(今回は2枚だけですが)

for i in range(2):
    file_name='./in_img/gif/walking' +str(i+1)+ '.jpg'
    img = Image.open(file_name)
    img_walking.append(img)

2行目

file名の”str(i+1)”について

画像ファイル名は連番にしていて、小さい番号のファイルから順に読んでもらいたかったので、最初は

file_name='./in_img/gif/walking' +i+ '.jpg'

していたのですが、

can only concatenate str (not "int") to strとエラーが出ました。

この書き方はだめなのですね。

str(i+1)(※str(i)だと0から始まってしまうので。)でstrで囲って文字列にするとうまくいきました。(iが変数扱いのままにできるのが不思議…)

 

3行目

Imageモジュールのopen関数で画像を開く。

 Image.open("画像のPath”)

 

4行目

リスト名.append()で、画像のファイル名とデータをimg_walkingに入れていく

 

ln[3] #gifアニメを出力する

img_walking[0].save('./out_img/walking.gif',save_all=True, append_images=img_walking[1:],
optimize=True, duration=800, loop=0)

静止画ファイルからGIFを作るのは以下コマンド。

img_walking[0].save(           #リスト名[0].saveで画像の保存

  './out_img/walking.gif',           #保存先Path名/ファイル名.gif

  save_all=True,            #ループの回数

  append_images=img_walking[1:],    #リスト名[0]に[1]以降の画像をつなげる

  optimize=True,                                         #??

  duration=800,                                          # フレームの表示時間 ミリ秒

  loop=0                #ループ回数。無限にしたいときはゼロ

)

 

おお、イメージ通りにできました!

ただちょっとチカチカして目が疲れそう。もうちょっと滑らかに変化して貰いたいなぁ。うーん。どうしましょう。

OpneCVのフレーム補間って急な画像変化の緩衝に使えるでしょうか。。。

それとも深度マップ画像をモーフィングで徐々に変化させて動画のフレーム周波数を上げる?

なにかいい方法がないものでしょうか。。。

 

なお、今回はPILでgifにしましたが、OpenCVでmp4動画にすることもできました。

このあと画像を横にスライドさせて歩いている感を出したいと考えているので、画像をOpenCVで色々操作するならOpenCVで統一した方がいいかもしれないと後から思いました。