Predator's Vision

画像処理、3D点群処理、DeepLearning等の備忘録

Structure Sensor から距離画像やポイントクラウドを取得

前回の「Structure Sensor を Windows へ接続」の続きです。OpenNI2を使って距離画像(深度画像)・赤外線画像・ポイントクラウドを取得してみました。

ソースコード

Structure Sensor からデータを取得するC++のモジュール "structure_grabber" をGithubにおきました。

概要

距離画像・ポイントクラウドの取得は下記4つのファイルとOpenNI2ライブラリで可能です。

  • structure_grabber.h
  • structure_grabber.cpp
  • oni2_grabber.h
  • oni2_grabber.cpp

ただし、上記GitHubのサンプル内では、Visualizeのために距離画像についてはOpenCVを、ポイントクラウドについてはPoint Cloud Library (PCL)を使っています。

簡単な使い方

データ取得の方法を簡単に書くと下記の通りになります。

  • インクルード:
#include <opencv2/opencv.hpp>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include "structure_grabber.h"
  • 設定
StructureGrabber grabber;
grabber.enableDepth();
grabber.enableInfrared();
grabber.setDepthRange(0.3, 5.0);
grabber.open();
  • データの取得:
cv::Mat depth_image, infrared_image;
pcl::PointCloud<pcl::PointXYZ> cloud;

grabber.acquire();
grabber.copyDepthImageTo(depth_image);
grabber.copyInfraredImageTo(infrared_image);
grabber.copyPointCloudTo(cloud);

ビルド方法

  • ダウンロード後、CMakeLists.txtの中のOpenCVやOpenNI2に関するディレクトリ設定を適切に書き換えます。
  • コマンドプロンプトでCMakeLists.txtがあるフォルダに移動します
  • CMakeでプロジェクトを作成し、ビルドします。
cmake .

撮影結果1

撮影対象:
f:id:presan:20140702114608p:plain
机の上にコップとお椀、後ろには椅子とホワイトボード。


距離画像と赤外線画像:
f:id:presan:20140702115522p:plain
赤外線のLightCodingパターンが辛うじて見えます


(おまけ) 色付き距離画像:
f:id:presan:20140702115826p:plain


ポイントクラウド
f:id:presan:20140702134803p:plain
結構キレイにとれている感じがします。

撮影結果2

撮影対象:
f:id:presan:20140702135132p:plain
廊下のT字路


距離画像と赤外線画像:
f:id:presan:20140702135436p:plain
赤外線画像は人の目には何も見えない状態です。


ポイントクラウド
f:id:presan:20140702135751p:plain
3本の線は座標軸です。交点が撮影視点で、赤がX軸、緑がY軸、青がZ軸。


ちなみに俯瞰すると、遠くの方では誤差が目立ちます。
f:id:presan:20140702140115p:plain
Kinectでも遠すぎるとこうなりますね。


さらに、4,5m離れた先では取得データが丸みを帯びてしまいます。
f:id:presan:20140702140623p:plain
画像左側の円弧のように点が濃く分布しているところは、実際には平面です。公式データでは「40cm~3.5mの範囲で利用可能」と書いてありましたが、その通りなようです。

まとめ

  • Structure Sensor を叩くモジュールを実装しました。
  • 4m以上遠い場所の正確な3次元データは得られないことがわかりました。