Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
新センサーデバイス概説

新センサーデバイス概説

インテル RealSense R200で進化した新機能とは?

2015年9月28日

ついに予約者向けに製品が届けられ始めたR200の機能概要と特徴を、従来製品のF200と比較しながらレビュー。

Natural Software 中村 薫
  • このエントリーをはてなブックマークに追加

 本連載は、新しいセンサーやデバイスを使ってみて、その概要や開発環境について紹介する不定期の連載である。初回となる今回は、インテル社のRealSense 3Dカメラ R200について紹介する。

インテル RealSense 3Dカメラ R200の概要

 インテル RealSense 3Dカメラをはじめとする「インテル RealSense テクノロジー」は、インテル社が進めているDepth(深度、距離)センサーを使ったソリューションである。「インテル RealSense テクノロジー」の概要は「書籍転載:インテルRealSense センサープログラミング」を参照してほしい。

 インテル RealSense 3Dカメラには、

  • F200
  • R200
  • SnapShot

の3種類があるが、ここでは(予約購入者向けに提供が始まった)R200について紹介する。

 R200(図1)は、タブレットPCの外側(リアカメラ)に内蔵される用途を想定しているカメラである。

図1 Surface 3の背面にR200を取り付けた例

これでディスプレイを見ながら空間を認識させるイメージだ。

 用途としては、

  • 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の構造になっている。

図2 R200カメラの構造(https://software.intel.com/en-us/articles/realsense-r200-cameraより引用)

 パッと見て(F200と比較して)R200の特徴が分かりやすいのが、IR画像Depth画像だろう。IR画像はF200とR200で色味が異なり(図3)、センシング方法が違うことが分かる。Depth画像では見える範囲が異なり(図4)、距離範囲の違いが分かる。

図3 IR画像の違い

R200は白みがかっており、F200のような黒い画像と異なっている。

図4 Depth画像の違い

黒が無効な距離範囲となっており、R200のほうが奥まで有効となっていることが分かる。F200は逆に手前がより有効となっている。

 F200およびR200の仕様をまとめると次のようになる。

仕様F200R200
カラーカメラ 最大1920x1080@30FPS 1920x1080@30FPS
Depthカメラ 最大640x480@30FPSまたは最大640×240@120FPS 最大628x468@30FPS
距離範囲 0.2~1.2m(屋内のみ) 0.5~4m(屋外をサポート)
表1 Intel RealSense SDKでF200とR200の仕様(https://software.intel.com/en-us/realsense/devkitよりまとめた)

 次にF200およびR200のサポート環境をまとめると次のようになる。F200ではCoreプロセッサー(Core i3/i5/i7)のみサポートだが、R200はCore MやAtom(Cherry Trail以降)もサポートされている。筆者がAtom(Cherry Trail)のPC(Surface 3)で試したところ、確かに動作する。しかし、使う機能の種類や量によって性能が出ないこともあるので、事前に性能の確認を行う方がよいだろう。

仕様F200R200
サポート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以降)
表2 Intel RealSense SDKでF200とR200のサポート環境(https://software.intel.com/en-us/realsense/devkitよりまとめた)

インテルRealSense 3Dカメラ R200でできること

 R200でできることを知りたい場合は、SDKから見てみるのがお勧めだ。インテル RealSense 3DカメラのF200およびR200は「インテル RealSense SDK」を使って開発することができ、RealSense SDKに同梱されているサンプルを見ることで(図5)、何ができるかを知ることができる。

図5 Intel RealSense SDK Sample Browser

Common SamplesおよびR200 SamplesがR200で利用できる機能。このうちR200 SamplesはR200専用となっている。

 これらを個別にまとめると、表1のようになる。F200と比較すると、手と空間、3Dスキャンに細かい違いがあり、その他は同じように利用できる。

日本語英語F200R200
ストリーム カラー 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 ×
表3 Intel RealSense SDKでF200とR200での機能の違い(日本語名は筆者の解釈を含む)

【凡例】○:サポート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レイヤーセグメンテーション)
表4 Enhanced Photography(C++)での処理一覧

図6~図11は、それぞれの実行例となっている。

図6 Measureで2点間の距離を測る(両目をクリックして、瞳孔間距離を測ってみる)
図7 Refocusでクリックした点を中心にぼかしを入れる
図8 Depth Enhanceでノイズ除去したDepthデータを得る
図9 Depth Upscaleでカラー画像にサイズ変更されたDepth画像を得る
図10 Paste On Planeでクリックした2点間が平面かどうかを検出する
図11 Color Popで背景をグレー画像にする

Scene Perception

 ScenePerceptionは直訳すると「環境認識」だろうか。機能としては、リアルタイムの空間3Dスキャンとなっている。Scene Perceptionのサンプルを実行し、再生ボタン(▶)を押すと、空間のスキャンが始まる。R200をゆっくり動かすと、空間が3Dスキャンされていくのが分かる。

図12 Scene Perceptionの実行画面。R200を動かすと3D空間が構築されていくのが分かる。

SegmentationEP

 SegmentationEPのEPはEnhanced Photographyで、Enhanced Photographyの機能を使ったセグメンテーション(背景除去)になるだろうか。RealSense SDKにはSegmentation自体の機能もあるが、別アルゴリズムでのセグメンテーションとなっている。

図13 画像データに対し、後から背景除去の処理を行う(選択した顔の部分のみが有効になっている)

TrackingEV

 TrackingEVのEVはEnhanced Videographyで、強化された写真の機能をリアルタイムに行うことで強化されたビデオ機能を提供する。TrackingEVでは先ほどのセグメンテーション機能をリアルタイムに行っている。

図14 カメラ画像に対し、リアルタイムに背景除去を行う(動いても背景除去され続ける)

インテルRealSense 3Dカメラ R200を導入する

 R200(F200も同様)を動作させるには、カメラ用のDepth Camera Manager(DCM)とインテルRealSense SDK(またはランタイム)をインストールする。これらはこちらからダウンロードできる。

 セットアップの基本的な手順は次のようになっている。

  1. R200カメラをPCに接続する
  2. R200用のDCMをインストールする
  3. インテル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でも可)
