cvFlip関数について

OpenCVライブリのRTコンポーネント化(Flipコンポーネント)

ここでは、OpenCVライブラリのうち、画像の反転を行うcvFlip()をVC9にてRTコンポーネント化します。

以下は、作業の流れです。

  • cvFlip関数について
  • コンポーネントの概要
  • 動作環境・開発環境
  • Flipコンポーネントの雛型の生成
  • アクティビティ処理の実装
  • コンポーネントの動作確認

cvFlip関数について

cvFlip関数は、2次元配列を垂直、水平、または両軸で反転します。

 void cvFlip(IplImage* src, IplImage* dst=NULL, int flip_mode=0);
 #define cvMirror cvFlip
  
 src       入力配列
 dst       出力配列。もしdst=NULLであれば、srcが上書きされます。
 flip_mode 配列の反転方法の指定内容:
  flip_mode = 0: X軸周りでの反転(上下反転)
  flip_mode > 0: Y軸周りでの反転(左右反転)
  flip_mode < 0: 両軸周りでの反転(上下左右反転)

コンポーネントの概要

InPortからの入力画像を反転しOutPortから出力するコンポーネント。
反転の対象軸は、RTCのコンフィギュレーション機能を使用してflip_modeという名前のパラメータで指定します。

flip_modeは、反転したい方向に応じて下記のように指定してください。

  • 上下反転したい場合、0
  • 左右反転したい場合、1
  • 上下左右反転したい場合、-1


作成するRTCの仕様は以下のとおりです。

  • InPort
    • キャプチャされた画像データ(TimedOctetSeq)
  • OutPort
    • 反転した画像データ(TimedOctetSeq)
  • Configuration
    • 反転方法の指定(int)

※ TimedOctetSeq型は、OpenRTM-aistのBasicDataType.idlにて下記のように定義されているデータ型です。

※ octet型とは、CORBA IDLの基本型で、転送時にいかなるデータ変換も施されないことが保証されている8ビット値です。

   struct Time
  {
        unsigned long sec;    // sec
        unsigned long nsec;   // nano sec
  };
 
   struct TimedOctetSeq
  {
        Time tm;
        sequence<octet> data;
  };


図1は、それぞれのflip_modeでの画像処理のイメージ図です。


cvFlip_and_FlipRTC.png
図1. Flipコンポーネントのflip_modeの指定パターン


動作環境・開発環境

  • 解凍ツール(Lhaplus)
http://www.forest.impress.co.jp/lib/arc/archive/archiver/lhaplus.html

Flipコンポーネントの雛型の生成

Flipコンポーネントの雛型の生成は、RTCBuilderを用いて行います。

RTCBuilderの起動

新規ワークスペースを指定してeclipseを起動すると、以下のようなWelcomeページが表示されます。

fig1-1EclipseInit.png
図2. Eclipseの初期起動時の画面


このWelcomeページを左上の「X」により閉じると以下のページが表示されます。

fig2-2PerspectiveSwitch.png
図3. パースペクティブの切り替え


右上の「Open Perspective」ボタンを押下し、プルダウンの「Other…」ボタンを押下します。

fig2-3PerspectiveSelection.png
図4. パースペクティブの選択


「RTC Builder」を選択することで、RTCBuilderが起動します。

fig2-4RTCBuilderInit.png
図5. RTC Builderの初期起動時画面


RTCBuilder 用プロジェクトの作成

まず最初に,RT コンポーネントを作成するための Eclipse プロジェクトを作成します。 画面上部のメニューから[ファイル]-[新規]-[プロジェクト]を選択します。

fig2-5CreateProject.png
図6. RTC Builder 用プロジェクトの作成 1


表示された「新規プロジェクト」画面において,「その他」-「 RTC ビルダ」を選択し、「次へ」をクリック.

fig2-6CreateProject2.png
図7. RTC Builder 用プロジェクトの作成 2


「プロジェクト名」欄に作成するプロジェクト名を入力して「終了」をクリック。

fig2-7CreteProject3.png
図8. RTC Builder 用プロジェクトの作成 3


指定した名称のプロジェクトが生成され、パッケージエクスプローラ内に追加されます。

fig2-8CreateProject4.png
図9. RTC Builder 用プロジェクトの作成 4


生成したプロジェクト内には、デフォルト値が設定された RTC プロファイル XML(RTC.xml) が自動的に生成されます。

RTC プロファイルエディタの起動

