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);
撮影結果1
撮影対象:
机の上にコップとお椀、後ろには椅子とホワイトボード。
距離画像と赤外線画像:
赤外線のLightCodingパターンが辛うじて見えます
(おまけ) 色付き距離画像:
ポイントクラウド:
結構キレイにとれている感じがします。
撮影結果2
撮影対象:
廊下のT字路
距離画像と赤外線画像:
赤外線画像は人の目には何も見えない状態です。
ポイントクラウド:
3本の線は座標軸です。交点が撮影視点で、赤がX軸、緑がY軸、青がZ軸。
ちなみに俯瞰すると、遠くの方では誤差が目立ちます。
Kinectでも遠すぎるとこうなりますね。
さらに、4,5m離れた先では取得データが丸みを帯びてしまいます。
画像左側の円弧のように点が濃く分布しているところは、実際には平面です。公式データでは「40cm~3.5mの範囲で利用可能」と書いてありましたが、その通りなようです。
まとめ
- Structure Sensor を叩くモジュールを実装しました。
- 4m以上遠い場所の正確な3次元データは得られないことがわかりました。