Creating RTCs using OpenCV C++ for Ubuntu
Ubuntu OS上のOpenRTM-aist C++版でOpenCV(C++)を使用したRTコンポーネントを作成する方法を解説します。
▶ 更新履歴
-
25/11/2013 Makefileの23行目を誤記していたので修正しました。
1. はじめに
Webカメラの画像を取得し、表示するRTC「WebCam」を作成しながら、OpenCVを使ったRTCの作成方法を学びます。
それでは早速、RTコンポーネントを作成してみましょう。
4. おわりに
これでOpenRTM-aist C++版でOpenCV(C++)を使用したRTCを作成することができるようになりました。
今回作成したのは、OpenCVでWebカメラを使う場合のテンプレートになるものです。
ここで取得した画像に処理を追加することで、ロボットビジョンRTCを作ることができます。
これを参考に自分のRTCをどんどん作成してみて下さい。
2. コーディング
まずはWebCamのテンプレートを生成しましょう。
テンプレートの生成には、RTミドルウェアの統合開発環境環境であるOpenRTPを使用します。
WebCamのテンプレートの設定は以下のようになります。
今回いは純粋にOpenCVをRTCに組み込む方法を学ぶためにデータポートは設定しません。
-
モジュール名 WebCam
-
ベンダ名 あなたの名前
-
モジュールカテゴリ TEST
-
実行周期 30
-
アクションコールバック
onInitialize
onActivated
onDeactivated
onExecute
-
言語
C++
use old build environment.
今回はuse old build environment.にチェックを入れます。
これで生成されるテンプレートにはCMakeはなく、直接Makefile.WebCamが生成されます。
Makefile.WebCamを開いて、OpenCVのヘッダファイルとライブラリを指定します。
以下のように、Makefile.WebCamに赤太文字で示しコードを追記して下さい。
追記した記述は他のOpenCVを使用したRTCに共通して使用できます。
-
#include "WebCam.h"
-
-
// OpenCV
-
#include <opencv2/core/core.hpp>
-
#include <opencv2/highgui/highgui.hpp>
-
-
#define WIDTH 640
-
#define HEIGHT 480
-
-
cv::VideoCapture cap;
-
-
RTC::ReturnCode_t WebCam::onInitialize()
-
{
-
std::cout << "WebCamComp" << std::endl;
-
-
cap = cv::VideoCapture(0);
-
cap.set(CV_CAP_PROP_FRAME_WIDTH, WIDTH);
-
cap.set(CV_CAP_PROP_FRAME_HEIGHT, HEIGHT);
-
-
if(!cap.isOpened())
-
{
-
return RTC::RTC_ERROR;
-
}
-
-
return RTC::RTC_OK;
-
}
-
-
RTC::ReturnCode_t WebCam::onActivated(RTC::UniqueId ec_id)
-
{
-
std::cout << "CreateWindow" << std::endl;
-
cv::namedWindow("Capture", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
-
-
return RTC::RTC_OK;
-
}
-
-
RTC::ReturnCode_t WebCam::onDeactivated(RTC::UniqueId ec_id)
-
{
-
std::cout << "DestroyWindow" << std::endl;
-
cv::destroyWindow("Capture");
-
-
return RTC::RTC_OK;
-
}
-
-
RTC::ReturnCode_t WebCam::onExecute(RTC::UniqueId ec_id)
-
{
-
cv::Mat frame;
-
cap >> frame;
-
-
cv::imshow("Capture", frame);
-
cv::waitKey(1);
-
-
return RTC::RTC_OK;
-
}
コードの解説を行います。
-
4-5行目
OpenCVのヘッダファイルをインクルードします。
-
7-8行目
キャプチャする画面サイズをデファインします。使用するWebカメラに合わせて設定して下さい。
-
10行目
VideoCaptureクラスをグローバルで定義します。
-
14-18行目
VideoCaptureクラスのコンストラクタ(初期化処理)を呼びます。
その後、画像のサイズを設定します。
-
20-23行目
カメラが接続できるか確認し、接続できない場合はエラーを返します。
-
30-31行目
Active状態のときに、Webカメラでキャプチャした画像を表示するウィンドウを生成します。
-
38-39行目
InActive状態のときに、ウィンドウを破棄します。
-
48-47行目
Mat型と呼ばれる行列を扱えるデータ型の変数frameを用意します。
このframeにWebカメラから取得した画像を格納します。
-
49-50行目
格納した画像を指定したウィンドウに表示しています。
次にcv:waitKey()で1 msの間、キー入力を待ちます。
この処理は不要に思えますが、cv::waitKey()を行わないとウィンドウに画像を表示することはできないので注意して下さい。
コードが入力し終わったら、makeを行ってください。
~/workspace/WebCamにある「WebCam.conf」と「rtc.conf」を、実行ファイルがある~/workspace/WebCam/build/srcにコピーして下さい。
3. 動作確認
ネーミングサービスの起動後、生成されたWebCamCompを実行して下さい。


-
CXXFLAGS = `rtm-config --cflags` -I.
-
CXXFLAGSCV = `pkg-config opencv --cflags` -I.
-
LDFLAGS = `rtm-config --libs`
-
LDFLAGSCV = `pkg-config opencv --libs`
-
SHFLAGS = -shared
-
-
IDLC = `rtm-config --idlc`
-
IDLFLAGS = `rtm-config --idlflags` -I`rtm-config --prefix`/include/rtm/idl
-
WRAPPER = rtm-skelwrapper
-
WRAPPER_FLAGS = --include-dir="" --skel-suffix=Skel --stub-suffix=Stub
-
-
SKEL_OBJ =
-
STUB_OBJ =
-
IMPL_OBJ =
-
OBJS = WebCam.o $(SKEL_OBJ) $(STUB_OBJ) $(IMPL_OBJ)
-
-
.SUFFIXES : .so
-
-
all: WebCam.so WebCamComp
-
-
.cpp.o:
-
rm -f $@
-
$(CXX) $(CXXFLAGS) $(CXXFLAGSCV) -c -o $@ $<
-
-
.o.so:
-
rm -f $@
-
$(CXX) $(SHFLAGS) -o $@ $(OBJS) $(LDFLAGS) $(LDFLAGSCV)
-
-
WebCamComp: WebCamComp.o $(OBJS)
-
$(CXX) -o $@ $(OBJS) WebCamComp.o $(LDFLAGS) $(LDFLAGSCV)
追加部分を解説します。
-
2行目
OpenCVのヘッダファイルのインストール先を指定します。
-
4行目
OpenCVのライブラリと依存ファイルを指定します。
-
15行目
VideoCaptureクラスをグローバルで定義します。
-
23行目
CXXFLAGSCVを追加します。
-
27・30行目
LDFLAGSCVを追加します。
Makefile.WebCamの入力し終わったら、以下のコードをWebCam.cppに記入してください。
$ make -f Makefile.WebCam
$ ./WebCamComp
RT System Editorを使用して、RTCをActive化しWebカメラの画像が表示されることを確認して下さい。
また、Inactive化したときにウィンドウが破棄されることも確認してください。