表5 インテルRealSense SDKの環境(https://software.intel.com/en-us/intel-realsense-sdk/よりまとめた)

サンプルコード

 最後にコードからR200の概要を見てみよう。

 次のコードは拙著『インテルRealSenseセンサープログラミング』の「4-2-3 Depthの距離データを使う」をF200、R200共用で利用できるようにして距離を取得するコードの初期化部分だ。こちらにプロジェクト全体を置いた。

 細かい説明は省くが、Depthストリームを有効にする際にDepthデータの解像度を0に設定することで、デバイスによって自動的に解像度を設定させている(F200が640×480、R200が628×468または480×360という解像度であるため)。

 事前に使用するデバイスを列挙する場合の例としてPopulateDeviceメソッド、初期化したデバイス情報を取得する例としてGetDeviceInfoメソッドを後で解説する。

C#
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();
}
リスト1 R200を使ってDetphデータを取得するコードの初期化部分

 利用可能なデバイスの列挙は、リスト2のコードのようになる。利用するデバイスの選択は明示的なものはなく、有効にしたストリームに合うデバイスが選択される。照合の順序は、列挙の順序となっている。F200とR200ではR200が優先される(現バージョンでの動作)。例えばF200とR200の両方を接続した状態で先の初期化の際に、

  • Depthの解像度をデバイスの既定のサイズとする幅0、高さ0とした場合にはR200が選択される
  • F200のみの解像度である幅640、高さ480とした場合にはF200が選択される。
  • 両方のカメラの解像度である幅320、高さ240にした場合にはR200が選択される。

といった具合だ。

C#
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();
  }
}
リスト2 利用可能なデバイスを列挙する

 最後に動作させているデバイスの設定を取得する。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列挙体)で判別する。

C#
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 );
}
リスト2 利用可能なデバイスを列挙する

 実行するとクリックした位置の距離が表示される。R200の距離がどこまで取得できるか試してみるとよいだろう。

図15 実行結果

まとめ

 インテル RealSense 3Dカメラ R200は中距離用のセンサーで、環境センシングが特徴的である。現在は開発者キットの外付けのみであるが、今後内蔵されたタブレットの発売が予定されている。R200もF200と同様にRealSense SDKで開発が可能のため、F200でのノウハウを流用できる。

サイトからのお知らせ

Twitterでつぶやこう!