Kinect for Windows v2入門 ― C++プログラマー向け連載(1)
Kinect v1とKinect v2の徹底比較
Kinect for Windowsの旧版と、次世代型の新版を比較しながら、進化したハードウェア&ソフトウェアをC++開発者向けに紹介する(正式版に対応させた改訂連載スタート)。今回はセンサー仕様や動作要件を徹底的に比較する。
本連載について
本連載では、次世代の新型のKinect for Windows(以下、Kinect v2)と、旧型のKinect for Windows(以下、Kinect v1)を比較しながら、進化したハードウェア&ソフトウェアをC++開発者向けに紹介する(※本サイトでは、C#/Visual Basic開発者向けにも同様の情報を発信している。.NET開発者の方は「新型Kinect for Windows v2 Public Preview/Developer Previewプログラミング入門」という連載も併せて参照してほしい)。
次世代型のKinect for Windows
2012年に米国マイクロソフトから発売されたKinect v1は、Depth(=深度)やSkeleton(=人物姿勢)などの情報を手軽に取得できるため、世界中の開発者や研究者から注目された。
2014年に発売されたKinect v2は、ハードウェア、ソフトウェア共に大きく進化した。
Kinect v1とKinect v2の外観比較
Kinect v1(図1)とKinect v2(図2)の外観の写真を示す。
Kinect v1のDepthセンサーは、投光した赤外線パターンを読み取り、パターンのゆがみからDepth情報を得る「Light Coding」*1という方式が採用されている。そのため、Depthセンサーは赤外線パターンを投光するIRプロジェクター(左)とそれを読み取るIRカメラ(右)に分かれている。また、Depthセンサーの間にはColorカメラが搭載されている。
- *1 イスラエルのPrimeSense社Depthセンサー技術。2013年、同社は米国のApple社に買収された。
Kinect v2のDepthセンサーは、投光した赤外線が反射して戻ってくる時間からDepth情報を得る「Time of Flight(TOF)」*2という方式が採用されている。Depthセンサーは、外観からは見えないが、Colorカメラの隣に赤外線カメラ(左)とパルス変調された赤外線を投光するプロジェクター(右)が搭載されている。
- *2 マイクロソフトは過去にTOF方式のDepthセンサー技術を持つ会社を買収しており、恐らくその技術が使われていると思われるが詳細は公表されていない。
Kinect v1とKinect v2の仕様比較
Kinect v1とKinect v2のセンサーの仕様比較を表1に示す。
Kinect v1 | Kinect v2 | ||
---|---|---|---|
色(Color) | 解像度(Resolution) | 640×480 | 1920×1080 |
fps | 30fps | 30fps *3 | |
深度(Depth) | 解像度(Resolution) | 320×240 | 512×424 |
fps | 30fps | 30fps | |
人物領域(Player) | 6人 | 6人 | |
人物姿勢(Skeleton) | 2人 | 6人 | |
関節(Joint) | 20関節/人 | 25関節/人 | |
手の開閉状態(Hand State) | △(Developer Toolkit) | ○(SDK) | |
深度の取得範囲(Range of Depth) | 0.8~4.0m (Near Mode 0.4m~) (Extended Depth ~10.0m) |
0.5~8.0m | |
人物の検出範囲(Range of Detection) | 0.8~4.0m (Near Mode 0.4~3.0m) |
0.5~4.5m | |
角度(Angle) (Depth) |
水平(Horizontal) | 57度 | 70度 |
垂直(Vertical) | 43度 | 60度 | |
チルトモーター(Tilt Motor) | ○ | ×(手動) | |
複数のアプリ | ×(単一のアプリ) | ○ |
- *3 Kinect v2のColorカメラは環境光が暗いと自動的に15fpsに落として動作する。
Kinect v1のColorカメラは解像度が640×480と低く、あまりきれいな画像が取得できなかったが、Kinect v2では大幅に解像度が向上し、1980×1080のとてもきれいな画像を取得できるようになった(図3)。
Kinect v2ではDepthセンサーの解像度も512×424に向上している。Kinect v1は640×480の解像度でもDepthデータを取得できたため、一見スペックが落ちたように見えるが、Kinect v1のベースとなるDepthセンサーの解像度は320×240であり、アップスケーリングされたものが640×480になる。また、Depthセンサーの方式もLight CodingからTime of Flight(TOF)に変更されている。
Kinect v2ではDepthデータの精度も向上している(図4)。マイクロソフトはDepthの精度がKinect v1比で3倍良くなっているとしている*4。
Depthデータの取得範囲は、Kinect v1では0.8~4.0mとなっていたが、Kinect v2では0.5m~8.0mの範囲で取得できるようになった*5。ただし、人物の検出は0.5~4.5mの範囲となっている(図5)。
- *4 “Depth fidelity (3x)”のこと。詳しくは「Features – Kinect for Windows SDK 2.0 | MSDN Library」(英語)を参照。
- *5 Kinect v1ではNear Modeで0.4m~、Extended Depthで~10.0mまで取得ができるが、Kinect v2ではこのように設定を変えることなく広い範囲でDepthデータを取得できるようになった。ただし、Depthデータの精度がある程度保証できるのは0.5~4.5mの範囲だ。
Kinect v1、v2ともに取得できるPlayer(=人物領域)は6人である。Kinect v2では、Depthセンサーの解像度が向上していることもあり、Playerデータを用いた単純な切り抜きでもきれいに背景と人物を分離できる。
Kinect v1は全てのJoint(=関節)が取得できるSkeletonは2人までだったが、Depthセンサーの解像度の向上や画角が広くなったこともあり、Kinect v2では6人まで取得できるようになった。
また、取得できるJointはKinect v1では1人につき20Jointであったが、Kinect v2では25Joint取得できるようになっている。具体的には図6に示すように首(=NECK)と指先(=HAND_TIP_LEFT、HAND_TIP_RIGHT)、親指(=THUMB_LEFT、THUMB_RIGHT)の5カ所が追加されている。手の位置だけでなく、親指や指先といった細かい情報まで取得できるようになった。
Hand State(=手の開閉状態)の認識は、Kinect v1ではDeveloper Toolkitの「Kinect Interaction」というライブラリでサポートされていたが、Kinect v2ではSDKが標準でサポートしている。
Kinect v1には首を振るためのチルトモーターが搭載されていたが、画角が広がったこともあり、Kinect v2にはチルトモーターは搭載されず、手動で首を振るようになっている。
Kinect v1は複数のアプリケーションが同時に同じセンサーに接続することはできなかった。Kinect v2では「Kinect Service」を介することで、複数のアプリケーションが同時に同じセンサーからデータを取得できる(図7を参照)。
Kinect v1とKinect v2 の動作要件の比較表(表2)を示す。
Kinect v1 | Kinect v2 | |
---|---|---|
OS | Windows7以降 | Windows 8以降 (x64) |
コンパイラ(Compiler) | Visual Studio 2010以降 | Visual Studio 2012以降 |
接続端子(Connector) | USB 2.0 | USB 3.0 |
CPU | Dual-Core 2.66GHz | Intel Core i7 3.1GHz 以上 |
GPU | DirectX 9.0c | DirectX 11.0 |
RAM | 2.0GB 以上 | 4.0 GB 以上 |
Kinect v1はWindows 7以降で動作したが、Kinect v2はWindows 8以降で動作する。それに合わせてVisual Studioも2012以降のバージョンを要求されている。
Kinect v1はUSB 2.0(またはより速いUSB)で動作したが、Kinect v2ではセンサーの解像度が向上したこともあり、より速いUSB 3.0でのみ動作する。USBのバス帯域を専有することはKinect v1もKinect v2も変わらない。
これはKinect v1でも報告されていたが、Kinect v2でもUSB 3.0のホストコントローラーの相性により正常に動作しないことがある。現状ではRenesasとIntelのUSB 3.0ホストコントローラーで動作する。デスクトップPCであればUSB 3.0拡張カードを増設することで対応できる*6。
- *6 Kinect for Windows SDK v2.0には「Kinect v2 Configuration Verifier」というシステム検証ツールが含まれている。お使いのPCに搭載されているUSB 3.0ホストコントローラーがKinect v2に対応しているか確認することができる。
また、MSDN Forumや著者のサイトでは動作確認された製品の情報がまとめられているので、これらを参考に開発環境を整えるとよいだろう。
CPUはIntel Core i7 3.1GHz以上を要求されている。「動作周波数が少し低い」など動作要件を多少下回っても余程のことがなければ動作するが、センサーの解像度が向上するにつれて取得したデータの処理コストも上がっていることに注意しなければならない。
Kinect v1ではDirectX 9.0c以降をサポートするGPU*7を要求されていたが、Kinect v2ではDirectX 11.0以降をサポートするGPUが要求されている。Kinect v1ではセンサーが取得したデータをCPUで処理していたが、Kinect v2ではこれをGPUで処理するためDirectX 11.0移行をサポートするGPUが必須になる。
ノートPCにはNVIDIA GeForceやAMD Radeonのような外付けのGPU(dGPU)を搭載していないものも多いが、DirectX 11.0以降をサポートしていればIntel HD Graphicsのようなプロセッサ内蔵のGPU(iGPU)でも動作する。
- *7 Kinect FusionはGPUで処理しているため、Kinect v1でもDirectX 11.0をサポートするGPUが要求されていた。
センサーの購入
Kinect for Windows v2はMicrosoft Storeなどで購入できる。
また、Kinect for Xbox OneをPCに接続するためのアダプターが発売されており、Xbox OneのKinectを流用することもできる*8。
- *8 Kinect for Xbox 360は商用利用が認められていなかったが、Kinect for Xbox One + Kinect Adapter for Windowsは商用利用が認められている。
開発環境の構築
Kinect v2のソフトウェア開発キットとしてKinect for Windows SDK v2.0(以降Kinect SDK v2)が無償で提供されている。Kinect v1のKinect for Windows SDK v1.x(以降Kinect SDK v1)とは互換性はないので注意してほしい*9。
- *9 Kinect v1を使ったアプリケーションを開発するには、これまで通りKinect SDK v1.xを使う。
また、Kinect SDK v1では開発支援ツールやサンプルプログラム、ライブラリなどを含むKinect for Windows Developer Toolkitが提供されていたが、これらはKinect SDK v2に含まれるようになった。
開発環境の構築手順を簡単に説明しておこう。
1Visual Studioのダウンロード、インストール
Visual Studio 2012または2013をインストールする。無償で提供されているVisual Studio ExpressやVisual Studio Communityでも開発できる(※利用に際しては、それぞれの製品のライセンスに従ってほしい)。
- Visual Studio Express 2013 for Windows Desktop | Visual Studio Center
- Visual Studio Community 2013 | Visual Studio Center
2Kinect SDK v2のダウンロード、インストール
Kinect SDK v2は以下のリンク先のサイトからダウンロードできる。
インストーラー(KinectSDK-v2.0_1409-Setup.exeファイル)を起動して、SDKをインストールする。インストール後、Kinect v2をPCに接続するとドライバーがインストールされ、利用できる状態になる。
ここで、アプリ一覧からSDK Browser (Kinect for Windows) v2.0を開いてサンプルプログラムを実行してみよう。正常にデータを取得できていることを確認してほしい。
3OpenCVのダウンロード、インストール
次回から紹介するサンプルプログラムではコンピュータービジョン向けライブラリOpenCVを利用している。OpenCVの設定については、著者のサイトを参照してほしい。
また、OpenCVの詳しい使い方については、連載「OpenCV入門」がわかりやすいので参照してほしい。
まとめ
Kinect v1とKinect v2のセンサー仕様や動作要件を徹底的に比較した。
次回からはKinect SDK v2を使ったC++でのプログラミング方法について、v1とv2を比較しながら紹介していく。
※以下では、本稿の前後を合わせて5回分(第1回~第5回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
1. 【現在、表示中】≫ Kinect v1とKinect v2の徹底比較
Kinect for Windowsの旧版と、次世代型の新版を比較しながら、進化したハードウェア&ソフトウェアをC++開発者向けに紹介する(正式版に対応させた改訂連載スタート)。今回はセンサー仕様や動作要件を徹底的に比較する。
2. Kinect v2プログラミング(C++) - Color編
Kinect SDK v2で、データを取得する基本的な流れを説明。Color画像を取得するサンプルプログラムを紹介する。正式版に合わせて改訂。
4. Kinect v2プログラミング(C++) - BodyIndex編
Kinect SDK v2で、BodyIndex(人物領域)を取得する方法を、サンプルコードを示しながら説明する(正式版に合わせて改訂)。
5. Kinect v2プログラミング(C++) - Body編
Kinect SDK v2に実装されている主要な機能の紹介は、一通り完了。今回は、Body(人物姿勢)を取得する方法を説明する(正式版に合わせて改訂)。