第9回 Kinect を使ってみよう

Monday, June 21, 2021

今回は depth センサーつきのカメラである Kinect を使います!

サンプルファイル

chimanaco/takara-univ-media-programming-2021
09が本日のディレクトリです。

Kinect は Microsoft 社が販売したデバイスで、物体のジェスチャーや音声認識を元に操作を行うというものです。最初は Xbox 360の周辺基地として登場したのですが、後に Windows PC に接続して使える一般用も発売されました。

それまではとても高価で大がかりだったモーションキャプチャや物体認識などを、卓上サイズかつ安価に実現したことにより、ゲーム用途だけでなく、この講義に沿った内容で言うと、人の輪郭や位置を取得して数多のインタラクティブインスタレーションで利用されてきました。

使用例

Kinect に限らず近しい機能を使った作品は探してみるととてもたくさん見つかると思います。

仕組み

以下の機能を組み合わせて物体認識などを行っています。

Type Function
RGB カメラ 通常のカメラと同じ RGB で色が表現されるカメラ
Depth センサー カメラから物体までの距離(深度)を赤外線を使用して測定する
マイク 音声入力&認識

Kinect の種類

Kinect と呼ばれるものは2021年6月22日現在、3種類あります。 本講義で使用するのは丸みを帯びている Kinect for Windows というもので v1 と呼ばれます。Depth センサーは、投光した赤外線パターンを読み取り、パターンのゆがみから Depth 情報を得る Light Coding という方式が採用されています。

Network

四角いタイプが Kinect for Windows v2 というものでv2と呼ばれます。Depth センサーは、投光した赤外線が反射して戻ってくる時間から Depth 情報を得る Time of Flight(TOF) という方式が採用されています。

Network

開発者向けとなっていますが最新のものが Azure Kinect DK です。Azure Kinectと呼ばれます。Depth センサーは Time of Flight(TOF) 方式を採用しています。

Network

機能の一部比較

Type Color
Resolution
Depth
Resolution
Player Skeleton Range Angle
v1 640x480 320x240 6 2 0.8-4.0m H: 57°
V: 43°
v2 1920x1080 512x424 6 6 0.5-4.5m H: 70°
V: 60°
Azure DK 3840x2160
4096x3072
640x576
512x512
1024x1024
? ? 0.5-3.86m H: 75°
V: 65°

Azure Kinect は依然開発中ということもあり、SDK(Software Development Kit) によってソフト的なスペックが変わることもあると思います! ちなみに Kinect v1, v2 はすでに生産終了していて、2021年6月22日現在 Microsoft のストアで在庫無しの状態です。

その他の Depth センサーつきのカメラ

Depth センサーつきのカメラは、ロボット工学やAR、VRをはじめとする多種多様な分野で活用されています。以下の記事で比較されているように沢山の種類のものがあります。

3Dカメラ 8種類を 様々な環境で比較しました 【その① 屋外編】 | 研究開発者向け情報発信メディア TEGAKARI
3Dカメラ 8種類を 様々な環境で比較しました 【その② 屋内編】 | 研究開発者向け情報発信メディア TEGAKARI

Kinect を使う準備

PC で Kinect v1 を使用するには、まず以下から Kinect for Windows SDK v1.8 と Kinect for Windows Developer Toolkit v1.8 をインストールしてください。

v2 の場合は Kinect for Windows SDK 2.0 をインストールしてください。

使ってみる

RGB カメラと Depth センサーからの情報をイメージで表示するには Kinect_TOP を使用します。

Hardware versionVersion1Version2 をお使いの Kinect に応じて選びます。 Image で表示したいタイプを選びます。今回は以下の3つを使用します。

RGB and Depth /project1/TOP_RGB_Depth

それぞれ ImageColor 及び Depth を選択します。

Player Index /project1/TOP_PlayerIndex

条件つきで6人まで認識することができます。それぞれの Player は異なる濃さで表現されるため濃さに応じて分別していくとよいでしょう。例えば Threshold TOPDifference TOP を使用して分別することができます。

手の位置を取得する /project1/CHOP

Kinect CHOP を使うと関節などの値が取得できます。人を認識している状態だとここに値が入ってきます。 そのままだと沢山ありすぎてよくわからないので、左右の手の xy の位置を取得してみましょう。

Network

Channel Namesp1/hand_r:tx p1/hand_r:ty p1/hand_l:tx p1/hand_l:ty を入力または右の矢印から選択をします。 このままだと長いので短くてわかりやすい名前に Rename To で変更します。rtx rty ltx lty とします。Circle TOP を2個用意してこれらの値を使って動かします。Math CHOPなどを使用して手の位置と円の位置を合わせてみましょう。

参考:TouchDesigner で Kinect などの Depth センサー無しに似た表現を実現する方法

Zoom などの Video Conferences ツールで AI を使って背景を除去する機能がありますが、RTX 系のグラフィックカードを積んでいる PC の場合は Nvidia Background TOP が使えます。

Python を使って以下のようなこともできます。
学習したモデルに Semantic Segmentation させて、Webカメラ画像にリアルタイムで、 TouchDesinger のエフェクトかける - Qiita

本日の課題: Kinect を使ってみて、どんなものに応用できそうか考えて書く

グループで Kinect を使って色々試してみてください。授業の最後にどんなことに応用できそうか100文字以下でまとめて Teams のコメントにて提出してください。実現の難易度は問いません。

例えば…

  • 手を動かすとオブジェクトが動く
  • オブジェクトが人の後をついてくる
  • 近づくと音楽が鳴り出す、遠くに行くと音楽が止まる

参考

第10回 プロジェクションマッピング実習

第8回 DAT + Python 基礎