RTC プロファイルエディタを開くには、ツールバーの「 Open New RtcBuilder Editor 」ボタンを押下するか、メニューバーの [file]-[Open New Builder Editor] を選択します。

fig2-9ToolsBarOpenNewRtcBuilder.png
図10. ツールバーから Open New RtcBuilder Editor



fig2-10FileMenuOpenNewBuilder.png
図11. File メニューから Open New Builder Editor


データポートで使用するデータタイプ定義ファイルの在り処の設定

データポートやサービスポートで使用するデータ型が定義されたIDLファイルが置いてある場所を予め設定しておく必要があります。
※ ここでの設定内容は、ワークスペースを変更しない限り有効ですので、プロジェクト毎に設定する必要はありません。
下記の手順にて、データ型が定義されているIDLファイルの在り処を設定して下さい。

 1. メニューバーの「ウィンドウ(W)」 > 「設定(P)...」と辿り、設定ダイアログを表示させます。
 2. [RtcBuilder] > [Data Type]の順に辿り、図12のData Type入力画面を出します。
 3. Data Type入力画面の[Add]ボタンをクリックし、"IDL File Directories"を入力します。
     OpenRTM-aistで定義されているデータ型のIDLファイルはデフォルトでは下記にインストールされます。
     
      C:\Program Files\OpenRTM-aist\1.0\rtm\idl
 
 4. [OK]ボタンをクリックし、設定を終了します。


RTCBuilder_datatype_setup.png
図12. データ型定義ファイルの在り処設定


コンポーネントのプロファイル情報入力とコードの生成

1. 「基本」タブを選択し、基本情報を入力します。


  • Module name: Flip
  • Module description: Flip image component
  • Module version: 1.0.0
  • Module vender: AIST
  • Module category: Category
  • Component type: STATIC
  • Component's activity type: PERIODIC
  • Component kind: DataFlowComponent
  • Number of maximum instance: 1
  • Execution type: PeriodicExecutionContext
  • Execution Rate: 1.0
  • Output Project: Flip


RTCBuilder_base.png
図13. 基本情報の入力


2. 「アクティビティ」タブを選択し、使用するアクションコールバックを指定します。

Flipコンポーネントでは、onActivated(),onDeactivated(),onExecute()コールバックを使用しますので、 図14のようにon_activated,on_deactivated,on_executeの3つにチェックを入れます。


RTCBuilder_activity.png
図14. アクティビティコールバックの選択


3. 「データポート」タブを選択し、データポートの情報を入力します。


  • InPort Profile:
    • Port Name: original_image
    • Data Type: TimedOctetSeq
    • Var Name: image_orig
    • Disp. Position: left
  • OutPort Profile:
    • Port Name: fliped_image
    • Data Type: TimedOctetSeq
    • Var Name: image_flip
    • Disp. Position: right


RTCBuilder_dataport.png
図15. データポート情報の入力


4. 「コンフィギュレーション」タブを選択し、Configurationの変数を入力します。


  • flip_mode
    • Name: flip_mode
    • TYpe: int
    • Default Value: 1
    • 変数名: flip_mode

  • image_height
    • Name: image_height
    • TYpe: int
    • Default Value: 240
    • 変数名: img_height

  • image_width
    • Name: image_width
    • TYpe: int
    • Default Value: 320
    • 変数名: img_width


RTCBuilder_config.png
図16. コンフィグレーション情報の入力


5. 「言語・環境」タブを選択し、プログラミング言語を選択します。

今回は、C++(言語)を選択します。


RTCBuilder_lang.png
図17. プログラミング言語の選択


6. 「基本」タブにある"コード生成"ボタンをクリックし、コンポーネントの雛型を生成します。


RTCBuilder_base.png
図18. 雛型の生成(Generate)


※ 生成されるコード群は、eclipse起動時に指定したワークスペースフォルダの中に生成されます。現在のワークスペースは、「ファイル(F)」 > 「ワークスペースの切り替え(W)...」で確認することができます。

ダウンロード

最新バージョン : 2.0.1-RELESE

統計

Webサイト統計
ユーザ数:2195
プロジェクト統計
RTコンポーネント307
RTミドルウエア35
ツール22
文書・仕様書2

Choreonoid

モーションエディタ/シミュレータ

OpenHRP3

動力学シミュレータ

OpenRTP

統合開発プラットフォーム

産総研RTC集

産総研が提供するRTC集

TORK

東京オープンソースロボティクス協会

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク