...

動画編集ソフトAviUtl用の範囲選択スクリプト作成 - 澤見ゼミ

by user

on
Category: Documents
14

views

Report

Comments

Transcript

動画編集ソフトAviUtl用の範囲選択スクリプト作成 - 澤見ゼミ
2013 年度 卒業研究論文
AviUtl を用いた
範囲選択スクリプトの作成
岡山理科大学
総合情報学部
情報科学科
澤見研究室
I10I011
大島
海人
I10I077
三枝
勇貴
目次
1.はじめに ..................................................................................................................... 1
2.AviUtl について.......................................................................................................... 2
2.1 Lua .................................................................................................................... 2
2.2 AviUtl の機能 .................................................................................................... 3
2.3 実装されている代表的なスクリプト .................................................................. 9
2.4 AviUtl のスクリプトで利用可能な関数の一例 ..................................................13
3.範囲選択 ....................................................................................................................14
3.1 AviUtl における範囲選択 ..................................................................................15
4.範囲選択スクリプトの作成 ........................................................................................18
4.1 時間移動型 範囲選択スクリプト ......................................................................18
4.2 範囲選択領域と時間による座標の計算方法.......................................................26
4.3 範囲選択型 カラーキー化スクリプト ...............................................................28
4.4 既存の範囲選択機能との比較............................................................................34
5.まとめ........................................................................................................................35
参考文献........................................................................................................................35
付録
A1.時間移動型 範囲選択スクリプト
B1.範囲選択型 カラーキー化スクリプト
1.はじめに
私たちがこの研究をしようと思ったきっかけは,動画編集ソフトに興味があったからで
ある.近年では,動画共有サイト,動画投稿サイトなどを用いて,動画を主とした情報を
発信することが多くなっている.動画の作成・編集を施すことによって情報の強調を行う
ことが多い.その際に使用されるのが動画編集ソフトである.
動画編集ソフトは,カット編集や字幕の追加,再生スピードの変更などを行う機能を有
している.しかし,使用する画像の一部を切り抜いた上で編集したい場合などは,あらか
じめ画像処理ソフトで画像編集を行ってから動画編集に利用するのが一般的な手法である.
そのため,動画編集ソフトは,最低限の画像編集しか備わっていない.そこで,動画編集
ソフトで画像編集も行えるようにすれば便利なのではないかと考えた.このような機能を
付加する動画編集ソフトとして,AviUtl を選択した.理由は,日本語で初心者でも扱いや
すくフリーで機能的である点,そして他の動画編集ソフトよりスクリプトを開発しやすい
点からである.動画編集ソフト AviUtl に標準搭載されている範囲選択機能について調べた
ところ,以下のような問題点があった.
・範囲選択に上下左右の4点の数値指定が必要で手間がかかる
・選択範囲が反転した際,オブジェクトの表示がされない
・時間での範囲制御が数値の直線移動であり,単純である
・ファジー選択機能が搭載されていない
そこで,このような問題点を改善した範囲選択スクリプトを作成することを考えた.
AviUtl でスクリプトの開発を行う際,スクリプト制御をどの部分で行うかを選ぶ必要があ
る.ここでは,トラックバーや各種ダイアログなどの UI が利用でき,動作の調整・制御が
容易であるという使いやすさに配慮したアニメーション効果を実現することのできるスク
リプトを開発する.スクリプト作成に使用する言語は,AviUtl が対応している Lua で行う.
本研究では,最初に動画編集ソフト AviUtl におけるスクリプトの仕組みについて詳しく
調べ,次に新たにスクリプトを作成して,既存の範囲選択機能と比較し,評価する.
1
2.AviUtl について
AviUtl とは,AviUtl のお部屋の管理人である「KEN くん」氏によって開発された動画
編集ソフトウェアである[1].フリーソフトでありながら,シンプルな操作性を持っているお
り,多機能である点から動画編集の初心者や,上級者であることを問わず広く利用されて
いる.このシンプルな操作性および多機能を実現するうえで,大きな役割を有しているの
が拡張編集プラグインである.現在の拡張編集プラグインは最大 100 枚のレイヤーを保持
し,画像や動画などのオブジェクトを 3D 空間に配置することを可能としている.3D 空間
におけるオブジェクトの配置では,カメラの向きやカメラの場所を変更することで,正面,
側面,上部,下部といった 3D 空間からのオブジェクト表示を行うことができる.
AviUtl の優れている点として,プラグイン・スクリプトにも対応しているという点が挙
げられる.ユーザーの望んだ動きをするようなプラグイン・スクリプトを自作することが
できる.後述している,実装されているスクリプトの例で挙げているような幅広い動画編
集効果を付け加えることが可能である.プラグイン・スクリプトを作成しているユーザー
も多く,作成情報を参考に開発することができる.特にスクリプトの情報は動画で実際の
動作や説明がされることが多い.数あるスクリプトの中でもアニメーション効果がよく利
用されており,オブジェクトに動き(アニメーション)を付け加えることで,動画編集の
幅が広がっている.また,拡張編集プラグインがバージョンアップした場合に,外部のユ
ーザーが作ったスクリプトが AviUtl の拡張編集プラグインに標準搭載される場合もある.
実装されているスクリプトの例にある「砕け散る」は外部のユーザーが作成したものであ
る.このように,拡張性が非常に高い動画編集ソフトといえる[2].以下に,スクリプト作成
に使用した言語 Lua についての解説をする.
2.1 Lua
Lua とは,PUC-Rio(the Pontifical Catholic University of Rio de Janeiro)大学の
TeCGraf(the Computer Graphics Technology Group)TeCGraf によって設計開発された
スクリプト言語である[3].特徴としては以下の通りである.
・クロスプラットフォームで Windows,Mac OS X,Linux など複数の OS で動作すること
が可能である.
・商用ゲーム開発の内部処理に利用する言語として最も利用例が多い.
・C 言語のプログラムに組み込まれることを目的に設計されており,C や C++との連携を
実現するのも容易である.
・他のスクリプト言語である Ruby や Python などと比べても高速な動作を実現している.
2
2.2 AviUtl の機能
AviUtl でアニメーション効果によるスクリプトを動作させる為,ここからは起動手順と
画面説明を行う.AviUtl のメイン画面を以下に示す(図 1.1).
図 1.1 AviUtl の起動画面
ツールバーだけを見ると機能が少ないように思えるが,ツールバーから設定を選び,別
途用意されている拡張編集機能を立ち上げることでより細かい編集を行うことができる
(図 1.2).
図 1.2 拡張編集の立ち上げ
3
拡張設定の設定を選択するにより,拡張編集画面が表示される(図 1.3).
図 1.3 拡張編集の画面
さらに,編集を行う画面を表示させるため,新規プロジェクトを立ち上げる(図 1.4).
図 1.4 新規プロジェクトの作成
以下のようなウィンドウが立ち上がる(図 1.5).このウィンドウでは新規プロジェクト
4
を作成する際の編集画面の大きさなどを変更することができる.
図 1.5 新規プロジェクトの設定
新規プロジェクトの設定における設定内容の説明を行う.新規プロジェクトの作成ウィ
ンドウにある”画面サイズ”という項目では,編集画面の大きさを指定することができる.
AviUtl のメイン画面にも同名の項目が存在するが,そちらはファイル出力をした際の画面
サイズとなる.”フレームレート”では,編集時のフレームレート数を指定することができる.
こちらも AviUtl のメイン画面に同名の項目が存在し,画面サイズと同様に出力時のみの設
定となっている.”音声レート”では音声のビットレートを変更することができる.””読み込
むファイルに合わせる”にチェックを入れると取りこんだ動画像に合わせて上記の設定を自
動的に行ってくれる.
5
ここでは”画像サイズ”を 640×720,”
フレームレート”
を 30fps,
”音声レート”を 44100Hz
と設定している.
新規プロジェクトを立ち上げると,メインウィンドウに指定したサイズの編集画面が表示
される(図 1.6).今後,動画像や図形などのオブジェクトを追加していくと,編集画面に
表示されるようになる.
図 1.6 新規プロジェクトの立ち上げ結果
6
このプロジェクトに画像ファイルを追加する(図 1.7)(図 1.8).ここでは例としてアジ
サイの画像を読み込んでいる(図 1.9).
図 1.7 メディアオブジェクトの追加
図 1.8 画像ファイルの選択
7
図 1.9 画像の取り込み画面
このままでは再生時間にかかわらず,ただ画像が表示されているだけである.そこで,
画像を動作させる為に各オブジェクトにアニメーション効果を設定する(図 1.11)
(図 1.12).
図 1.11 アニメーション効果の追加
8
図 1.12 アニメーション効果の付加
アニメーション効果を追加すると,新しくトラックバーが表示される.このトラックバ
ーで数値を簡単に指定することができる.他にも,メインウィンドウにアンカーポイント
を表示させることも可能で,アニメーション効果のスクリプトは視覚的で使いやすいとい
う利点がある.しかし,トラックバーはスクリプトにつき四つまでしか設定できないとい
う制約があり,複雑なスクリプトには不向きである.
今回の研究では,このアニメーション効果として利用できるスクリプト作成し,画像編
集ソフトで行うような機能を追加する.
2.3 実装されている代表的なスクリプト
各々のスクリプトには,製作者によって用意されたトラックバーが存在する.これらの
数値を変更することにより,スクリプトの挙動を制御することができる.以下で,AviUtl
に標準搭載されているスクリプトの挙動とメニュー内容を紹介する.時間移動は左から右
に表している.
9
(1)震える
このアニメーションは,位置移動に回転処理を加えることにより,震えるようなアニメ
ーションを実現している(図 2.1).
図 2.1 震えるアニメーション
白い円図形を対象物の例として,設定項目の説明を行う.”振幅”は震える位置の移動量を
制御している.”角度”は,一度に回転する角度を制御している.”間隔”は振幅と角度を合わ
せた震える効果が起こる間隔を制御している.
(2)弾む
このアニメーションは,現在の位置から角度,高さを計算して,その位置まで移動して
戻ってくる動作を繰り返すことにより,弾むようなアニメーションを実現している(図 2.2).
図 2. 2 弾むアニメーション
10
白い円図形を対象物の例として,設定項目の説明を行う.“速さ”は,再生時間に対する弾
む速さを制御しており,”高さ”では再生時間に対する弾む高さを制御している.”角度”では,
現在の中心点から,移動先の点への角度を制御している.”ずらし”は複数オブジェクトに同
一アニメーションを設定した際のアニメーション開始時間をずらす効果がある.
(3)砕け散る
このアニメーションは,開始点と開始位置を指定し,タイムライン上の指定の時間から
砕け散るアニメーションを加える(図 2.3).
図 2.3 砕け散るアニメーション
白い円図形を対象物の例として,設定項目の説明を行う.”開始時間”は,タイムラインの
開始時間を 0.0 として計算した,砕け散るアニメーションの開始時間である.”中心座標
X,Y,Z”はオブジェクトが砕け散る点を制御している.
11
さらにこの砕け散るアニメーションにはより細かいパラメータ設定が存在する(図 3).
アニメーション効果のメニューバーでは,最大四つのトラックバーによる制御しか行えな
い.それ以上の設定を行いたい場合は,別に詳細設定を用意する必要がある.詳細設定で
は,テキストボックスだけでなく,チェックボックスや画像のカラーコードを設定する専
用のダイアログを用意することもできる.
図 3 砕け散るアニメーションの詳細設定
12
2.4 AviUtl のスクリプトで利用可能な関数の一例
ここでは,スクリプトの開発に利用できる変数や関数を紹介する(表 1,表 2)
.
表 1 変数の一例
*obj.w, *obj.h
画像の幅,高さ
*obj.x, *obj.y, *obj.z
基準座標からの相対座標 x,y,z
obj.zoom
拡大率(1.0=等倍)
obj.alpha
不透明度(0.0=透明/1.0=不透明)
obj.aspect
アスペクト比(-1.0~1.0/プラス=横縮小/マイナス=縦縮小)
*obj.framerate
フレームレート
*obj.time
オブジェクトの開始フレームからの経過秒数
*obj.frame
オブジェクトの開始フレームからの経過フレーム数
表 2 関数の一例
obj.setanchor
ドラッグ操作のできるアンカーポイントを設定する
obj.draw
オブジェクトを描画する
obj.drowpoly
オブジェクトの任意の範囲をポリゴン描画する
obj.getpixel
各種ピクセル情報を取得する
obj.putpixel
ピクセル情報を書き換える
obj.pixeloption
ピクセルの各種オプションを指定する
obj.effect
フィルタ効果を適用させる
obj.load
任意のファイルや図形を読み込む
obj.interpolation
2 点間の座標を曲線的に補間します
obj.getvalue
設定ダイアログの数値やオブジェクトの設定値を取得する
HSV
色情報,色相,彩度,明度の各要素の相互変換を行う
RGB
色情報,赤,緑,青の各要素の相互変換を行う
AviUtl におけるスクリプト作成では,様々な変数や関数が用意されている(表 1,表 2).
一部の変数はスクリプト制御で利用できるが,ReadOnly のみでスクリプトから値を変更で
きない変数である.ReadOnly の変数には印*をつけている(表 1).ReadOnly とはその名
の通りに,読み込み専用である.読み込み専用なので,スクリプト内で ReadOnly である
変数の変更(書き込み)を行っても反映されないということである.
13
3.範囲選択
画像処理における範囲選択とは,画像の特定の範囲を選択することである.範囲を選択
するだけでは意味がないので,後処理としてクリッピングやフィルタ処理などを行うこと
が多い.範囲選択には大きく分けて 2 種類ある.
一つ目は範囲を手動で選択する通常の範囲選択である.ドラッグや数値指定,図形など
で範囲を選択する方法である(図 4.1).
二つ目はファジー選択である.指定または選択した色情報(画素)をもとに,連続した
領域で類似した色情報の範囲のみを自動で選択する方法である[4](図 4.2).
図 4.1 通常の範囲選択
図 4.2 ファジー選択
ファジー選択とはどういったものなのか,画像編集ソフト Gimp に搭載されているファ
ジー選択で説明する.ファジー選択とは画像またはレイヤーから指定した色(画素)をも
とに,連続した領域で同系色(類似色)を選択するものである.連続した領域というのは,
選択されている範囲が僅かな隙間を許しつつも繋がっていることである.通常の範囲選択
と違い,ファジー選択は選択した範囲が最小に収まるので,必要な箇所だけの処理を施す
ことが可能になる.同系色をもとに範囲選択を行うので,輪郭(隣り合う画素の違いを表
す境界)がはっきりした形象を選択することに適しているが,同系色が多い,または,輪
郭がはっきりしていない場合はうまく範囲選択ができないといった点が存在する.
14
3.1 AviUtl における範囲選択
範囲選択には,通常の範囲選択とファジー選択の二通りがあると説明したが,AviUtl で
はファジー選択の機能が実装されていないので通常の範囲選択機能を紹介する.以下で処
理手順を示す(図 5.1).
図 5.1 AviUtl における範囲選択(A)
15
今この表示された画像(図 5.1)に対して範囲選択を行う.それには,画像隅から数えた切
り取りたい px 値を設定する必要があり,まずは上から何 px 切り取るか設定する.ここで
は上から 100px を切り取ることにする.
トラックバーの位置を動かすか,数値を直接入力することで,上から 100px 切り取るこ
とができる(図 5.2).
図 5.2 AviUtl における範囲選択(B)
この操作を同画像(図 5.1)の下,左,右のそれぞれに対しても適用する.
16
ここでは,表示された画像(図 5.1)に対して,上 100px,下 100px,左 100px,右 200px
の切り取りを行っている(図 5.3).
図 5.3 AviUtl における範囲選択(C)
このように,AviUtl で行う範囲選択では,四方の値を一つずつ指定する必要があり,非
常に手間が掛かってしまう.さらに,上 300px,下 300px と指定して選択範囲が交差反転
すると画像が表示されなくなるようになっている.このような動作は使いづらいと考え,
次の項ではこれらの問題点を改善した範囲選択スクリプトの作成を行う.
17
4.範囲選択スクリプトの作成
本研究では,範囲選択を簡単にできるようにする為の範囲選択スクリプトと,カラーキ
ー化スクリプトのスクリプトを作成した.
4.1 時間移動型 範囲選択スクリプト
一つ目のスクリプトは時間移動型 範囲選択スクリプトである.このスクリプトは
AviUtl 既存のクリッピング機能を改良したものであり,搭載されている機能は以下の三つ
がある.
(1)ドラッグによる簡単な範囲選択
ドラッグによって,視覚的で簡単に範囲指定を行えるようにする.
(2)反転処理の実現
選択範囲が交差し,反転した際の描画を実現する.
(3)時間経過による選択範囲の移動
画像をただ切り抜くことは,画像編集ソフトでも可能である.今回は時間による指定範
囲の変更を行い動画作成に役立つスクリプトにする.
18
図 6.1 時間移動型 範囲選択スクリプトの起動画面
時間移動型範囲選択スクリプトを適用した画面である.通常の範囲選択とは異なり,左
上と右下にドラッグで範囲を選択する為のアンカーポイントが存在する(図 6.1).
図 6.2 メニューウィンドウ
19
表 3 トラックバーのパラメータ
横移動 1
左上のアンカーポイントの x 軸移動制御
縦移動 1
左上のアンカーポイントの y 軸移動制御
横移動 1
右下のアンカーポイントの x 軸移動制御
縦移動 1
右下のアンカーポイントの y 軸移動制御
メニューウィンドウでは,アンカーポイントの時間移動に関する数値を設定することが
できる(図 6.2).横移動 1 と横移動 1 で左上のアンカーポイントの時間移動を操作し,横
移動 2 と縦移動 2 で右下のアンカーポイントを操作できる(表 3).
図 6.3 設定ダイアログ
表 4 設定ダイアログのパラメータ
座標移動
時間による選択範囲の移動を行うかを指定
数値クリッピング
既存の範囲選択と同じ制御を行うかを指定
領域サイズ
選択範囲の数値指定情報
リアルタイムでプレビューする
リアルタイムでプレビューするかを指定
設定ダイアログにより,時間移動の有無などを設定することができる(図 6.3).設定ダ
イアログのパラメータである“座標移動”にチェックをいれることにより,時間による選
択範囲の移動を追加することができる(表 4).
20
図 7 ドラッグでの範囲選択
この範囲選択スクリプトでは,左上と右下のアンカーポイントを動かすことにより視覚
的でより簡単に範囲選択を行うことができる(図 7).さらに,時間による選択範囲の移動
を付け加え,画像編集だけでなく動画の編集にも役立つスクリプトに改善した.
図 8.1 メニューウィンドウの設定
まず,時間による範囲移動を行うには,メニューバーから移動する数値を指定する必要
がある.今回は,メニューバーにある”横移動”のトラックバーを 50 に設定する.この際,
右のトラックバーは操作することができず,左のトラックバーを操作することで同時に右
のトラックバーも動くようになる(図 8.1).しかし,これだけでは時間による移動は行わ
れない.時間移動を有効にするには,設定ダイアログの”座標移動”にチェックを入れる必要
がある(図 8.2).さらにオブジェクトの再生時間を 10 秒,30fps として合計 300 フレーム
とした(図 8.3).この状態で拡張編集ウィンドウのスクロールバーを左から右へ動かすこ
とで時間による動作を確認することができる.
21
図 8.2 設定ダイアログ
図 8.3 拡張編集ウィンドウ
22
図 8.4 時間経過による選択範囲の移動(移動なし)
再生をすると図のように,時間経過と共に選択範囲を動かすことができる(図 8.4).さ
らに,編集ウィンドウのアンカーポイントを直接移動させることで,アニメーションの開
始位置を変更することもできる.
23
この例で行っているのは”移動無し”という設定であり,数値を一つしか設定することがで
きない.このオブジェクトの移動制御にはいくつかの種類があるので,今回は我々が作成
した移動制御効果が表れる”直線移動”を紹介する.
まず,メニューウィンドウから[横移動 1]-[直線移動]を選択する(図 9.1).すると,さ
きほど非アクティブであったトラックバーの右側も制御できるようになる(図 9.2).左側
のトラックバーは座標移動の開始点を,右側のトラックバーは終了点を示している.
図 9.1 直線移動へ変更
図 9.2 数値の設定
この例では,始点である左トラックバーの値を 100,終点である右トラックバーの値を 0
と設定している.再生時間は,”移動なし”の例と同じ 30fps の 10 秒,300 フレームとする.
直線移動や移動なしは,アニメーション効果のスクリプトに用意されている設定項目の内
部を変更しているだけであり,名前は我々が名付けたものではない.
24
図 9.3 時間経過による選択範囲の移動(直線移動)
”直線移動”の設定では,先ほどの”移動なし”と違って再生時間が 5 秒を超えたあたりから
画像の選択範囲が左に戻るような動作をする.
25
4.2 範囲選択領域と時間による座標の計算方法
範囲選択領域の計算方法は左上と右下の 2 点にあるアンカーポイントの位置情報を基に
行っている.アンカーポイント2点の位置情報をそれぞれ,座標(𝑥1 , 𝑦1),座標(𝑥2 , 𝑦2 )とおく
と,横範囲は|𝑥2 − 𝑥1|,縦範囲は|𝑦2 − 𝑦1 |となる.今回作成したスクリプトは,時間によ
る座標の移動が行える.座標移動には 2 パターンあり,移動量を固定して座標移動させる
方法と移動量を変動させて座標移動を行う方法がある(表 5,表 7)
.座標計算は,移動量(px)
と経過時間を乗算した値を初期座標に加算することによって求めている(表 6,表 8)
.
表 5 移動量が固定の場合
初期座標
𝑃0
オブジェクトの経過フレームが 0 の状態のポインタ座標
フレームレート
FR
指定したフレームレート
移動量
m
トラックバーによって指定した値
経過フレーム
f
オブジェクトの経過フレーム数
総フレーム数
TF
オブジェクトの総フレーム数
経過時間の増加量
1/FR
1 フレームにつき増加する経過時間の量
表 6 経過フレーム f における経過時間 t(f) と座標 P(f)
経過時間 t(f)
t(f) = f / FR
経過フレーム / フレームレート
座標 P(f)
P(f) = 𝑃0 + m * t(f)
初期座標 + 移動量 * 経過時間
移動量が固定の場合,経過時間(経過フレーム)の増加に伴って,座標の移動が行われ
る.例として,初期座標 20,フレームレート 30,移動量 100,総フレーム数 30 とすると,
1 フレーム当たりの経過時間の増加量は 1/30 となり,座標の増加量は 100/30 である.最終
フレームの座標は 20+100*30/30 の計算より,120 という結果が出る(図 10).
移動量を固定した場合の経過フレーム f における座標
140
120
100
座
標
80
60
座標(f)
40
20
0
0
2
4
6
8
10 12 14 16 18 20 22 24 26 28 30
経過フレーム(f)
図 10 移動量を固定した場合の座標の動き
26
表 7 移動量が変動する場合
総フレーム数
TF
開始移動量
𝑚0
終了移動量
𝑚𝑇𝐹
1 フレームごとの変動量
(𝑚𝑇𝐹 - 𝑚0 ) / TF
表 8 フレーム f における変動量 v(f),移動量 m(f),時間 t(f) ,座標 P(f)
変動量 v(f)
v(f) = f * (𝑚𝑇𝐹 - 𝑚0 ) / TF
移動量 m(f)
m(f) = 𝑚0 + v(f)
経過時間 t(f)
t(f) = f / FR
座標 P(f)
P(f) = 𝑃0 + m(f) * t(f)
再生時における選択範囲の 1 フレームごとの変動量は,終了移動量 𝑚 𝑇𝐹 と開始移動量
𝑚0 の差を総フレーム数で割った値になる.開始移動量,終了移動量,総フレーム,フレー
ムレートの値によって,1 フレームごとの変動量が変わり,座標の値が変化していく.例と
して,初期座標 20,開始移動量 100,終了移動量 30,フレームレート 30,総フレーム数
30 とすると,1 フレーム当たりの変動量は-70/30 となる.時間が進むにつれ,変動量・経
過時間は増加し,移動量は減っていく.座標 P(f)の式によって,この例での座標の値は山な
りに変動する(図 11).
移動量が変動する場合の経過フレームfにおける座標
120.00
100.00
80.00
座
標
座標(f)
60.00
移動量m(f)
40.00
変動量v(f)
20.00
0.00
0
2
4
6
8 10 12 14 16 18 20 22 24 26 28 30
経過フレーム(f)
図 11 移動量が変動する場合の座標の動き
27
4.3 範囲選択型 カラーキー化スクリプト
本研究の最終目標はファジー選択としていた為,ファジー選択に近づけるためのカラー
キー化スクリプトを作成した.搭載されている機能は以下の三つである.
(1)ドラッグで選択した範囲をカラーキー化
ファジー選択における選択範囲検出に類似した動作をするカラーキーを用いて,ファジ
ー選択の実現に近づける.
(2)時間経過による選択範囲の移動
時間経過での変化を加えることで,画像編集ではなく動画編集としての付加価値がある.
(3)時間経過によるしきい値の変動
時間経過での変化を加えることで,画像編集ではなく動画編集としての付加価値がある.
図 12.1 選択範囲型 カラーキー化スクリプトの起動画面
28
図 12.2 メニューウィンドウ
表 9 トラックバー
透過反転
カラーキー処理を施す箇所を反転する
R しきい値
赤色のしきい値
G しきい値
緑色のしきい値
B しきい値
青色のしきい値
メニューウィンドウでは,カラーキーによる透過範囲の反転処理の有無と,RGB しきい
値の設定が行える(図 12.2). RGB しきい値を設定することにより,指定した色からどれ
だけ類似した色をカラーキー化するか選択することができる(表 9).このスクリプトにお
けるしきい値とは,ある RGB の値を基準として,そこから±数値分の範囲を透明化するこ
とである.よって 1 と設定すれば,指定した色と全く同じ色情報を,256 と設定すれば全て
の色情報を元に透明化を行う.
図 12.3 設定ダイアログ
29
表 10 パラメータ設定
数値またはスポイトにより編集ウィンドウから色を
色
抽出可
領域サイズ
選択範囲の数値指定
範囲移動
時間による範囲移動をするかを指定
水平1
左上のアンカーポイントの x 軸移動制御情報
垂直1
左上のアンカーポイントの y 軸移動制御情報
水平2
右下のアンカーポイントの x 軸移動制御情報
垂直2
右下のアンカーポイントの y 軸移動制御情報
リアルタイムでプレビューする
リアルタイムでプレビューするかを指定
設定ダイアログでは,カラーキーの基準となる色の設定や選択範囲の移動制御を行うこ
とができる(図 12.3).色設定では,カラーキー化する基準の色を設定できる.この基準の
色情報 RGB±数値の範囲にある色が透明化される.基準となる色は,カラーコードで指定
する他に,スポイトで直接オブジェクトから抽出することも可能である.その他に,時間
経過で選択範囲を移動させる量などを設定できる.この移動は,時間移動型範囲選択スク
リプトでいう”移動なし”と同様の制御のみであり,複雑な動作はできない(表 10).
30
(1) カラーキー化について
図 13 カラーキーを施した画面
範囲選択型カラーキー化スクリプトの主な機能は,特定の範囲にカラーキー化を施すこ
とである.カラーキー化とは,特定の色情報を基準として,その色情報に類似した色を透
明化することである.例では,アジサイの画像の右半分にカラーキー化を施している.カ
ラーキー化する基準の色は,アジサイの花びらの青紫色の色情報である.これにより,画
像の右半分の青紫色に類似した色が透明化されていることがわかる(図 13).
AviUtl には,既存のカラーキーフィルタが用意されている.しかし特定の範囲だけにカ
ラーキー効果を掛けることはできないので,今回新しく作成した.カラーキーやクロマキ
ーといった境界検出により,ファジー選択の実現へと近づけると考えたからである.
31
図 14 カラーキー化範囲を反転した画面
トラックバーの透過反転を1に設定することで,選択範囲内の透明化されていなかった
部分のみ,透過処理を施す事も可能である(図 14).
(2)RGB しきい値について
RGB しきい値とは,設定した色情報を元に,どれだけの範囲に透過処理を施すかの値で
ある.透明化を行う基準の RGB 値から,しきい値をマイナスした値から,プラスした値の
範囲内に収まる色情報であれば,透過処理を行う.
例えば,設定した色情報の RGB 値(100,100,100)しきい値の RGB 値(1,1,1)であれ
ば,RGB(100,100,100,)の値に一致する色情報が透過処理される.しきい値を RGB 値
(20,50,100)に変更すると,RGB 値(100±20,100±50,100±100)の範囲が透過処理さ
れる.例では,基準の色情報 RGB 値(150,100,220)に対して,RGB 値(100,256,100)
のしきい値を設定してカラーキー化を行っている(図 13,図 14).
このスクリプトでは,選択範囲の時間移動だけでなく,しきい値を時間経過により変動
させることも可能である.
以下に,透過する基準の色情報を RGB 値(175,180,235)と設定し,しきい値を RGB 値
(100,256,0-256)とした例を示す(図 15).
32
図 15 時間によるしきい値移動の例
時間経過により青のしきい値を 0 から 256 へ変動させている為,時間経過と共に透明化
される範囲が広がるような動作をする.
33
4.4 既存の範囲選択機能との比較
作成した時間移動型範囲選択スクリプトと,AviUtl 既存の範囲選択機能について簡単
な比較をしたものを以下に示す(表 11).
表 11 範囲選択機能の比較
既存の範囲選択
作成した範囲選択
範囲指定数
4点
2点
制御方法
数値
数値・アンカーポイント
範囲反転による表示
表示されない
表示できる
時間による範囲移動
単純
複雑
(1)範囲指定数・制御方法
既存の範囲選択では,上下左右4点から切り取る範囲を数値で指定する必要があった.
その点を改良し,オブジェクトの左上と右下にアンカーポイントを設置し,その2点か
ら結ばれる四角形により簡単に範囲選択を行えるようにした.勿論,数値による範囲指
定も可能である.
(2)範囲反転による表示
既存の範囲選択では,選択範囲が交差して反転してしまった場合,画像が表示されなか
った.その点を改良し,x 軸方向の反転でも y 軸方向の反転でも画像を表示可能にした.
(3)時間による範囲移動
既存の範囲選択では,直線的な時間動作しか行えなかった.もし複雑な移動をしようと
した場合,中間点などを指定して方向が変わるごとに設定をする必要がある.そこを改
良し,少ない設定で複雑な動作を可能にした.
34
5.まとめ
今回の研究では,範囲選択スクリプトとカラーキー化スクリプトを作成できたので,それ
ぞれについてのまとめを行う.
(1)時間移動型 範囲選択スクリプト
既存では選択範囲が交差し,反転した際に描画する事のできなかったが,描画を可能に
した.これによって座標移動による描画範囲の複雑な変更を可能にし,動画編集におい
て,有用なものになった.
(2)選択範囲型 カラーキー化スクリプト
指定した色情報を基に,類似した範囲の色情報を透明化するカラーキー化スクリプトを
作成した.取得した色情報を基に,境界検出を行い,その境界の範囲内を選択できると,
類似した範囲を自動で選択するファジー選択の実現が可能だと考え,カラーキー化スク
リプトはファジー選択の実現に近づけたものといえる.
既存の範囲選択を改善し,動画編集に活かせるスクリプトとファジー選択実現の足掛か
りとなるスクリプトを作成することができた.
特定の範囲をカラーキー化するスクリプトの作成はできたので,このスクリプトに境界
を検出する機能,そして境界内の範囲を選択する機能を追加できれば,ファジー選択スク
リプトが作成できるのではないかと考えている.
トラックバーや拡張編集ウィンドウを用いて実現したかった為,スクリプト作成を選ん
だが,数値で制御できる数には制限がありでは実現できないことが多かった.プラグイン
やフィルタ作成という形にも目を向け,AviUtl におけるファジー選択の実現を目指したい.
参考文献
[1] AviUtl のお部屋
http://spring-fragrance.mints.ne.jp/aviutl
[2] AviUtl スクリプト Wiki
http://aviutlscript.wiki.fc2.com/
[3] Lua 入門講座
http://starcode.web.fc2.com/
[4]2.5. ファジー選択(魔法の杖; 自動選択)
http://docs.gimp.org/ja/gimp-tool-fuzzy-select.html
35
付録
作成した時間移動型 範囲選択スクリプトと,時間移動型 カラーキー化スクリプトのプ
ログラムを以下に示す.
A1. 時間移動型 範囲選択スクリプト
--track0:横移動量 1,-500,500,0;
--track1:縦移動量 1,-500,500,0;
--track2:横移動量 2,-500,500,0;
--track3:縦移動量 2,-500,500,0;
--dialog:座標移動/chk,local chk=0;移動係数固定/chk,local chk2=0;領域サイ
ズ,AREA={-obj.w/2,-obj.h/2,obj.w/2,obj.h/2};
--[[画像の pixel 情報を取得]]
local pxw,pxh = obj.getpixel()
--[[移動量取得]]
hori1=obj.track0
vert1=obj.track1
hori2=obj.track2
vert2=obj.track3
trans=obj.time
--[[chk2=1 なら移動係数固定]]
if chk2==1 then
trans = 1
end
--[[chk=1 なら座標計算]]
if chk==1 then
AREA[1] = AREA[1] + trans*hori1
AREA[2] = AREA[2] + trans*vert1
AREA[3] = AREA[3] + trans*hori2
AREA[4] = AREA[4] + trans*vert2
--[[chk≠1 で,座標が画像外なら修正]]
else
if (AREA[1] < -pxw/2) then
AREA[1] = -pxw/2
elseif (AREA[1] > pxw/2) then
36
AREA[1] = pxw/2
end
if (AREA[2] < -pxh/2) then
AREA[2] = -pxh/2
elseif (AREA[2] > pxh/2) then
AREA[2] = pxh/2
end
if (AREA[3] < -pxw/2) then
AREA[3] = -pxw/2
elseif (AREA[3] > pxw/2) then
AREA[3] = pxw/2
end
if (AREA[4] < -pxh/2) then
AREA[4] = -pxh/2
elseif (AREA[4] > pxh/2) then
AREA[4] = pxh/2
end
end
--[[アンカーポイントの配置]]
obj.setanchor("AREA",2)
--[[アンカーポイントの座標情報を格納]]
AREAx0,AREAy0,AREAx1,AREAy1=unpack(AREA)
--[[アンカーポイントの座標(x0,y0),(x1,y1)の中間座標を計算]]
local cx,cy=(AREAx1+AREAx0)/2,(AREAy1+AREAy0)/2
--[[描画先を仮想バッファに指定]]
obj.setoption("drawtarget","tempbuffer",math.abs(AREAx1-AREAx0),math.abs(AREAy
1-AREAy0))
--[[(-cx,-cy)の位置に描画]]
obj.draw(-cx,-cy)
--[[仮想バッファに描画したオブジェクトを描画]]
obj.load("tempbuffer")
--[[アンカーポイントと枠の頂点が一致するように処理]]
obj.cx,obj.cy=obj.cx-cx,obj.cy-cy
37
A2. 範囲選択型 カラーキー化スクリプト
--track0:透過反転,0,1,0,1.0
--track1:R しきい値,0,256,0,1.0
--track2:G しきい値,0,256,0,1.0
--track3:B しきい値,0,256,0,1.0
--dialog:色/col,local col=0xffffff;領域サイズ,pos={-obj.w/2,-obj.h/2,obj.w/2,obj.h/2};範囲移
動/chk,local chk=0;水平 1,local hori1=0;垂直 1,local vert1=0;水平 2,local hori2=0;垂直
2,local vert2=0;
local pxw,pxh = obj.getpixel()
--[[透過反転フラグ取得--]]
ST =obj.track0
--[[RGB の各閾値取得]]
Tr = obj.track1
Tg = obj.track2
Tb = obj.track3
--[[オブジェクトの描画時間を取得--]]
kk=obj.time
--[[画像外にポインタを設定した場合,ポインタ位置を修正する--]]
if (pos[1] < -pxw/2) then
pos[1] = -pxw/2
elseif (pos[1] > pxw/2) then
pos[1] = pxw/2
end
if (pos[2] < -pxh/2) then
pos[2] = -pxh/2
elseif (pos[2] > pxh/2) then
pos[2] = pxh/2
end
if (pos[3] < -pxw/2) then
pos[3] = -pxw/2
elseif (pos[3] > pxw/2) then
pos[3] = pxw/2
end
if (pos[4] < -pxh/2) then
pos[4] = -pxh/2
38
elseif (pos[4] > pxh/2) then
pos[4] = pxh/2
end
--[[範囲移動を行う場合,座標の値を変更する--]]
if chk==1 then
pos[1] = pos[1] + kk*hori1
pos[2] = pos[2] + kk*vert1
pos[3] = pos[3] + kk*hori2
pos[4] = pos[4] + kk*vert2
--[[変更後,画像範囲外になれば修正する--]]
if (pos[1] < -pxw/2) then
pos[1] = -pxw/2
elseif (pos[1] > pxw/2) then
pos[1] = pxw/2
end
if (pos[2] < -pxh/2) then
pos[2] = -pxh/2
elseif (pos[2] > pxh/2) then
pos[2] = pxh/2
end
if (pos[3] < -pxw/2) then
pos[3] = -pxw/2
elseif (pos[3] > pxw/2) then
pos[3] = pxw/2
end
if (pos[4] < -pxh/2) then
pos[4] = -pxh/2
elseif (pos[4] > pxh/2) then
pos[4] = pxh/2
end
end
--[[アンカーポイントを設定し,座標の値を格納--]]
obj.setanchor("pos",2)
posx0,posy0,posx1,posy1=unpack(pos)
--[[座標反転処理--]]
if (posx0 > posx1) then
39
posx0,posx1 = posx1,posx0
end
if (posy0 > posy1) then
posy0,posy1 = posy1,posy0
end
--[[RGB 情報を格納する配列を作成--]]
local R_data ={}
local G_data ={}
local B_data ={}
--[[配列を RGB の情報分作成--]]
pxww=pxw+1
pxhh=pxh+1
for i =1,pxww do
R_data[i] ={}
G_data[i] ={}
B_data[i] ={}
end
--[[作成した配列に RGB 情報を格納--]]
for i=1,pxww do
for j=1,pxhh do
r,g,b,a = obj.getpixel(i-1,j-1,"rgb")
R_data[i][j] = r
G_data[i][j] = g
B_data[i][j] = b
end
end
--[[col で取得した情報を RGB に合わせて格納--]]
Nr,Ng,Nb = RGB(col)
--[[整数化(切り捨て)--]]
posx0 = math.floor(posx0)
posy0 = math.floor(posy0)
--[[座標と配列の位置を合わせるための計算--]]
tt = pxw/2+posx0
yy = pxh/2+posy0
--[[カラーキー化する範囲を計算(RR:横,RR2:縦)--]]
40
RR = math.abs(posx1-posx0)
RR2 = math.abs(posy1-posy0)
--[[整数化(切り捨て)--]]
RR = math.floor(RR)
RR2 = math.floor(RR2)
--[[指定範囲のカラーキー化--]]
for i=1,RR do
for j=1,RR2 do
--[[RGB 情報を取得--]]
r,g,b,a = obj.getpixel(pxw-1,pxh-1,"rgb")
rr = R_data[i+tt][j+yy]
gg = G_data[i+tt][j+yy]
bb = B_data[i+tt][j+yy]
obj.pixeloption("type","rgb")
--[[R,G,B が閾値の範囲内ならカラーキー化--]]
if (Nr > rr-Tr) and (Nr < rr+Tr) and (Ng < gg+Tg) and (Ng > gg-Tg) and (Nb >
bb-Tb)
and (Nb < bb+Tb) then
--[[透過反転フラグが 1 なら元の色,0 なら透過--]]
if ST==1 then
obj.putpixel(i+tt-1,j+yy-1,rr,gg,bb,a)
else
obj.putpixel(i+tt-1,j+yy-1,0,0,0,0)
end
--[[閾値の範囲外で透過反転フラグが 1 なら透過,0 なら元の色--]]
else
if ST==1 then
obj.putpixel(i+tt-1,j+yy-1,0,0,0,0)
else
obj.putpixel(i+tt-1,j+yy-1,rr,gg,bb,a)
end
end
end
end
41
Fly UP