こんにちは、岸田です。
今年頭に発売を開始したIntel RealSense Depth Camera D435なる商品があります。今回は、この製品を使ってみた様子をお届けしようと思います。
■Intel RealSense とは?
簡単に言うと3次元カメラです。普通のカメラは、カメラの見ている景色の色情報を取得します。通常は2次元ですね。3次元カメラの場合、各画素は色ではなく距離の情報を持っています。つまり、私達が目で見て奥行きや距離感を測っているのと同じように、3次元カメラも距離感を測れる!というものです。Depth(深度)カメラとも呼ばれます。
RealSenseシリーズは、そういった3次元カメラのうちの一つで、Intel社が開発を行っているものです。似たようなものに、Microsoft社のKinectや、最近だとiPhone Xにも搭載されています。
■D400シリーズは何がすごい?
深度カメラにもいろいろ方式があります。例えば、Kinect v2は光を投射してから帰ってくるまでの時間から距離を計算するToF方式でした。最近だと、機械学習を使い、1枚の普通の写真だけで物体を認識して形状を逆算するようなものもあります。
RealSense D400シリーズは、2台の赤外線カメラを備え、その視差から形状を求めています。人間の目と同じですね。これに加えて、ドットパターンを照射することができます。照射時は、投影したパターンの変化から照射されている物体の形状の推定の補助を行っています(このあたりの詳細は公式のpdfをご覧ください)。これらの信号処理や深度推定をカメラ側で処理してしまい、ホストPCはあたかも普通のカメラから画像を取得するように深度データを取得できることが強みになっています。
また、今までのRealSenseシリーズに比べて、サイズは若干小型化し、測定可能な距離が伸びました。屋外での利用もサポートされ、より利用可能なシーンが増えたことが特徴です。
実際のサイズ感について、Arduino UNOと比較してみました。
よく見かけるWEBカメラよりもちょっと大きい印象です。購入は以下のページから行えます。
■とりあえず使ってみる
Windowsであれば、公式リポジトリからRealSense SDK もしくはViewerをダウンロードして実行後、カメラを接続するだけで利用可能です。この際、USB3.0対応ポート搭載のPCを使う必要があります。製品の購入時時期によってはファームウェアのアップデートが必要な場合もあるため、その場合はこのあたりを参照してください。
上の画像は、SDK付属のビュワーを利用したときの様子です。左上がDepthイメージで、近いほど青、遠いほど赤く暗い色になっています。左下は普通のカラーイメージで、いわゆる普通のカメラと同じです。右側が赤外線カメラからの映像で、ドットパターンが照射されていることがわかりますね。
写っているRapiroまでは5,60cmくらいです。D435の深度画像は画角が広いため、広い範囲を撮影するのに向いています。スペックでは対角100°ほどなので、一眼レフ風に言えば、35mmフルサイズ換算で焦点距離18mmのレンズとほとんど同じです。カラー画像は、同じように換算で27mmくらいです。普通のスマートフォンは24~28mmくらいなので、深度画像の画角はかなり広いです。
せっかくなので、スイッチサイエンスのオフィスを少し歩き回った様子を動画にしてみました。右が赤外線映像、左が深度映像になっています。
■開発してみる
映像を見るだけならビュワーを使えばよいのですが、実際になにかアプリケーション開発に使ってみたいなぁ、という場合は自分で色々セットアップをしていく必要があります。
ここで、RealSenseの以前のシリーズであれば、Intel社が顔認識やハンドトラッキング等のミドルウェアを提供してくれましたが、なんと今回のSDK 2.0 からは提供されなくなっています。どうやら、「様々なプラットフォームで同じようにカラーと深度の映像を操作できる」ことに主体を置いて、これらのデータを利用した顔認識等はやりません(旧SDKとの違い)ということらしいです。いずれサードパーティ製のライブラリ等がRealSenseを扱いやすくしてくれるとは思いますが、現状自分でいろいろな開発環境を組み合わせる必要があります。
というわけで、一体どんな感じに開発していくのかという様子を軽くお届けしようと思います。公式リポジトリにサンプルやドキュメントがあるので、こちらも参照しながら開発していきます。なお本記事ではWindows上でVisual Studio 2017を使った開発を想定しています。
●サンプルプロジェクトをビルドしてみる
C:\Program Files (x86)\Intel RealSense SDK 2.0\samples
にある rs-examples.sln というファイルをVisual Studioで開くと、サンプルプロジェクトのビルドができます。
「ビルド」→「ソリューションのビルド」をクリックすると、ビルドが始まります。これが完了すれば、SDKが正しくセットアップできています。先程のsamplesディレクトリの下のx64\Release(もしくはDebug)あたりに、exeファイルがたくさんできているはずです。試しに、capture.exeを起動してみましょう。
ちゃんと動いていますね。今回はこのようにVisual Studioでビルドして実行、ということを行っていきます。
●他のライブラリと組み合わせてみる
OpenCVと組み合わせたり、PythonやUnityからカメラへアクセスしたりといったラッパーが公開されています。 これらの環境から、他のライブラリにアクセスすることで、RealSenseのデータを様々なアプリケーションで利用可能です。今回は、顔認識をしてカメラと顔との距離を算出し、顔よりも後ろの背景を塗りつぶす、というのをやってみました。流れとしては、カラー画像から顔認識をする→深度画像における顔のピクセル座標を求める→距離を求める、という処理でできそうです。
とりあえず、作ったものの様子をお見せします。プログラムはこちらで公開しています。
動画はこちら。
動画の様子はこのようになっています。
顔と同じ程度の距離にある本は映っていますが、その背景は灰色に塗りつぶされています。
左側の文字がつらつらと出ているところは、動作ログです。顔が認識されているときは、その顔までの距離が表示されています。
真ん中はメインの処理結果で、認識された顔が緑色のフレーム表示によって強調されています。また、背景が灰色に塗りつぶされています。左側のRapiroのポスターは、顔よりも手間にあるので消えていませんね。動くと消える範囲も変わるのがわかります。
右の方に見えるのは、オリジナルの画像です。ドアの向こう側などは消えていることがわかります。
●先のプログラムをビルドできる環境を作る
今回作成したプログラムは、先程の映像のような「顔を認識して、その顔より後ろの背景を削除する」というものです。顔認識アプリケーションの開発方法はいろいろあり、開発者の趣味で選んでも良いですが、今回はDlibというものを使いました。Dlibは機械学習アルゴリズムなどを提供するツールキットで、顔認識や物体認識等の画像処理も得意です。カラー画像中のどの位置に顔があるかを認識するために、このDlibの顔認識データを利用します。セットアップに関しては本筋ではないため省略しますので、おおまかな流れは公式セットアップ手順などを参考してください。
必要なライブラリ等を導入したら、Visual Studioで新しくソリューションを作成します。ここで、ライブラリやインクルードファイルの設定を忘れないようにしましょう。というのも、自分の書いたソースコードと、連携するライブラリの関係をVisual Studioに教えてあげる必要があるためです。今回は、カメラとしてのRealSense、顔認識用のDlib、そして諸々の処理にOpenCVを使うので、自身のセットアップした環境に従って必要な設定を追加します。最低限、Visual Studio側で設定するのは以下のものです。具体例を示しますが、パス等は自身の構築した環境に合わせてください。
参考例) 筆者の「構成:Release, プラットフォーム:x64」の設定(「プロジェクト」→「[プロジェクト名]のプロパティ」などで開けます)
- 筆者の環境
- Windows 10 バージョン1709
- Visual Studio 2017
- OpenCV 3.2.0 のインストールディレクトリ:
C:\dev\opencv\
- Dlib 19.9 のインストールディレクトリ:
C:\dev\dlib-19.9\
- 構成プロパティ → C/C++ → 全般 → 追加のインクルードディレクトリ
C:\Program Files (x86)\Intel RealSense SDK 2.0\include
C:\dev\opencv\sources\include
C:\dev\dlib-19.9
- 構成プロパティ → リンカー → 全般 → 追加のライブラリディレクトリ
C:\Program Files (x86)\Intel RealSense SDK 2.0\lib\x64
C:\dev\opencv\build\x64\vc14\lib
C:\dev\dlib-19.9\build\dlib\Release
- 構成プロパティ → リンカー → 入力 → 追加の依存ファイル
- dlib_release_64bit_msvc1913.lib
- opencv_world320.lib
- realsense2.lib
この設定が、慣れないとちょっとややこしいところではあります。例えば、上記設定例はRelease構成用で、Debug構成の場合はディレクトリやファイル名がまた変更になります。インストール先やインストール手順、Windowsのバージョンによっても異なるので、入念にチェックしましょう。今回筆者が作成したプログラムはこちらで公開しているので、同じライブラリで試す場合は是非コピーなどしてビルドしてみてください。上記のVisual Studioの設定が正しく行われている場合、ビルドが完了し、プログラムが実行されるはずです。
もう一つ、顔認識ライブラリを使うためには顔検出用のモデルを別途ダウンロードする必要があります。http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2 にアクセスして、解凍したdatファイルをソースコードと同じディレクトリ、もしくはexeファイルの出力ディレクトリに設置してください。
■まとめ
以上、RealSenseの紹介やD435の特徴、使ってみた・開発してみた様子をお届けしました。いわゆるArduino的な電子工作の世界とは違ってゴリゴリと画像処理などのプログラムを書くことになります。しかし、カラー映像だけではなく形状までとれるというのは様々な応用が期待されていますし、非常に興味深いデバイスではないでしょうか。3D空間をキャプチャするというのも、ロボットやドローンの他、VRやARといった分野でもいろいろと活躍ができそうだなと感じます。みなさんもぜひ開発にチャレンジしてみてください。