右向き矢印のメモ帳

技術系の備忘録とか

RealSense SDK2.0とOpenCVを組み合わせて使う

はじめに

RealSense SDK2.0とOpenCVを組み合わせて使いたいって機会はとても多いと思います。
少なくとも僕はそうなりました。

そこで、今回はRealSense Depth Cameraでキャプチャした画像をOpenCVで取り扱う簡単なサンプルを作りたいと思います。

環境

今回の開発環境はこんな感じです。

設定方法

まずは、RealSense SDKOpenCVの両ライブラリをプロジェクトに取り込みます。
ここはVisual Studioで外部ライブラリを取り込む際の手順と変わりません。

  • ソリューションエクスプローラーにあるソリューションファイルを右クリック→プロパティを開く。
  • すべての構成を選択したうえで、構成プロパティ→C/C++→全般にある、追加のインクルードディレクトリという項目に、両ライブラリのincludeフォルダまでのフルパスを追加。opencv/build/include と Intel RealSense SDK 2.0/includeといった感じです。追加出来たら適用を押します。
  • 次に、構成プロパティ→リンカー→全般にある、追加のライブラリディレクトリという項目に、両ライブラリのlibファイルがあるフォルダまでのフルパスを追加。opencv/build/x64/vc14/lib と Intel RealSense SDK 2.0/lib/x64にあるはずなので、そこまでのパスを追加します。追加出来たら適用を押しましょう。
  • 次に、構成をDebugに変更し、構成プロパティ→リンカー→入力にある、追加の依存ファイルという項目に、両ライブラリのlibファイルの名前を追加します。opencv_world331d.libとrealsense2.libを追加して適用します。
  • 最後に、構成をReleaseに変更し、同じように追加の依存ファイルを追加します。opencv_world331.libとrealsense2.libを追加してOKを押しましょう。この時、Debugではopencv_world331d.lib、Releaseではopencv_world331.libを選ぶように注意して下さい。Debug用はファイル名にdがついています。

コード

結論から言うと、Githubのreadameに全てが載っています。こっちも参考にしてみてください。

github.com

今回はリンク先のコードを参考にして、RealSenseでキャプチャした映像をOpenCVを利用して表示するコードを書いてみました。

#include <librealsense2/rs.hpp>
#include <opencv2/opencv.hpp>

using namespace std;

int main() {
    //デバイスを抽象化するパイプラインを構築
    rs2::pipeline pipe;

    //パイプラインの設定
    rs2::config cfg;

    //明示的にストリームを有効化する
    //640×480のカラーストリーム画像を、BGR8フォーマット、30fpsで取得するように設定
    cfg.enable_stream(RS2_STREAM_COLOR, 640, 480, RS2_FORMAT_BGR8, 30);

    //設定を適用してパイプラインストリーミングを開始
    pipe.start(cfg);

    while (true) {
        //ストリームがフレームセットを取得するまで待機
        rs2::frameset frames = pipe.wait_for_frames();

        //フレームセットからカラーフレームを取得
        rs2::frame color = frames.get_color_frame();

        //カラーフレームから、OpenCVのMatを作成
        cv::Mat frame(cv::Size(640, 480), CV_8UC3, (void*)color.get_data(), cv::Mat::AUTO_STEP);
    
        //画像を表示
        cv::imshow("window", frame);

	//qを押すと終了
	int key = cv::waitKey(1);
	if (key == 113) {
		break;
	}
    }

 //全てのウィンドウを閉じる
    cv::destroyAllWindows();

    return 0;
}

このコードを実行すると、RealSenseのRGBカメラで撮影している映像がリアルタイムで画面に表示されるはずです。

f:id:arrow52:20180826000828p:plain

おわりに

今回はRealSense Depth Cameraでキャプチャした画像をOpenCVで取り扱い、表示してみました。
OpenCVで顔とか検出してその距離を測定したりとかいろいろ出来そうです。