OpenRTM探訪: OpenRTM-aistを使ってみる。
皆さんこんにちは。矢口です。
前回はインストールまでしたので、今日は実際にコンポーネントを繋いで遊んでみようと思います。サンプルの中にどんなコンポーネントがあるのかを確かめながら、進めてみたいと思います。
先ずは[すべてのプログラム]→[OpenRTM-aist 1.1]→[C++]と開きますと、その下に[Components]というフォルダがあります。その中に、[Examples]と[OpenCV-rtvs]というフォルダがあり、それぞれ、Console I/O系のサンプルコンポーネント群と、OpenCV利用のサンプルコンポーネント群が含まれています。
実際には、種々のサンプルの使い方が公式Webページの [OpenRTM付属のサンプルについて | OpenRTM-aist] に掲載されているのですが、若干場所が見難いところにありますので、こちらからリンクしておきます。
掲載されているコンポーネントをリストで表示してみますと
[Examples]
- Composite.exe - 複数のコンポーネントをひとつの実行ファイルに統合したサンプル。メインはPeriodicECSharedCompositだが、これの内部はController, Motor, Sensorの構成をひとつに纏めたものである。
- ConfigSampleComp.exe - Configurationのサンプル。RtcLinkからConfigurationを変更してConfigurationの挙動を理解するためのサンプル。
- ConsoleInComp.exe - Simple I/Oのためのサンプル。コンソールから入力された数値をOutPortから出力。基本的にはConsoleOutComp.exeに接続する。実際にはTimedLongの値が送出される。
- ConsoleOutComp.exe - Simple I/Oのためのサンプル。TimedLongの値を受けて、コンソールに出力する。
- MyServiceConsumerComp.exe - MyService型のサービスを提供するコンポーネント。MyServiceProviderComp.exeと接続し、Providerに対してコンソールから指示を行う。
- MyServiceProviderComp.exe - MyService型のサービスを提供するコンポーネント。MyServiceConsumerComp.exeと接続し、Consumerからの指示を受けて当該するデータを送出するコンポーネント。
- SeqInComp.exe - ランダムな数値 (Short, Long, Float, Doubleとそのシーケンス型)を出力するコンポーネント。SequenceをInするコンポーネントなので、こちらは受け取り側でデータを受け取って出力する。
- SeqOutComp.exe -SeqInComp.exeのInPortに入力される数値をOutPortから送出するコンポーネント。
[OpenCV-rtvs]
- AffineComp.exe - Configuration中に書かれるAffine Matrixによって画像を変形するコンポーネント。InPortはCameraImage, OutportはAffine Matrixで変形したCameraImage.
- BackGroundSubtractionSimpleComp.exe - 背景色を切り出して前景(対象物体)のみを抽出するためのコンポーネント。InPort1で元画像を受け, InPort2で切り抜く背景色をTimedLongで受ける。OutPort1が元画像の出力, OutPort2が前景画像, OutPOrt3が背景画像を出力する。
- BinarizationComp.exe -
- CameraViewerComp.exe - OpenCVのHighgui機能を用いてUSBカメラ等からの画像をWindowに出力するためのコンポーネント。InPortは出力のためのCameraImage, OutPort1はキーボードイベント, OutPort2はマウスイベント, OutPort2,3はそれぞれマウスのX座標及びY座標の値をTimedLongで送出する。
- ChromakeyComp.exe
- DilationErosionComp.exe
- DirectShowCamComp.exe - DirectShowを用いてUSBカメラから入力するためのコンポーネント。OutPortはUSBカメラからの画像をCameraImageで出力。なお、なぜか今回の実装ではDirectShowCamCompでは上下反転される。
- EdgeComp.exe
- FindcontourComp.exe
- FlipComp.exe - Configuration Set中のflip_modeの値に応じて、縦・横・斜め方向の画像反転を行う。InPortが元画像のCameraImageでの入力, OutPortが反転後の結果画像をCameraImageで出力する。
- HistogramComp.exe - 入力された画像の白黒の値からヒストグラムを生成。InPortは元画像, OutPort1はグレースケール画像, OutPort2はヒストグラム画像をそれぞれCameraImageで入出力する。なお、鏡像ではないため、撮像されたものを右に動かすと映像中では左に動く。
- HoughComp.exe
- ImageCalibrationComp.exe
- ImageSubtractionComp.exe
- ObjectTrackingComp.exe
- OpenCVCameraComp.exe - OpenCVで生成されるUSBカメラ等からの映像入力を扱うコンポーネント。DirectShowの方が高速だが、DirectShowが使えない場合もこちらは扱える可能性あり。OutPortはUSBカメラ等からのCameraImageを出力。
- PerspectiveComp.exe
- RockPaperScissorsComp.exe
- RotateComp.exe
- ScaleComp.exe
- SepiaComp.exe
- SubtractCaptureImageComp.exe
- TemplateComp.exe
- TranslateComp.exe
さて、簡単に、色々と繋いで見たいと思います。今回は、入力画像を鏡像化し、じゃんけんの手の形状を認識したいと思います。
まず、Toolsから、[Start Naming Service] を立ち上げてORBサーバを立ち上げます。また、[RTSystemEditor] を立ち上げて、Editできるようにします。
そして、今回は [Components]→[OpenCV-rtvs]の中にある、
- OpenCVCameraComp.exe
- FlipComp.exe
- RockPaperScissorsComp.exe
- CameraViewerComp.exe
をそれぞれ立ち上げます。その後、RT System Editor画面内の左側にあるName Service Viewと書かれているところに、[ >localhost]と小さく白いウインドウに書かれているところを開いていくと、最下層にそれぞれ4つのコンポーネントが登録されていることを確認出来ます。
次に、左上のところにある[ON]と書いてある青色のアイコンをクリックすると、コンポーネントを並べることの出来るフィールドが中央に表示されます。
ここに、それぞれのコンポーネントを並べ、次のように線で繋ぎます。
その後、このSystem Diagramウインドウが出ている時に、上部に出てくる緑色の▼ボタンを押すと、実行され、Windowが表示されて、認識が出来るようになります。背景に引きずられますので、出来るだけ白い背景の手前で、手首だけ黄色で表示されるような形でやると、認識が成功すると思います。
このとき、RockPaperScissorsComp.exeで開いているWindowには、認識結果が表示されますので、確認してみてください。
このような形で、コンポーネントを簡単に組み合わせて、画像認識アプリケーションが出来る、と言うことだそうです。
次回は、これらのコンポーネントを作ることを考えてみたいと思います。コンポーネント作成のための準備をメインに記事にしていきたいと思います。