見出し画像

MATLAB/Simulinkで動画Picture In Picture


MATLAB Online で動かす場合は、
 "To Video Display" → "Video Viewer"
に変更してください。

またビデオファイル保存はできないようなので行わないようにしてください。

2022/07/28 追記



ここ数年オーディオ信号処理ばかりやっていたので、
気分転換にComputer Vision Toolboxを使ってみました。

簡単な動画のPicture In Picture(PIP)モデルを作ってみましたので、
使ったことない方向けに解説を書いてみます。

単にPIPではつまらないので、ブレンド率とオーバーレイ位置を自動で動かしています。(実用性はないですが・・)

実行結果

MATLAB/Simulinkを使うと、30分程度で作れました。

必要なのは、MATLAB、Simulink、Computer Vision Toolbox、Image Processing Toolboxかな?


では実際の作り方です。

まずMATLABのホームメニューから、新規作成→Simulink→空のモデル を作成します。

1.キャンバスの何もないところで左クリックして
"From Multimedia Files"
と入力します
最初の数文字を入れると候補が現れるのでクリックし、ブロックを配置します。

ブロックをダブルクリックして、使用したいビデオのファイル名(ソース1)を入力、
「マルチメディア出力」を「ビデオのみ」
「イメージ信号」を「1つの多次元信号」にします。

画像1

もう一つのビデオソース(ソース2 上と同じフレームレート、同じ解像度とします)も同様に設定します。
(ビデオソースは一つでも構いません)


2.また何もないところで左クリックして
"To Video Display"
と入力、ブロックを配置します。

画像2

"From Multimedia Files"と "To Video Display"のImage端子同士をマウスで繋いで「実行」をクリックすれば、ビデオが再生されるはずです。

メニューの「終了時間」は好きに設定してください。
「Inf」にすると、繰り返し再生されます。


今繋いだラインをクリックしてDeleteキーで削除します。


3."Compositing" と入力してブロックを配置します。
ダブルクリックして「不透明度係数のソース」「場所のソース」を両方とも「入力端子」にします。

画像4

2つの"From Multimedia Files"のImage出力をそれぞれ、"Compositing" の「Image1」「Image2」に繋ぎます。

画像3

4."Resize" ブロックを配置、ダブルクリックして「リサイズ係数」を「[25 25]」とします。
Resize"ブロックを、2番目の "From Multimedia Files" ブロックの「Image」出力と "Compositing" ブロックの 「Image2」入力を繋いだライン上に移動させると、自動的に挿入されます。

画像5
画像6

5.ここは飛ばしても構いません。途中のチェックです。
"Constant" ブロックを2つ配置します。
一つは「定数値」「1」、もう一つは [100 100] と入力します。
もう一つ、"Data Type Conversion" ブロックを置き、
「1」→"Data Type Conversion" ブロック→「Factor」と繋ぎ、[100 100]を「Location」に繋ぎます。

画像7

"Data Type Conversion"は、MATLABのデフォルトの型がdouble、イメージ系はsingleなのでそれを合わせるためです。「信号属性」タブの「出力データ型」で直接指定することもできます。


ここでシミュレーションメニューの「実行」をクリックすると、ソース1の左上に25%に縮小されたソース2がPIPで表示されるはずです。

画像8


6.5で配置したブロックを削除します。
PIPの、ブレンド率とブレンドする位置を自動で動かすブロックを作ります。

6-1."Probe" ブロックを配置し、「信号の次元の調査」以外のチェックを外します。
ブロックの上にマウスを持っていき、どこかのコーナーをドラッグするとサイズ変更ができますので邪魔にならない大きさにし、ソース2の出力に繋ぎます。

画像9
画像10


6-2.以下は、今まで配置したブロックと重ならない位置に配置します。

"Sine Wave" ブロックを配置し、CTR-C、CTR-Vで3個に増やします。
いずれも「振幅」「0.5」、「バイアス」「0.5」に、
「周波数」をそれぞれ、「1」、「3」、「2.5」にします。

画像11
画像12
画像13

上から順番に、ブレンド率を0~1で、位置を6:5のリサージュ関数で動かすためのものです。
本来、"Compositing" の Location は 1 以上にする必要がありますが、クリッピングしてくれるようなのでここでは 0~ のまま使っています。

6-3.以下のブロックを図のように配置・接続します。
"Data Type Conversion"
"Rate Transition"×2
"Product"×2
"Mux"
"Gain"×2  2つとも「ゲイン」を「0.75」にします。
25%に縮小した動画をPIPするので、画面からはみ出さないよう、75%の範囲で動かします。

"Demux" 「出力数」「3」にします
"Probe" ブロックの「信号の次元」出力は、画像の縦、横、プレーン枚数(RGBで3)が出てきますので、
"Demux" で最初の2つの値を取り出します。

(縦、横の順番に注意 "Compositing" ブロックでの位置指定は「横、縦」です)

"Terminator"
警告が出ないよう、使用しない出力に付けます。

画像14


6-4.6で配置したブロックのみをドラッグして選択 → 右クリック → 「選択からサブシステムを作成」とします。

分かりやすいようにブロック名"Subsystem"を、"PIP Control"とでも変えておきましょう。

これをダブルクリックして中身を開くと、このようになっているはずです。

画像15

Out1をクリック、下に表示されるブロック名をダブルクリックして、"Alpha"に、Out2を"Location"に変えておきましょう。

画像16

7.左上のタブをクリックしてメインキャンバスに戻ります。
"Alpha"を"Compositing"の"Factor"に、
"Location"を"Location"に繋いで完成です。

画像17

「実行」すると、ブレンド率を変えながら、リサージュ関数に沿って表示位置が変わって表示されます。


1回再生して止めたい場合はどちらかの "From Multimedia Files" ブロックの設定を
「ファイルから再生する回数」を「1」
「出力のファイル終端インジケータ」をチェックし、「EOF」出力に "STOP" ブロックを接続します。


出力をファイルに保存したい場合は、出力に "To Multimedia File"(Computer Vision Toolbox)を接続します。

画像18

圧縮方式等も選択できます。


ファイル書き込みのON/OFFを行いたい場合は以下のようにします。

"To Multimedia File" を選択して右クリック、サブシステム化し、
中に "Enable" ブロックを置きます。

画像19


メインに戻り、"1" と "0" の "Constant" ブロックと "Manual Switch" ブロックを配置し、図のように接続します。

画像20

スイッチをダブルクリックすると、ファイル書き込みのON/OFFが切り替わり、ONの区間だけが繋がって一つの動画ファイルとして保存されます。

Computer Vision Toolbox には、今回使った単純な "Resize" の他にも、 "Rotate" や アフィン変換できる "Warp" 等もありますので、ご興味ある方はぜひ遊んでみてください。


この記事が気に入ったらサポートをしてみませんか?