少し長い時間(30秒とか)をかけて、画像の一部が少しづつ変化していく動画。どこが変わっているのか、神経を集中して脳を働かせると、脳のトレーニングになるらしいです。と、言うことで、以下の動画をご覧ください。30秒ほどで画像の一部が変化しています。集中してみてくださいね。
わかりましたか?「ここだよ」って答えズバリは書きませんよ。
では、この動画を生成するスクリプトを作ってみましょう。
まず、画像が2枚必要です。最初の画像(画像#1)と、徐々に変化して最後に到達する画像(#2)の2枚です。
この2枚の画像をうまく作るのがキモですね。このページは動画を生成するスクリプトに主眼を置くので、その、一番キモの部分は解説しないんですけどね……(1^^;)。
まずは、良さそうな画像を選びます。「良さそう」→足しやすそう、消しやすそう、変わった時にインパクトがありそう、が、選択基準です。選んだら、その画像が画像#1となります。
画像#1をコピーして、画像#2を作成します。コピーしただけなので、まだこの段階では画像#1=画像#2です。画像#2を適切なグラフィックエディタで開いて、画像を加工します。
加工したら、保存します。
スクリプトを作りますが、これはすごく簡単。前のサンプル「補色の錯視動画」でやったのと変わらないので、重複する説明(セーブ方法とかウインドウスタックとか)は避けます。
作る手順は以下の通り。
動画の再生ツールによっては、再生終了後、最初の画像に戻ってしまう場合があります。これをやられると、変化後の画像#2から変化前の画像#1に一瞬で切り替わってしまって、答えがわかってしまいます。対策として、頭とお尻に黒い画像を追加しておきます。
肝心な合成の所ですが、filter命令のblendを使います。以下文法。
filter blend, <rate>,<add_dec>;
<rate>は、0〜100の数値で、実行時のウインドウスタック0番の画像を<rate>[%]、スタック1番の画像を(100−<rate>)[%]の割合でブレンドした新しい画像を生成します。<add_dec>の値で以下のような違いがありますが、この場では、<add_dec>=0を使います。
意外と、ブレンド処理に時間がかかるようなので、ちゃんとプログレスバーを更新して、進捗状況をユーザに通知するようにしてみましょう。
スクリプトの先頭で指定した定数を使うと、作ろうとしている動画のフレーム数がわかりますので、まず、トータルのフレーム数を計算します。
var N_total;
N_total=(T_black*2 + T_stay*2 + T_change)*fps;
処理したフレーム数をカウントする変数を0で初期化して、1フレーム処理する毎にカウントアップしていきます。
var N_fcnt;
N_fcnt=0;
N_fcnt/N_totalが処理の終わった割合ですので、これをプログレスバーに反映するため、progress命令を使います。
progress <message>, <percent> ;
<message>には、現在の状態を示すメッセージを記入します。<percent>は、0〜100の数値で、プログレスバーの進捗度合いを示します。
progress "processing(3/5)..",N_fcnt*100/N_total;
Olive+のスクリプト処理中に表示されるウインドウが以下の様に変化します。プログレスバーの進捗度合いも、<percent>に指定した数値が反映されます。
プログレスバーの処理をOlive+に戻す時は、<message>に空文字列を渡します。
progress "",0;
完成したスクリプトです。
Olive+スクリプト:brain_training.olv
スクリプトを実行すると、最初に変換する画像ファイルを問いあわせるウインドウが2回開きますので、適切な画像を指定してOKを押してください。JPEG(プログレッシブ形式には未対応)やBMPなどに対応しています。準備ができると、「AVIセーブの設定が開いたら……」というメッセージが出ますので、指示に従ってください。AVIセーブの設定ウインドウでは、「ファイルの上書き」にチェックして、フレームレートを指定された通りに設定し、OKを押します。
画像サイズや表示時間などはスクリプト先頭の定数領域で変更可能です。