画像処理ボードVP910を使ったアプリケーション作成方法
環境 : VC++6.0 + VP910SDK(標準インストール)
コンパイル準備
- VC++6.0で、新しいプロジェクトを作成後、
@ 「ビルド」−「設定」を選択
A 「C/C++」タブの「プロジェクトオプション」に追加
/I "C:\vp910sdk\pcdrv\include"
B 「リンク」タブの「オブジェクト/ライブラリオプション」に追加
vp900cmd.lib
「プロジェクトオプション」に追加
/libpath:"C:\vp910sdk\pcdrv\lib"
VP910関数呼び出し順序
- VP910では、ボードの初期化を行う関数、ライブラリの初期化・設定を行う関数、実際の処理関数、終了処理関数の順番を守る必要があります。
MFCでは、関数実行順序がわかりにくくなっていますが、初期化関連はviewクラスのコンストラクタに、終了処理関連は同じくviewクラスのデストラクタに記述しておけば、間違いないでしょう。
初期化関連の記述 サンプル
- VP910の初期化では、ボードの認識→IPシステムの初期化→カメラ選択→カメラ解像度設定→(ついでに)VP910内画像バッファの取得を行います。
- ボード認識
- ボードの認識は、OpenIPDev関数で行います。複数枚VP910がインストールされていても対応できます。戻り値は認識したボードのID番号で、以後の関数呼び出しでは、第1引数として渡す重要な情報です。
- IPシステム初期化
- 画像処理ボード内画像処理システムの初期化を行います。ResetIPSys関数、LoadIPSys関数、BootIPSys関数、InitIP関数によって、システムのリセット→ファームウェアの読み込み→起動→初期化を行っています。
- カメラ選択
- SelectCamera関数によって、画像入力を行うカメラの端子とカメラ属性を設定します。
- カメラ解像度設定
- カメラ選択後に、SetVideoFrame関数で取り込み解像度の設定を行います。
- 画像バッファ取得
- VP910内部の画像バッファを設定、ハンドルを取得します。
カメラから取り込む画像はYUVなので、YUV用画像バッファをAllocYUVImg関数で設定します。YUVのUV成分をアクセスするためのハンドルもGetUVImgID関数で取得します。
またPC側表示用にYUV画像をRGB画像へ変換しますが、これにもRGB画像を記憶するためのバッファが必要です。AllocRGBImg関数によってバッファを設定し、GetGImgID関数とGetBImgID関数でG成分とB成分をアクセスするためのハンドルを取得します。
- ウィンドウサイズ設定
- SetAllWindow関数で、クリッピング領域の設定をします。この設定は、全ての画像処理で必要ですので、同じクリッピング領域なら最初にまとめて設定しておきます。
終了処理関連の記述 サンプル
- VP910の利用を終了するには、CloseIPDev()関数を呼びます。
実際の処理について
- ここでは、画像処理に必要なバッファ(画像ボード側)の取得、カメラでのキャプチャ、YUV→RGB変換、PCへのRGBデータ読み出し、という実際の処理手順に沿って、VP910プログラミングの解説を行います。
画像バッファの確保
- VP910では、ボード内部の画像バッファを指定して、何らかの処理を行います。従って、最初にすることは、処理に必要な大きさを持ったバッファを確保することです。バッファが正常に確保できるとイメージIDが発行され、以後画像バッファの指定にはこのイメージIDを使います。
そのアプリケーションで使用する画像バッファは、たぶん変化しないと思いますので、イメージID用変数をグローバル変数にして、初期化処理中でイメージIDを取得しておくと便利です。
- 例 1−1:YUV用画像バッファ(サイズ640×512)を取得する
- int ImgYUV;
ImgYUV = AllocYUVImg(devID, IMG_FS_640H_512V);
- 例 1−2:RGB用画像バッファ(サイズ640×512)を取得する
- int ImgRGB;
ImgRGB = AllocRGBImg(devID, IMG_FS_640H_512V);
- 例 1−3:RGB画像でGとBも見たいとき、ImgRGB(実はR)からGとBの画像バッファを調べる
- int ImgG, ImgB;
ImgG = GetGImgID(devID, ImgRGB);
ImgB = GetRImgID(devID, ImgRGB);
カメラから画像をキャプチャする
- VP910のネイティブ画像フォーマットはYUVです。キャプチャコマンドもYUVしかありません。キャプチャ後、YUVからRGBへ変換します。
YUVイメージをRGBイメージに変換する
- VP910のネイティブ画像フォーマットはYUVです。キャプチャコマンドもYUVしかありません。キャプチャ後、YUVからRGBへ変換します。
PCにRGB画像を読み出す方法
- PCにRGB画像データを読み出すには、R・G・Bそれぞれの画像バッファからデータを読み出します。PC側のRGB画像データが、
struct RGB
{
unsigned char R, G, B;
} ;
の2次元配列となっている事が多いですが、VPの関数はプレーン毎にアクセスする仕様ですので、RとGとB別々の2次元配列になっている方が、効率よくデータを転送できます。
- 例 4−1:画像ウィンドウの設定(できるだけ隅々まで扱う設定)
- SetWindow(devID, SYS_WIN, 0, 0, 639, 511);
- 例 4−2:画像データのリード(rbuf,gbuf,bbufは適当な大きさのあるPC側バッファ)
- ReadImg(devID, ImgRGB, rbuf, 640 * 512);
ReadImg(devID, ImgG, gbuf, 640 * 512);
ReadImg(devID, ImgB, bbuf, 640 * 512);
- 例 4−3:画像データのライト(rbuf,gbuf,bbufは適当な大きさのあるPC側バッファ)
- WriteImg(devID, ImgRGB, rbuf, 640 * 512);
WriteImg(devID, ImgG, gbuf, 640 * 512);
WriteImg(devID, ImgB, bbuf, 640 * 512);
以下、手順箇条書き
補足: IP5000(VP910より前のシリーズ)では、PCと画像処理ボードの間で画像データをやりとりするときには、画像バッファのオープン・クローズ処理が必要でした(VP910では不要)。オープンとクローズで、リードやライト処理を挟む形になります。互換性のために、VP910でも記述しておくと良いでしょう。
- 例 補−1:バッファオープン(要するに画像処理を中断する関数だと思います)
- OpenImg(devID, WAIT_FOREVER);
- 例 補−2:バッファクローズ
- CloseImg(devID);