struct CameraImage
{
/// Time stamp.
Time tm;
/// Image pixel width.
unsigned short width;
/// Image pixel height.
unsigned short height;
/// Bits per pixel.
unsigned short bpp;
/// Image format (e.g. bitmap, jpeg, etc.).
string format;
/// Scale factor for images, such as disparity maps,
/// where the integer pixel value should be divided
/// by this factor to get the real pixel value.
double fDiv;
/// Raw pixel data.
sequence<octet> pixels;
};
はじめに
ここでは、OpenCVライブラリをVC9にてRTコンポーネント化する手順を紹介します。
また、今回作成したRTコンポーネントと既存のコンポーネントの組み合わせにより、画像処理を行うシステムの作成方法を紹介します。
OpenCVとは
OpenCV(おーぷんしーぶい)とはインテルが開発・公開しているオープンソースのコンピュータビジョン向けライブラリです。
Wikipediaより抜粋。
作成するRTコンポーネント
OpenCVライブリのRTコンポーネント化(Flipコンポーネント)
ここでは、OpenCVライブラリのうち、画像の反転を行うcvFlip()をVC9にてRTコンポーネント化します。
以下は、作業の流れです。
cvFlip関数について
cvFlip関数は、2次元配列を垂直、水平、または両軸で反転します。
コンポーネントの概要
InPortからの入力画像を反転しOutPortから出力するコンポーネント。
反転の対象軸は、RTCのコンフィギュレーション機能を使用してflipModeという名前のパラメータで指定します。
flipModeは、反転したい方向に応じて下記のように指定してください。
作成するRTCの仕様は以下のとおりです。
※ CameraImage型は、OpenRTM-aistのInterfaceDataTypes.idlにて下記のように定義されているデータ型です。
図1は、それぞれのflipModeでの画像処理のイメージ図です。
アクティビティ処理の実装
Flipコンポーネントでは、InPortから受け取った画像を画像保存用バッファに保存し、その保存した画像をOpenCVのcvFlip()関数にて変換します。その後、変換された画像をOutPortから送信します。
onActivated(),onExecute(),onDeactivated()での処理内容を図2に示します。
onExecute()での処理を図3に示します。
OpenCV用ユーザープロパティシートのコピー
プロパティシートとは、コンパイルに必要な種々のオプション(インクルードパス、ライブラリロードバス、ライブラリ)やマクロを記述したVCの設定ファイルの一種です。 RTCBuilderやrtc-templateで生成したVC用のプロジェクトでは、VCのプロパティシートを使用して各種オプションを与えています。また、ユーザが追加でオプションを追加できるように、ユーザ定義のプロパティシートもインクルードするようになっています。以下の内容をuser_config.vspropsというファイル名で保存し、Flipフォルダにコピーしてください。
もしくは、下記よりvspropsファイルをダウンロードし、Flipフォルダに保存してください。
user_config.vsprops
※ 既にFlipフォルダにはuser_config.vspropsファイルが存在しておりますが、上書きして構いません。
copyprops.batの実行
copyprops.batというファイルを実行することで、rtm_config.vspropsというファイルがコピーされます。
rtm_config.vspropsファイルは、RTコンポーネントをVC++でビルドするために必要なインクルードパスやリンクするライブラリ等が記述されたファイルです。
ヘッダファイルの編集
ソースファイルの編集
下記のように、onActivated(),onDeactivated(),onExecute()を実装します。
Flipコンポーネントのパッケージ
実装済みのパッケージを下記からダウンロードできます。
拡張子を"zip_"としてますので、"zip"にリネームしてから解凍して下さい。
ビルドの実行
Flip_vc9.slnファイルをダブルクリックし、Visual C++ 2008を起動します。
Visual C++ 2008の起動後、図4のようにし、コンポーネントのビルドを行います。
Flipコンポーネントの動作確認
OpenrRTMに付属されているOpenCVCameraCompコンポーネントと、CameraViewerCompコンポーネント、それと、今回作成したFlipコンポーネントを接続し動作確認を行います。
NameServiceの起動
omniORBのネームサービスを起動します。
[スタート] > [すべてのプログラム(P)] > [OpenRTM-aist] > [C++] > [tools] の順に辿り、「Start Naming Service」をクリックして下さい。
※ 「Star Naming Service」をクリックしてもomniNamesが起動されない場合は、フルコンピュータ名が14文字以内に設定されているかを確認してください。
rtc.confの作成
RTコンポーネントでは、ネームサーバーのアドレスやネームサーバーへの登録フォーマットなどの情報をrtc.confというファイルで指定する必要があります。
下記の内容をrtc.confというファイル名で保存し、Flip\FlipComp\Debug(もしくは、Release)フォルダに置いて下さい。
※ Eclipse起動時にworkspaceをデフォルトのままにしていた場合、Flipフォルダのパスは、
C:\Documents and Settings\<ログインユーザー名>\workspace となります。
Flipコンポーネントの起動
Flipコンポーネントを起動します。
先程rtc.confファイルを置いたフォルダにある、FlipComp.exeファイルを実行して下さい。
OpenCVCameraComp,CameraViewerCompコンポーネントの起動
USBカメラのキャプチャ画像をOutPortから出力するOpenCVCameraCompコンポーネントと、InPortで受け取った画像を画面に表示するCameraViewerCompコンポーネントを起動します。
これら2つのコンポーネントは、下記の手順にて起動できます。
[スタート] > [すべてのプログラム(P)] > [OpenRTM-aist] > [C++] > [components] > [opencv-rtsc] の順に辿り、「OpenCVCameraComp」と「CameraViewerComp」をそれぞれクリックして実行します。
コンポーネントの接続
図5のように、RTSystemEditorにてOpenCVCameraComp,Flip,CameraViewerCompコンポーネントを接続します。
コンポーネントのActivate
RTSystemEditorの上部にあります「ALL」というアイコンをクリックし、全てのコンポーネントをアクティベートします。
正常にアクティベートされた場合、図6のように黄緑色でコンポーネントが表示されます。
動作確認
図7のようにコンフィギュレーションビューにてコンフィギュレーションを変更することができます。
Flipコンポーネントのコンフィギュレーションパラメータ「flipMode」を「0」や「-1」などに変更し、画像の反転が行われるかを確認して下さい。
異なるPC間で動作するRTCの接続
異なるPC間で動作するRTコンポーネントを接続します。
rtc.confの編集
使用しているPCにネットワークインターフェースが複数存在する場合、以下のように"corba.endpoints" を設定して下さい。
コンポーネントの起動
CameraViewerCompコンポーネントを起動してください。
[スタート] > [すべてのプログラム(P)] > [OpenRTM-aist] > [C++] > [components] > [opencv-rtsc] とたどり、"CameraViewerComp.exe"をクリックします。
異なるPC上で起動されているネームサーバーへの接続
図8の上部にあるコンセントマークのボタンを押下し、図9のダイアログにて異なるPCのIPアドレスを入力します。
コンポーネントの接続
異なるPC上のネームサーバーに登録されているOpenCVCameraCompコンポーネントと、localhostネームサーバー上 に登録されているCameraViewerCompコンポーネントをシステムエディタ上にドラッグ&ドロップします。
次にOpenCVCameraCompのOutPortとCameraViewerCompのInPortを図10のように接続します。
コンポーネントのアクティベート
図11のように、CameraViewerCompを右クリックし、"Activate"をクリックします。
CameraViewerCompコンポーネントの画面上に画像が表示されれば成功です。
Flipコンポーネントのソース・ヘッダファイル
Flipコンポーネントのソースファイル
Flipコンポーネントのヘッダファイル