新センサーデバイス概説
インテル RealSense R200で進化した新機能とは?
ついに予約者向けに製品が届けられ始めたR200の機能概要と特徴を、従来製品のF200と比較しながらレビュー。
本連載は、新しいセンサーやデバイスを使ってみて、その概要や開発環境について紹介する不定期の連載である。初回となる今回は、インテル社のRealSense 3Dカメラ R200について紹介する。
インテル RealSense 3Dカメラ R200の概要
インテル RealSense 3Dカメラをはじめとする「インテル RealSense テクノロジー」は、インテル社が進めているDepth(深度、距離)センサーを使ったソリューションである。「インテル RealSense テクノロジー」の概要は「書籍転載:インテルRealSense センサープログラミング」を参照してほしい。
インテル RealSense 3Dカメラには、
- F200
- R200
- SnapShot
の3種類があるが、ここでは(予約購入者向けに提供が始まった)R200について紹介する。
R200(図1)は、タブレットPCの外側(リアカメラ)に内蔵される用途を想定しているカメラである。
用途としては、
- Depthデータを使った距離計測
- 距離データを埋め込んだ写真
- 距離データを利用したぼかし効果
- 部屋の3Dスキャン
などが想定されている。R200は、2015年3月に予約が開始され、2015年9月に届き始めている。インテルRealSense テクノロジーはPCへの内蔵を前提としているが、R200については外付けの開発者キットのみで内蔵PCは発売されていない(2015年9月現在)。発売予定はいくつかのメーカーから発表されている。
R200の有効距離範囲は0.5m~4mほどで、屋外も使用はサポートされている*1(F200やKinectは屋外での使用はサポートされていない)。R200のセンシング方式は、パターン方式のステレオIR(赤外線)とされている。
- *1 仕様上サポートされているが、筆者が試した限りでは、ひなたではDepthが取れず、日陰ではDepthが取得できるという状況だった。
R200は図2の構造になっている。
パッと見て(F200と比較して)R200の特徴が分かりやすいのが、IR画像やDepth画像だろう。IR画像はF200とR200で色味が異なり(図3)、センシング方法が違うことが分かる。Depth画像では見える範囲が異なり(図4)、距離範囲の違いが分かる。
F200およびR200の仕様をまとめると次のようになる。
仕様 | F200 | R200 |
---|---|---|
カラーカメラ | 最大1920x1080@30FPS | 1920x1080@30FPS |
Depthカメラ | 最大640x480@30FPSまたは最大640×240@120FPS | 最大628x468@30FPS |
距離範囲 | 0.2~1.2m(屋内のみ) | 0.5~4m(屋外をサポート) |
次にF200およびR200のサポート環境をまとめると次のようになる。F200ではCoreプロセッサー(Core i3/i5/i7)のみサポートだが、R200はCore MやAtom(Cherry Trail以降)もサポートされている。筆者がAtom(Cherry Trail)のPC(Surface 3)で試したところ、確かに動作する。しかし、使う機能の種類や量によって性能が出ないこともあるので、事前に性能の確認を行う方がよいだろう。
仕様 | F200 | R200 |
---|---|---|
サポートOS | Windows 8.1以降 | Windows 8.1以降 |
USB | USB 3.0 | USB 3.0 |
サポートCPU | 第4世代(Haswell)以降のインテル Core プロセッサー | 第4世代(Haswell)以降のインテル Core プロセッサー インテル Core M プロセッサー インテル Atom プロセッサー(Cherry Trail以降) |
インテルRealSense 3Dカメラ R200でできること
R200でできることを知りたい場合は、SDKから見てみるのがお勧めだ。インテル RealSense 3DカメラのF200およびR200は「インテル RealSense SDK」を使って開発することができ、RealSense SDKに同梱されているサンプルを見ることで(図5)、何ができるかを知ることができる。
Common SamplesおよびR200 SamplesがR200で利用できる機能。このうちR200 SamplesはR200専用となっている。
これらを個別にまとめると、表1のようになる。F200と比較すると、手と空間、3Dスキャンに細かい違いがあり、その他は同じように利用できる。
日本語 | 英語 | F200 | R200 | |
---|---|---|---|---|
ストリーム | カラー | Color | ○ | ○ |
Depth | Depth | ○ | ○ | |
IR | IR | ○ | × | |
Left(IR) | Left(IR) | × | ○ | |
Right(IR) | Right(IR) | × | ○ | |
顔 | 検出 | Detection | ○ | ○ |
特徴点 | Landmark | ○ | ○ | |
認証 | Recognition | ○ | × | |
表情 | Expression | ○ | × | |
心拍 | Pulse | ○ | × | |
ポーズ(向き) | Pose | ○ | × | |
視線追跡 | Eye Tracking(Gaze) | ○ | × | |
手 | ブロブ(輪郭) | Blob | ○ | ○ |
検出 | Hand | ○ | × | |
追跡 | Tracking | ○ | × | |
ジェスチャー | Gesture | ○ | × | |
音声 | 音声認識 ※1 | Speech Recognition | ○ | ○ |
音声合成 ※2 | Speech Synthesis | ○ | ○ | |
空間 | 背景除去 | 3D Segmentation | ○ | × |
オブジェクトトラッキング(AR機能) | Object Tracking | ○ | × | |
非接触UI | Touchless Control | ○ | × | |
環境認識(空間の3Dスキャン) | Scene Perception | × | ○ | |
距離計測 | Measurement | × | ○ | |
3D スキャン | 物体 | Object | ○ | ○ |
顔 | Face | ○ | × | |
頭 | Head | × | ○ | |
体(全身) | Body | × | ○ | |
写真 | 拡張された写真 | Enhanced Photography | × | ○ |
拡張された動画 | Enhanced Videography | × | ○ | |
Windows Hello ※3 | ○ | × |
【凡例】○:サポート1、×:未サポート
※1 マイクに依存する。
※2 マイクに依存する。
※3 Windows 10の機能。
(従来のF200から)R200で新しく可能になった機能を見てみよう。
Enhanced Photography
Enhanced Photographyは直訳すると「強化された写真」になるだろうか。これまでのRGBの画像データにDepthデータを加えることで、新たな写真、画像データの活用方法が見えてくる。
Enhanced Photography(C++)を見てみると、「Measure」「Refocus」「Depth Enhance」「Depth Upscale」「Paste On Plane」「Color Pop」がある。それぞれの意味と動作は以下のようになっている。
イベント | 意味 |
---|---|
Measure | クリックした2点間の距離を測る |
Refocus | クリックした1点を中心としてぼかし処理を加える |
Depth Enhance | Depthデータのノイズを除去する |
Depth Upscale | Depth画像のサイズを、カラー画像のサイズと一致するように変更する |
Paste On Plane | クリックした2点間が平面であるか判定する |
Color Pop | クリックした1点を中心として、セグメンテーション処理を行い、除去される場所をグレー画像にする(2レイヤーセグメンテーション) |
図6~図11は、それぞれの実行例となっている。
Scene Perception
ScenePerceptionは直訳すると「環境認識」だろうか。機能としては、リアルタイムの空間3Dスキャンとなっている。Scene Perceptionのサンプルを実行し、再生ボタン(▶)を押すと、空間のスキャンが始まる。R200をゆっくり動かすと、空間が3Dスキャンされていくのが分かる。
SegmentationEP
SegmentationEPのEPはEnhanced Photographyで、Enhanced Photographyの機能を使ったセグメンテーション(背景除去)になるだろうか。RealSense SDKにはSegmentation自体の機能もあるが、別アルゴリズムでのセグメンテーションとなっている。
TrackingEV
TrackingEVのEVはEnhanced Videographyで、強化された写真の機能をリアルタイムに行うことで強化されたビデオ機能を提供する。TrackingEVでは先ほどのセグメンテーション機能をリアルタイムに行っている。
インテルRealSense 3Dカメラ R200を導入する
R200(F200も同様)を動作させるには、カメラ用のDepth Camera Manager(DCM)とインテルRealSense SDK(またはランタイム)をインストールする。これらはこちらからダウンロードできる。
セットアップの基本的な手順は次のようになっている。
- R200カメラをPCに接続する
- R200用のDCMをインストールする
- インテルRealSense SDKをインストールする
F200カメラの環境でインストールした場合、2のDCMはF200カメラ用となっており、SDKまたはランタイムもインストール済みだろう。この場合はR200のDCMだけをインストールすればよい。F200とR200のDCMは同居でき、F200とR200を同時に使うこともできる。
インテルRealSense SDKの環境について下記の表にまとめた(F200/R200共通)。
項目 | 仕様 |
---|---|
OS | Windows 8.1以降(デスクトップモードのみ) |
開発言語 | C++ C#(.NET Framework 4.0以降) JavaScript Java(JDK 1.7.0_11以降) Processing(2.1.2以降) |
開発環境 | Visual Studio 2010以降 Unity Pro 4.1.0以降(Unity5.0以降であればPersonalでも可) |
サンプルコード
最後にコードからR200の概要を見てみよう。
次のコードは拙著『インテルRealSenseセンサープログラミング』の「4-2-3 Depthの距離データを使う」をF200、R200共用で利用できるようにして距離を取得するコードの初期化部分だ。こちらにプロジェクト全体を置いた。
細かい説明は省くが、Depthストリームを有効にする際にDepthデータの解像度を0に設定することで、デバイスによって自動的に解像度を設定させている(F200が640×480、R200が628×468または480×360という解像度であるため)。
事前に使用するデバイスを列挙する場合の例としてPopulateDevice
メソッド、初期化したデバイス情報を取得する例としてGetDeviceInfo
メソッドを後で解説する。
private void Initialize()
{
// SenseManagerを生成する
senseManager = PXCMSenseManager.CreateInstance();
// 利用可能なデバイスを列挙する
PopulateDevice();
// Depthストリームを有効にする
pxcmStatus sts = senseManager.EnableStream( PXCMCapture.StreamType.STREAM_TYPE_DEPTH, 0, 0, 0 );
// パイプラインを初期化する
sts = senseManager.Init();
// デバイス情報を取得する
GetDeviceInfo();
}
|
利用可能なデバイスの列挙は、リスト2のコードのようになる。利用するデバイスの選択は明示的なものはなく、有効にしたストリームに合うデバイスが選択される。照合の順序は、列挙の順序となっている。F200とR200ではR200が優先される(現バージョンでの動作)。例えばF200とR200の両方を接続した状態で先の初期化の際に、
- Depthの解像度をデバイスの既定のサイズとする幅0、高さ0とした場合にはR200が選択される
- F200のみの解像度である幅640、高さ480とした場合にはF200が選択される。
- 両方のカメラの解像度である幅320、高さ240にした場合にはR200が選択される。
といった具合だ。
public void PopulateDevice()
{
var desc = new PXCMSession.ImplDesc
{
group = PXCMSession.ImplGroup.IMPL_GROUP_SENSOR,
subgroup = PXCMSession.ImplSubgroup.IMPL_SUBGROUP_VIDEO_CAPTURE
};
var session = senseManager.QuerySession();
for ( int i = 0; ; i++ ) {
// デバイスのディスクリプタを取得する
PXCMSession.ImplDesc desc1;
var ret = session.QueryImpl( desc, i, out desc1 );
if ( ret < pxcmStatus.PXCM_STATUS_NO_ERROR ) {
break;
}
// キャプチャーを作成する
PXCMCapture capture;
ret = session.CreateImpl( desc1, out capture );
if ( ret < pxcmStatus.PXCM_STATUS_NO_ERROR ){
continue;
}
// デバイスを列挙する
for ( int j = 0; ; j++ ) {
PXCMCapture.DeviceInfo dinfo;
if ( capture.QueryDeviceInfo( j, out dinfo ) < pxcmStatus.PXCM_STATUS_NO_ERROR ) {
break;
}
// R200 : Intel(R) RealSense(TM) 3D Camera R200
// F200 : Intel(R) RealSense(TM) 3D Camera
Trace.WriteLine( dinfo.name );
}
capture.Dispose();
}
}
|
最後に動作させているデバイスの設定を取得する。PXCMSenseManager
オブジェクトのQueryCaptureManager().QueryDevice()
メソッドでデバイス(=PXCMCapture.Device
クラスのオブジェクト)を取得し、PXCMCapture.Device
オブジェクトのQueryStreamProfileSet()
メソッドでストリームの設定(=プロファイル、PXCMCapture.Device.StreamProfileSet
クラスのオブジェクト)を取得する。PXCMCapture.Device.StreamProfileSet
オブジェクトにはストリーム(ColorやDepth)の解像度が格納されているので、それぞれ取得する。
デバイスの種別(=PXCMCapture.DeviceInfo
オブジェクト)については、PXCMCapture.Device.QueryDeviceInfo()
メソッドで取得する。PXCMCapture.DeviceInfo.model
フィールド(型はPXCMCapture.DeviceModel
列挙体)で判別する。
private void GetDeviceInfo()
{
// デバイスを取得する
var device = senseManager.QueryCaptureManager().QueryDevice();
// ミラー表示にする
// リア側は見たままを表示するのでミラーにしないほうがよい
//senseManager.QueryCaptureManager().QueryDevice().SetMirrorMode( PXCMCapture.Device.MirrorMode.MIRROR_MODE_HORIZONTAL );
// 画面の情報を取得する
PXCMCapture.Device.StreamProfileSet profiles = null;
device.QueryStreamProfileSet( out profiles );
DepthWidth = profiles.depth.imageInfo.width;
DepthHeight = profiles.depth.imageInfo.height;
// RealSense カメラの情報を取得する
PXCMCapture.DeviceInfo dinfo;
device.QueryDeviceInfo( out dinfo );
if ( dinfo.model == PXCMCapture.DeviceModel.DEVICE_MODEL_F200 ) {
// DEVICE_MODEL_IVCAMも同じ値
TextModel.Text = dinfo.model.ToString() + "(F200)";
}
else if ( dinfo.model == PXCMCapture.DeviceModel.DEVICE_MODEL_R200 ) {
// DEVICE_MODEL_DS4も同じ値
TextModel.Text = dinfo.model.ToString() + "(R200)";
}
// カメラの情報を表示する
TextWidth.Text = "幅 : " + DepthWidth.ToString();
TextHeight.Text = "高さ : " + DepthHeight.ToString();
// 画面の中心座標
point = new Point( DepthWidth / 2, DepthHeight / 2 );
}
|
実行するとクリックした位置の距離が表示される。R200の距離がどこまで取得できるか試してみるとよいだろう。
まとめ
インテル RealSense 3Dカメラ R200は中距離用のセンサーで、環境センシングが特徴的である。現在は開発者キットの外付けのみであるが、今後内蔵されたタブレットの発売が予定されている。R200もF200と同様にRealSense SDKで開発が可能のため、F200でのノウハウを流用できる。