はじめに〜Windowsで画像処理

むか〜し,むか〜し.Windowsでリアルタイム画像処理を試みた.若者がおったとさ.彼は,自分の風化していく記憶を残すため,思い出しながら,この文書を書き残そうと決めたとさ.

リアルタイム画像処理

一昔前まで,コンピュータにカメラをつなき,それをリアルタイムで画像を処理するのは,1千万近くするようなSGIのワークステーションくらいしかできなかった.しかし,ここ数年で普通のマシンとUSBカメラがあればできるようになってしまった.しかもOSは,Windowsでできてしまうのである.ここでは,WindowsマシンでUSBカメラを使い,USBカメラから映像をキャプチャし,フレームを取り出し,それを1フレームずつC/C++で画像処理をするプログラミングのための土台作りを説明する.カメラから画像を取得し,画像を処理するための手段として,ここでは,二つの手段について説明する.OpenCVとDirectXである.
 

OpenCVについて

OpenCVは,Intelが開発した画像処理用のライブラリである.顔認識や特徴量抽出などの関数が用意されており,簡単かつ単純な処理なほとんどプログラムすることなく実現することができる.
OpenCVの売りは,プログラミングの簡単さである.Windowsのアプリケーションをプログラミングするために必要な画像をウィンドウにコピーしたり,画像を直接読み取るといった関数もほとんど用意されており,関数を呼び出すだけで処理を行うことができる.そこに自作の画像処理関数を加えていくことで,アプリケーションを構築することができる.
実はこのOpenCVのUSBカメラからのキャプチャ部分は後述するDirectShowのフィルタなのである.つまりOpenCVのキャプチャ部分はOpenCVのラッパーと言い換えることもできる.ここで問題となってくるのが,処理速度である.OpenCVのラッパーということになれば,それだけ,余計な処理を行わねばならないことに他ならず,高速な動作を期待することはできない.しかし,ラッパーだけあって,後述のDirectShowフィルタ等と比較するとプログラミングは簡単に行うことができる. とにかく,一度画像処理をやってみたいということならば,このOpenCVを使うことをおすすめする.ここでは,OpenCVのカメラからのキャプチャと基本的な画像処理のための基本部分だけを説明する.

DirectShowについて

DirectShowは,DirectXのサブセット?である.DirectGraphics等と連携させたプログラミングを行うことができたり,動画をテクスチャとして貼り付けるなどのプログラミングを行うことができる.DirectShowは,フィルタと呼ばれる画像を扱うためのオブジェクトを連結していくことで,プログラミング,アプリケーションの構築を行うことができる.しかも,この操作は,プログラム上だけではなく,GUIツールのGraphEditと呼ばれるアプリケーションを用いても行うことができ,非常にインタラクティブに一連の作業を行うことができるという特徴を備える.
ここまで書くといいことづくめに見えるDirectShowであるが,重大な問題点がある.プログラミングの煩雑さである.これは,Microsoftが提唱するCOMプログラミングに乗っ取ってプログラミングしなければならないことと,資料が圧倒的に少ないことに起因する(実はOpenCVも少ないが).しかも,ActiveX?のようにWindowsのレジストリに登録して,使用せねばならず,普通のプログラミングスタイルと比較すると,複雑になりがちである.
こういった問題も解決するための労苦をも無視できる価値がある.処理速度の速さである.DirectShowでは,VRAM等のバッファをそのまま扱うことができる.処理した画像データをハードウェアアクセラレーションを用いて,画面上に転送することが可能であるため,かなり高速に種々の操作を行うことができる.複雑な画像処理をなるべく高いフレームレートで行うのに適している.
また,ファイルへ動画ファイルとして書き出すといった処理を行うフィルタも初めから用意されているため,アプリケーションを作るに当たっても便利である.ここでは,画像を処理するためのフィルタの自作,フィルタを使ったアプリケーションの制作方法について説明する.