さて、前回は…
パソコンに繋がれている全てのビデオデバイス、オーディオデバイスを列挙し
それらデバイスのストリーム設定を選んで
同時に複数のストリームをキャプチャ、プレビューする WPF アプリを作りました。
カメラ画像はそのまま表示し
距離画像は値を変換して画像表示し
オーディオは波形を表示し
これを WPF の データテンプレートを使って実現しました。
今回はプラグイン拡張というものを行ってみたいと思います。
C# にはリフレクションがあります。
外部クラスライブラリファイルを解析して、そこに書かれている
インスタンスを生成したり、メソッドを呼び出したりできます。
さっそく試してみましょう。
まず、次のクラスライブラリを作成します。
そして、あるCUIアプリケーションのフォルダに Plugins を切って、配置します。
そして、そのあるCUIアプリのコードは次のとおりです。
このアプリを実行すると次の結果を得ます。
メソッド呼び出しのパフォーマンスは若干落ちますが、Delegete を介しているので、そんなにひどいことにはならないはずです。
直接 MethodInfo から Invoke しても同じ結果を得ますが、とても時間がかかるので
引数が不定の場合だけにした方が良いと思います。
この仕組みを使えば、後から機能を拡張するというプラグイン拡張ができます。
ユーザーが自分のやりたいように処理を入れられるということです。
ところで、このクラスライブラリをデバッグするにはどうしたら良いのでしょうか?
残念ながらリフレクションを使うとデバッグできません。
そういうときは、クラスライブラリとして参照し、次のように実際に呼び出して確認します。
ん?ではやっぱりツールを公開した後、ユーザーが実際にプラグインを開発しようとした時にデバッグできずに困るのでは?
アタッチしてコードの中まで入れました。
ステップ実行もできます。
と、いうことでプラグイン開発もデバッグしながら行えることを確認しました。
プラグイン開発者はプラグインを使用するツールを起動した後、これを Visual Studio からアタッチし
.pdb ファイルが示すソースコードの中に入ってステップ実行、パラメータの確認などが行えるので問題は無いですね。
具体的には
プラグイン開発者は、クラスライブラリのプロパティより、「外部プロジェクトの開始」パスに
ツールの実行ファイルパスを指定してデバッグすれば、問題なくデバッグできます。
では波形を short 配列(PCM 16bit) or float 配列(IEEE float 32bit)で受け取るプラグインを作成し
高速フーリエ変換を行って波数の変動成分の大きさを求め、スペクトル画像を作成してみたいと思います。
プラグインの概形はここまで示したとおり、アプリケーションフォルダに Plugins を掘って
ひとまず PCM short 配列を入力に同じ大きさの short 配列を返す関数を用意したいと思います。
最初はデバッグ目的のため同じ値を返すだけとします。
フーリエ級数展開、フーリエ変換とはなにか?離散フーリエ変換(DFT)や高速フーリエ変換(FFT)アルゴリズムについて
ネットで調べると情報がたくさん手に入ります。
また理系の大学出身の方であれば1年次後期、2年次前期あたりで応用数学として学んでいると思います。
当時の教科書やノート、プリントを見なおせば早く思い出せるでしょう。(ノートがない?それは損してますよ…)
さて、フーリエ変換がわかり、FFTアルゴリズムを書けるようになったところで
次のように FFT プログラムを作成します。
このプログラムを実行した結果は次のとおり
さすが FFT ですね、4チャンネル同時にリアルタイム解析しても動作しました。
正しく求められているか心配だったので Excel のデータ解析と比較してみました。
解析対象の波形がこちら
解析結果の比較画像がこちら
やりました、正しくフーリエ解析できているようです。
今回はプラグインが自分でウィンドウを表示し、そこに結果を描画するという形式で作成しました。
WPFウィンドウを表示するクラスライブラリを作るには、まずWPFアプリとして作り
プロパティよりクラスライブラリに変更し、ビルドを妨げるファイルをビルドから除外する必要があります。
CREATIVE カメラを使って指先認識を行うための、下しらべがおおむね完了しました。
次回からはいよいよ距離画像に触れます。
お楽しみに!
2014/05/18 初記。
2014/06/03 更新。