Kinect v2で人間の3Dスキャンとポイントクラウドでの描画をする 〜KMC/OUCCアドベントカレンダー2014 13日目〜

皆さん進捗どうですか? KMC2回生の non117 です。私はダメです。

こちらはKMCアドベントカレンダー2014およびOUCC Advent Calendar 2014の13日目の記事となります。

はじめに

元々は古巣であるOUCCのアドベントカレンダーKMCのアドベントカレンダーを同じ日に同じ記事で寄稿し、記事を節約することを目論んでいました。
しかし、気がついたらカレンダーが埋まってたため泣く泣く別々の記事を書くことにしました。 

新しくネタを用意するのも面倒なので、OUCCアドベントカレンダーで書いたKinect v2すごいよ!という記事の続きを書きます。

 

※追記

なんとOUCCアドベントカレンダーの13日目が空いてたので、目標が達成されてしまいました。

関連研究 

OUCCアドベントカレンダーではKinect v2がいかにモーションキャプチャとして優れているかという内容でした。また、具体的に人間の骨格座標を取得する方法を紹介しました。

f:id:non_117:20141213171108p:plain

他にもKinectはカラー画像, 深度画像, 音などをAPI経由で取得できます。これらのデータを取得し画面に表示するコードはSDK付属のサンプルで網羅されていますが、このサイトの解説記事がよりわかりやすいでしょう。

ところで話は変わりますが、近年ポイントクラウドと呼ばれる技術がもてはやされています。ポイントクラウドとは、(色付きの)3次元の点を大量に使って物体を表現する試みです。現代の3DCGでは多面体のモデルにテクスチャを貼り付けて物体を表現していますが、ポイントクラウドは計算資源の暴力によりきめ細かな表現が可能になるのかもしれません? 知らんけど。

Kinect v2は照射した赤外線がセンサに返ってくるまでの時間の遅れ(Time of Flight! )で物体までの距離を測るので、3次元物体のスキャンが可能です。つまり、Kinectで取得できる空間の3次元座標情報からポイントクラウドを作成することができます。

UnityとKinect v2を使ってポイントクラウド風の描画をしたのが以下の記事です。

しかし、UnityはMono上で動作するため制約が多い上にリアルタイムに描画すると大変重くなります。リンク先の記事でも10fps程度しか出ないようです。また、真のポイントクラウドとして描画するためには、3次元座標での色情報も取ってくる必要があるため、もっと処理は重くなります。

目標

そこで、私はC# で直接KinectAPIを叩き、ポイントクラウドの情報をバイナリファイルとして保存してから、後でUnity上で描画する手法をとります。

ついでにただのポイントクラウドだけではなく、Kinectが得意な人領域抽出も組み合わせて人間のポイントクラウドを作ってみます。

アプローチ 

Kinectでは1種類のセンサに対して1つのFrameReaderが対応し、FrameReaderにイベントハンドラを登録することで、センサからのデータを処理します。
しかし、深度センサ、カラー画像など複数のデータを扱う場合にはひとつひとつFrameReaderをメンバとして保持し、それぞれにイベントハンドラを登録する必要があり非常に面倒なコードになってしまいます。
そんな時には 

gista66e54a0aad21d13dd6f

のように書くことで、複数のデータソースをひとつの関数で処理することができます。
FrameSourceTypeではDepth, Color, Bodyがそのまま深度、カラー、骨格に対応し、最後のBodyIndexが深度情報( 512 x 424 )のうち、どこが人の領域かという情報を与えてくれます。

毎フレームごとの処理の概略は以下のコードのようになります。

giste7073853191278fc1de6

それぞれのフレームからデータを読んで配列なりに格納するだけです。
そして次に深度画像を走査して人領域の座標と色を見つけます。

gist54b128d930b1e554b956

上のように, 深度画像を人領域画像でフィルタリングすることで、リアルワールドでの座標とその色を習得できます。
以上の処理で得られた点群を配列などに適当に格納し、シリアライズするとUnityでも扱えるデータになるでしょう。
ただしこの際には.net 3.5以前で使える基本的なデータ型としてシリアライズしないとMono環境でのデシリアライズに失敗しやすいことに注意しましょう。
Unityで描画するさいはこちらの記事のようにParticleSystemを使うか、愚直にSphereを作って色を塗るのが良さそうです。

実験

できたのがこんなポイントクラウドです。

f:id:non_117:20141213172709p:plain

しっかり服の皺まで再現されていることがわかりますね。 

f:id:non_117:20141213172741p:plain

裏から見るとハリボテになっていることがわかります。

近づいてみます。

f:id:non_117:20141213172805p:plain

 

きもちわるい。。。

結果・今後の展望

Kinect v2を使って人間の3次元スキャンをし、それをポイントクラウドとして表現することができました。
Kinect 1台だとハリボテが限界ですが、複数台使うか、あるいは人間が回転して数フレーム分記録することで、背中側のモデルも構築できそうです。
また、毎フレーム異なるポイントクラウドを描画することでアニメーションにもできますが、全身で数万個の点群になるためフレームレートを落とすか点群を適当に間引きする必要がありそうです。 

まとめ

以上、KMCアドベントカレンダー2014 13日目の記事でした。
明日はohaiさんによる"京大周辺のランチ"だそうです。生協の食堂は飽きたけど野菜をちゃんと採りつつ美味しいものを食べたいという怠惰な私にも嬉しい記事になりそうですね?

KMCM

KMCこと京大マイコンクラブでは「KMCアドベントカレンダーに参加したい!!」方を募集しています。KMCには入部制限はありません。年齢や学歴、人種、宗教、信条、性別、社会的身分、門地、国籍、経験などは不問です。また活動に関する制約もありません。IRCのチャット越しに会話に参加することだけでも大丈夫です。詳細は下記Webページを御覧ください。 

OUCCM

OUCCでは優秀なラボ畜候補生を募集しております. まいにち進捗たのしい研究!