Creating RTCs using OpenCV C++ for Windows
Windows OS上のOpenRTM-aist C++版でOpenCV(C++)を使用したRTコンポーネントを作成する方法を解説します。
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++
テンプレートを生成したらCMakeを行い、ソリューションファイルを生成して下さい。
ソリューションを開いたら、以下の2つのプロジェクトにOpenCVをビルドするための、
追加のインクルード ディレクトリと追加のライブラリ ディレクトリ、追加の依存ファイルを設定して下さい。
-
WebCamプロジェクト
-
WebCamCompプロジェクト
追加の依存ファイルは、今回も以下の2つになります。
-
ソリューションの構成がDebugの場合
opencv_core246d.lib
opencv_highgui246d.lib
-
ソリューションの構成がReleaseの場合
opencv_core246.lib
opencv_highgui246.lib
プロジェクトの設定が終わったら、WebCam.cppに以下のコードを記述します。
以下のコードは抜粋となります。生成したテンプレートに当てはめて下さい。
-
#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()を行わないとウィンドウに画像を表示することはできないので注意して下さい。
コードが入力し終わったら、ソリューションのビルドを行ってください。
以上のコーディングが終了したら、Releaseモードに変更した後、F7ボタンを押してビルドして下さい。
もしエラーが出た場合は、コードの記述ミスを探して修正して下さい。
無事ビルドできた場合は、~\WebCam\build\src\Releaseに「WebCamComp.exe」が生成されているはずです。
~\WebCamにある「WebCam.conf」と「rtc.conf」を実行ファイルがある~\WebCam\build\src\Releaseにコピーして下さい。
これで、WebCam RTCの完成です。
3. 動作確認
ネーミングサービスの起動後、生成されたWebCamComp.exeを実行して下さい。
RT System Editorを使用して、RTCをActive化しWebカメラの画像が表示されることを確認して下さい。
また、Inactive化したときにウィンドウが破棄されることも確認してください。

