2.4 連続処理〜スレッドを使ってウィンドウプログラミングから解放されよう

 

 前節のように、VideoForWindowsのAVI系API関数を使えば動画から1枚ごとのフレームが解凍されたピクセルデータとして取り出せることがわかりました。動画を使った計測を行うのであれば、この解凍作業をループをつかって各フレームについて連続的に行い、

計測として必要な画像に対する特徴抽出などの計算を行えばよいことになります。

ところが、各フレームのモニタを行うなどウィンドウを扱う部分も処理に併設しようとするとウィンドウのメッセージループと処理ループとを両立させないといけないという問題が生じます。この問題を解決する1つの方法がメッセージループ処理のスレッドを設ける方法です。

 リスト4は連続処理例として各フレームの平均明度と隣り合うフレーム間の明度変化を計算します。計算だけならmain()でフレームのループを作ってフレーム毎に計算するだけですみますが、リスト4では処理対象フレームのモニタも可能にしています。

 リスト4は最初にモニタウィンドウ用のスレッドを起動して、そのスレッドでモニタウィンドウのためのメッセージを処理します。また、リスト4では画像の計算処理にAVIファイルハンドルは直接必要ありませんから、「AVIファイルのオープン」→「ストリームのオープン」を1度に行うAVIStreamOpenFromFile()を使ってストリームハンドルを得ます。

 図12に連続計算処理中の様子、図13に計算結果をExcelでグラフにしたものを示します。計算対象はミュージックビデオクリップの一部ですが、カットが変わるところで明度変化が大きくなるなどの特徴が見られます。

 

リスト4 スレッドを使った動画の連続処理(list4.cpp)

 

図12 リスト4の実行画面(zu12_l4.bmp)

 

 

 

図13 リスト4の計算結果のグラフ:

計算対象は「スピード」の

ビデオクリップ「プレシャスタイム」

の前半   (zu13_gr.bmp)

パソコンによる動画計測とその周辺 / 1.動画処理のための準備 / VFWく
VFW,プログラム2