Loading…
OpenCV 9 -WITH_K4W cv::VideoCapture Kinect for Windows SDK Support-

※ WITH_K4Wは私が作成したモジュールであり,OpenCV公式の対応ではありません.
【WITH_K4Wとは】
OpenCVのcv::VideoCaptureでKinect for Windows SDKをサポートするWITH_K4Wを作成しました.
OpenCV 2.2からサポートされているOpenNI(WITH_OPENNI)と同様にKinectからのRGB,DepthフレームをOpenCVで簡単に取得できます.
WITH_OPENNIについてはこの記事を参照してください.
WITH_OPENNIについてはこの記事を参照してください.
OpenNI Advent Calendar 2011/12/2 - OpenCVによるOpenNIサポートの環境構築~利用方法 -
OpenNIではKinect Sensor for Windowsを現在利用できないためWITH_OPENNIでもサポート外です.(一部例外あり)
WITH_K4WではKinect for Windows SDKをベースにしているためKinect Sensor for Windows(またはfor XBOX360)を使うことができます.
また,Kinect for Windows SDK独自の機能(Near Mode,Skeleton,…など)にも対応できます.
(※ WITH_K4W version1.0.0 未実装)
(※ WITH_K4W version1.0.0 未実装)
【動作環境】
Kinect for Windows SDKが動作する環境
http://www.microsoft.com/en-us/kinectforwindows/develop/overview.aspx
【ダウンロード】
以下のリンクからダウンロードできます.
【WITH_K4Wの環境構築】
同梱のReadMe.txtを参照してください.
OpenCV-2.3.1-win-superpack.exe,OpenCV-2.4.0-beta2.exe向けのファイルが同梱してあります.
OpenCV SVN(trunk,branch)お使いになる場合は適宜書き換えることで動作します.
【WITH_K4Wの使い方】
同梱のSampleプログラム及びReadme.txtを参照してください.
以下はSampleプログラム(version 1.0.0)の内容です.
これだけでKinect for Windows SDKを通してKinect Sensor for WIndows(またはfor XBOX360)からRGB,Depthフレームを取得,表示できます.
#include "stdafx.h"
#include <opencv2/opencv.hpp>
int _tmain(int argc, _TCHAR* argv[])
{
cv::VideoCapture capture(CV_CAP_K4W);
if(!capture.isOpened()){
return -1;
}
int depth_maximum = static_cast<int>(capture.get(CV_CAP_K4W_DEPTH + CV_CAP_PROP_K4W_FRAME_MAX_DEPTH));
while(1){
capture.grab();
cv::Mat rgb8U;
capture.retrieve(rgb8U, CV_CAP_K4W_COLOR_IMAGE);
cv::Mat depth16U;
capture.retrieve(depth16U, CV_CAP_K4W_DEPTH_IMAGE);
//capture >> depth16U;
cv::Mat depth8U;
depth16U.convertTo(depth8U, CV_8UC1, -255.0/depth_maximum, 255.0);
cv::imshow("K4W - Depth", depth8U);
cv::imshow("K4W - RGB" , rgb8U);
if(cv::waitKey(30) == VK_ESCAPE){
break;
}
}
cv::destroyAllWindows();
return 0;
}
【おわりに】
OpenCVのカメラキャプチャクラスcv::VideoCaptureでKinect for Windows SDKをサポートするWITH_K4Wを作りました.
現在はミニマムサポートですが,今後機能を追加していこうと思います.
また,実装やテストが完了次第,OpenCV公式に機能提案できたらいいなと思っています.
そのため,ライセンスはOpenCVに準じます(BSDライセンス).
質問やバグなどありましたらコメントやメールなどでお知らせ頂ければ幸いです.
【参考文献】
- 関連記事
- OpenCV 9 -WITH_K4W cv::VideoCapture Kinect for Windows SDK Support-
- OpenCV 8 -導入(OpenCV 2.2)-
- OpenCV 7 -Kinect1-
書籍「KINECT for Windows SDKプログラミング C#編」レビュー

【はじめに】
2012/2にKinect Sensor for Windows / Kinect for Windows SDK v1.0正式版が発売 / リリースされました.
特徴を簡単におさらいしておくと,
・ 商用利用可能
ライセンスはKinect Sensor for Windowsデバイスに付与.
特に気になる制限は無く商用に使える.
・ Near Mode搭載
Depthの計測可能範囲がDefault Modeで800mm~4000mm,
Near Modeで400mm~3000mmの計測が可能になった.
といったことが挙げられます.
詳しくはこちらの記事(http://kgxpx834.blog58.fc2.com/blog-entry-28.html)をご覧下さい.
Depthの計測可能範囲がDefault Modeで800mm~4000mm,
Near Modeで400mm~3000mmの計測が可能になった.
といったことが挙げられます.
詳しくはこちらの記事(http://kgxpx834.blog58.fc2.com/blog-entry-28.html)をご覧下さい.
さて,まだKinect for Windows SDK v1.0正式版がリリースされて約2ヶ月足らずですが,こちらに対応した書籍「KINECT for Windows SDKプログラミング C#編」が2012/3/28に発売になります.
著者の中村薫さん(@kaorun55)にお声を掛けて頂き,私も本書籍の執筆段階から微力ながら関わらせて頂きました.
このたび献本を頂いたので,書籍を紹介させて頂きます.
「KINECT for Windows SDKプログラミング C#編」 http://amzn.to/GMrIsA
Kinect SDK の本を書くとして、C#はいるよね。C++はいる?あと、どういうのが載ってると嬉しい?皆さんの応答を求む。割と真面目
― 中村 薫さん (@kaorun55) 1月 11, 2012このときは企画段階で内密だったのです.そこに何も知らない(Kinect SDK本と聞いてハイテンションの)私が…
@kaorun55 Kinect SDK本をお書きになるんですか!?光の速さで予約します(`・ω・´)ゞ …言語はC#とC++がベターですかね.トピックは骨格情報を使うものと深度情報を使うものとでバランスよく取り上げて頂きたいですね.アバターを動かすとかポイントクラウド表示とか…
― UnaNancyOwenさん (@UnaNancyOwen) 1月 11, 2012という空気を読まない若干ネタバレ的なツイートをしてしまいました.この後お誘いを頂き書籍に関わらせて頂きました.
【内容紹介(思ったことをそのまま書いています)】
第1章
Kinect for Windows SDKはC++及びC#を想定して作られているライブラリです.
書籍はKinect for Windows SDKをC#から扱う方法を紹介しています.
個人的に使ってみて,Kinect for Windows SDKはC++よりもC#から扱いやすい設計になっていると感じました.
また,C#(.NET)という言語の特性上GUIをとても楽に作ることができます.
書籍では,主に.NET Framework 3.0以降から搭載されているWPF(Windows Presentation Foundation)を使っています.
書籍ではWPFのXAMLをそのまま記述/掲載していますが,簡単なものなので直ぐに理解できます.
また,Microsoft Expression Blend(http://amzn.to/H0k8Ff)を使うとWPFで直感的にGUIをデザインすることができます.
個人的に使ってみて,Kinect for Windows SDKはC++よりもC#から扱いやすい設計になっていると感じました.
また,C#(.NET)という言語の特性上GUIをとても楽に作ることができます.
書籍では,主に.NET Framework 3.0以降から搭載されているWPF(Windows Presentation Foundation)を使っています.
書籍ではWPFのXAMLをそのまま記述/掲載していますが,簡単なものなので直ぐに理解できます.
また,Microsoft Expression Blend(http://amzn.to/H0k8Ff)を使うとWPFで直感的にGUIをデザインすることができます.
もちろん以前からのWindows Formsを使う方法も書籍で紹介されています.
ただし書籍には,C#・WPF自体の説明はあまりありません.
ただし書籍には,C#・WPF自体の説明はあまりありません.
しかし,本書籍で使われているC#・WPFプログラムは決して難しいものではありません.
少しプログラムを噛った経験があれば直ぐに理解できると思います.
私もC#・WPFは全く触ったことがありませんが,特に苦もなく(なんとなく)理解しながら読むことができます.
C#,WPFを詳しく知りたい人は他のWebや書籍で勉強して頂くことになりますが,C#は他言語に比べ初心者が入門し易い言語ではないかと思います.
特にIDE Visual C#による強力なプログラミングサポート,GUIアプリケーションの作り易さは素晴らしいと思います.
Microsoftが一番力を入れている言語なのではないでしょうか?
書籍1章では,Visual C#を使ってプログラムを作るまでの準備を丁寧に説明しています.
画像が豊富に使われているので,初心者の方でも迷わずにセットアップできると思います.
第2章
私もC#・WPFは全く触ったことがありませんが,特に苦もなく(なんとなく)理解しながら読むことができます.
C#,WPFを詳しく知りたい人は他のWebや書籍で勉強して頂くことになりますが,C#は他言語に比べ初心者が入門し易い言語ではないかと思います.
特にIDE Visual C#による強力なプログラミングサポート,GUIアプリケーションの作り易さは素晴らしいと思います.
Microsoftが一番力を入れている言語なのではないでしょうか?
書籍1章では,Visual C#を使ってプログラムを作るまでの準備を丁寧に説明しています.
画像が豊富に使われているので,初心者の方でも迷わずにセットアップできると思います.
第2章
書籍2章では,基本編としてKinect for Windows SDKの機能を簡単なサンプルプログラムと共に説明しています.
サンプルプログラムに使われている主要なAPIも丁寧に説明されており,API仕様・使い方を把握できると思います.
2章を通して読んで頂ければ,KinectのRGB,Depth,Player,Skeleton,Audio,and more...を一通り扱えるようになります.
第3章
サンプルプログラムに使われている主要なAPIも丁寧に説明されており,API仕様・使い方を把握できると思います.
2章を通して読んで頂ければ,KinectのRGB,Depth,Player,Skeleton,Audio,and more...を一通り扱えるようになります.
第3章
書籍3章では,応用編としてKinectを用いた様々なサンプルアプリケーションをソースコードと共に解説しています.
サンプルはKinectを使う人が欲しいと思えるようなものを取り揃えていると思います.
OpenCVとの連携の仕方と顔検出にSkeleton位置情報の補助を用いて簡単に高精度化,高速化するサンプルを紹介しています.(書籍では「認識」と書かれていますが,正確には「検出」ですね^^; 見落としていましたw)
また,Depthを用いたタッチスクリーンやSletonを用いたマウス,音声認識などNUI(Natural User Interface)を実現する基礎技術になる部分も具体的アプリケーションで実現方法を紹介しています.
また,簡単なジェスチャーとしてポーズを認識する方法も紹介しています.
ここでは,自然動作(普段の連続的な動作)に現れ難いものとして,腕をクロスさせるポースを認識するサンプルを紹介しています.
Kinect for Windows SDKにはOpenNIのNITEにあたるジェスチャー認識モジュールは無いので自分で実装する必要があります.
ここからド素人意見ですが,ジェスチャー認識の難しいところに,
・自然な動作(非ジェスチャー)か任意の動作(ジェスチャー)かを区別し難い
・連続した動作の中でジェスチャーの開始・終了を検出し難い
・ある程度違う動きを許容しなければならない
などがあると思います.
書籍で紹介されているサンプルでは,これらをクリアできるポーズに限定することで解決しています.
しかし,実際に使うことを考えると,腕をクロスさせるポーズはあまりに不自然です.
実用を考えるともっと自然なジェスチャーを取り入れたいですね.
自然なジェスチャーを取り入れるために有効だと思うキーワードとして,
サンプルはKinectを使う人が欲しいと思えるようなものを取り揃えていると思います.
OpenCVとの連携の仕方と顔検出にSkeleton位置情報の補助を用いて簡単に高精度化,高速化するサンプルを紹介しています.(書籍では「認識」と書かれていますが,正確には「検出」ですね^^; 見落としていましたw)
また,Depthを用いたタッチスクリーンやSletonを用いたマウス,音声認識などNUI(Natural User Interface)を実現する基礎技術になる部分も具体的アプリケーションで実現方法を紹介しています.
また,簡単なジェスチャーとしてポーズを認識する方法も紹介しています.
ここでは,自然動作(普段の連続的な動作)に現れ難いものとして,腕をクロスさせるポースを認識するサンプルを紹介しています.
Kinect for Windows SDKにはOpenNIのNITEにあたるジェスチャー認識モジュールは無いので自分で実装する必要があります.
ここからド素人意見ですが,ジェスチャー認識の難しいところに,
・自然な動作(非ジェスチャー)か任意の動作(ジェスチャー)かを区別し難い
・連続した動作の中でジェスチャーの開始・終了を検出し難い
・ある程度違う動きを許容しなければならない
などがあると思います.
書籍で紹介されているサンプルでは,これらをクリアできるポーズに限定することで解決しています.
しかし,実際に使うことを考えると,腕をクロスさせるポーズはあまりに不自然です.
実用を考えるともっと自然なジェスチャーを取り入れたいですね.
自然なジェスチャーを取り入れるために有効だと思うキーワードとして,
・UIデザイン,ジェスチャーデザイン
・自己相関(共起確率?)
・機械学習
などがあるのではないでしょうか?
これからジェスチャーを使いたいと考えている人は実装のヒントとして調べてみてはどうでしょうか?
是非,UIなどの専門の方にKinect for Windows SDK向けのジェスチャー認識モジュールを作って欲しいですね.
この他にも,ロボットを操作したり,身長を測ったり,音声を使ったりなど面白いサンプルが沢山含まれています.
応用例が多く紹介されているのもこの書籍の特徴ですね.
第4章・第5章
書籍4章5章では,便利な外部ライブラリの導入・使い方とKinect for Windows SDKのAPIを紹介しています.
現在,Kinectに関する多くの情報は英語です.
この書籍では当然日本語で書かれているので,英語のマニュアルと睨めっこするのが苦手な人には,辞書が代わりに使えると思います.
一部ですが,良い日本語での言い回しが思いつけなかった部分があるのが心残りです.
ニュアンスは伝わると思いますが,気になるようなら英語版のマニュアルにも目を通してみて下さい.
第6章
最後の6章では,ユーザビリティについて書かれています.
Kinectは,今までに一般ユーザーが触ることがなかったタイプのデバイスです.
Kinectを使ったアプリケーションのUIデザインも今までにない新しい考え方をしなければならないでしょう.
ユーザビリティを考えて上手くUIをデザインすることでアプリケーションは飛躍的に使いやすく,誰でも直感的に操作できるようになります.
個人的にはKinectを上手く活用できるUIを持つアプリケーションはまだ1つも登場していないように感じています.
現在,Kinectに関する多くの情報は英語です.
この書籍では当然日本語で書かれているので,英語のマニュアルと睨めっこするのが苦手な人には,辞書が代わりに使えると思います.
一部ですが,良い日本語での言い回しが思いつけなかった部分があるのが心残りです.
ニュアンスは伝わると思いますが,気になるようなら英語版のマニュアルにも目を通してみて下さい.
第6章
最後の6章では,ユーザビリティについて書かれています.
Kinectは,今までに一般ユーザーが触ることがなかったタイプのデバイスです.
Kinectを使ったアプリケーションのUIデザインも今までにない新しい考え方をしなければならないでしょう.
ユーザビリティを考えて上手くUIをデザインすることでアプリケーションは飛躍的に使いやすく,誰でも直感的に操作できるようになります.
個人的にはKinectを上手く活用できるUIを持つアプリケーションはまだ1つも登場していないように感じています.
思っている以上に大切な要素なので,一度ユーザビリティを勉強してKinectを上手く活用できるUIを目指してみてはどうでしょうか?
【まとめ】
書籍全体を通してKinect for Windows SDK初心者が欲しいと思う情報を上手くピックアップしていると思います.
是非,書籍をお手に取って目を通して頂き,Kinectハックを始めてみては如何でしょうか?
また,C#編は初心者を強く意識した内容ですが,執筆中のC++編は高度な使い方を意識した内容となるようです.
サンプルプログラムも(たぶん...)ガラリと内容が変わることでしょう.
どちらか1冊でも満足頂ける,2冊とも買っても損しない内容になると思います.
長々と書きましたが以上でレビューを終わります.
【他の書籍】
Kinect for Windows SDKの書籍として以下の書籍も発売されています.
・「Beginning Kinect Programming With the Microsoft Kinect SDK」(2012/2/29発売)
【購入】
書籍やKinectは以下のページから購入することができます.
【他の書籍】
Kinect for Windows SDKの書籍として以下の書籍も発売されています.
・「Beginning Kinect Programming With the Microsoft Kinect SDK」(2012/2/29発売)
Kinect for Windows SDKの英語の解説書籍です.
「KINECT for Windows SDKプログラミング C#編」と同様にC#+WPFで解説しています.
各機能の基本を抑える他,ジェスチャーやNUIの解説・スワイプやプッシュといった基本的なジェスチャーの実装方法,Kinectプログラミングに必要な数学などが紹介されています.
特に第6章のジェスチャーは必読だと思います.
「KINECT for Windows SDKプログラミング C#編・C++編」を読んでKinect for Windows SDKプログラミングの基本を抑え,応用として「Beginning Kinect Programming With the Microsoft Kinect SDK」を読んでジェスチャーの知識や実装を抑えるのがオススメです.
【購入】
書籍やKinectは以下のページから購入することができます.
【参考】
1.) かおるんダイアリー - Kinect for Windows SDK の C# 向け入門書籍を書きました
http://d.hatena.ne.jp/kaorun55/20120324/1332588117
2.) 秀和システム | 書籍情報 | KINECT for Windows SDK プログラミング C#編
http://www.shuwasystem.co.jp/products/7980html/3326.html
3.) Microsoft Kinect for Windows SDK
http://www.microsoft.com/en-us/kinectforwindows/
3.) Microsoft Kinect for Windows SDK
http://www.microsoft.com/en-us/kinectforwindows/
- 関連記事
- 書籍「KINECT for Windows SDKプログラミング C#編」レビュー
- Kinect 3 -Kinect for Windows SDK-
- OpenNI Advent Calendar 2011/12/21 - KinectFusion -
Kinect 3 -Kinect for Windows SDK-

【Kinect for Windowsとは…】
Kinect for Windowsは,XBOX360向けに発売されたKinect SensorをWindows向けに使うプロジェクトです.(略称K4W)
Kinect Sensorがどういったものかの詳細は各記事を参照して下さい.
Kinect SensorにはRGBカメラとDepthカメラ,Microphone Arrayが搭載されています.
XBOX360向けに発売されたKinect Sensor for XBOX360とWindows向けに発売されたKinect Sensor for Windowsの違いは,Depthカメラの計測範囲です.
Depthカメラの計測範囲をデスクトップ向けに調整できるようにしたものがKinect Sensor for Windowsになります.
また,デバイスの発売と同時にソフトウェア開発キットが正式版としてリリースされました.
Kinect for Windows SDK 1.0 正式版では,Kinect Sensor for Windowsを使った商用アプリケーションの開発が可能になっています.
同時にβ版から多くのAPIが改良,追加されています.
これを機会に個人,企業,業界を問わず多くのKinectアプリケーションが開発されることを願っています.
※ Kinect Sensor for Windowsが日本でも発売されました.(2012/2/2)
http://amzn.to/wKTGUX
※ 英語の解説書籍「Beginning Kinect Programming With the Microsoft Kinect SDK」が発売されました.(2012/2/29)
http://amzn.to/I2qNPj
※ 日本語の解説書籍「KINECT for Windows SDKプログラミング C#編」が発売されました.(2012/3/28)
http://amzn.to/GMrIsA
※ 英語のKinectなどのDepth Sensorの解説書籍「Time-of-flight Cameras and Microsoft Kinect」が発売されました.(2012/4/30)
http://amzn.to/ILhbeW
【Kinect for Windows SDKとSensorの関係】
Kinect for Windows SDKでは,開発者はKinect Sensor for Windowsは勿論のことKinect Sensor for XBOX360を使ってもアプリケーションを開発することができます.
ただし,開発されたアプリケーションを使うエンドユーザーはKinect Sensor for Windowsのみ利用できます.
また,Kinect Sensor for XBOX360でも開発はできますが,Depthカメラの計測範囲が従来のDefault Mode(800[mm]~4000[mm])でしか使えません.
Near Mode(400[mm]~3000[mm])はKinect Sensor for Windowsのみ利用できます.
この関係を以下の表に纏めました.

http://download.microsoft.com/download/E/E/2/EE2D29A1-2D5C-463C-B7F1-40E4170F5E2C/KinectRuntime-v1.0-Setup.exe
【Kinect for Windowsライセンス】
ライセンスは,Kinect Sensor for WindowsとKinect for Windows SDKの組み合わせのみ商用可能です.
ただし,先述のように開発に限りKinect Sensor for XBOX 360を使うことができます.
ライセンス関係を以下の表に纏めました.

※ Microsoft Kinect for Windows Software Development Kit (SDK) License
http://www.microsoft.com/en-us/kinectforwindows/develop/sdk-eula_ja-jp.aspx
【Kinect for Windows SDK】
動作環境は,以下のとおりです.
・Microsoft Windows 7,Windows Embedded Standard 7,Windows 8 Developer Preview
・Microsoft Visual Studio 2010
・Dual-core 2.66GHz 以上のCPU
・USB 2.0
・2GB以上のRAM
Kinect for Windows SDKは以下のページからダウンロードできます.
Kinect for Windows
http://www.microsoft.com/en-us/kinectforwindows/develop/overview.aspx
ダウンロードしたインストーラー(KinectSDK-v1.0-Setup.exe)からSDKをインストールします.
途中にMicrosoft Visual C++ 2010 再頒布可能パッケージのインストール画面が開くので,インストールして下さい.

SDKインストール後,Kinect Sensorを接続するとドライバがインストールされます.

サンプルプログラムやドキュメントは,[スタートメニュー] > [すべてのプログラム] > [Microsoft Kinect SDK v1.0]のKinect SDK Sample Browserから起動/閲覧することができます.

Visual Studioのプロジェクト(C++)には以下のプロパティシートをダウンロードして設定して下さい.
※ プロパティシートは間違っている可能性もあります.
※ $(KINECTSDK10_DIR)が認識されない場合は,C:\Program Files\Microsoft SDKs\Kinect\v1.0\に変更して下さい.
・インクルードディレクトリ/追加のインクルードディレクトリ
$(KINECTSDK10_DIR)inc
・ライブラリディレクトリ/追加のライブラリディレクトリ
$(KINECTSDK10_DIR)lib\x86 …x86
$(KINECTSDK10_DIR)lib\amd64 …x64
・追加の依存ファイル
Kinect10.lib
以下のヘッダファイルをインクルードします.
#include <Windows.h>
#include <NuiApi.h>
【名古屋CV・PRML勉強会】
第14回 名古屋CV・PRML勉強会(2012/2/18 http://bit.ly/yQMNCb)でKinect for Windowsの紹介をしました.
(SkyDrive)
https://skydrive.live.com/redir.aspx?cid=f7e757e0702c7903&resid=F7E757E0702C7903!277&parid=F7E757E0702C7903!273
(SlideShare)
http://www.slideshare.net/SugiuraTsukasa/14cvprml-kinect-for-windows-11635401
【サンプルプログラム】
内容は以下の通りです.
・Sample_01.cpp
Kinectから取得したRGB画像と位置合わせをしたDepth画像を表示する.
Player,Skeletonを使わない一番単純なサンプルです.
・Sample_02.cpp
Kinectから取得したRGB画像と位置合わせをしたDepth画像,Player画像,Skeleton画像を表示する.
サンプルプログラムは以下のリンクからダウンロードして下さい.
【書籍】
・「KINECT for Windows SDKプログラミング C#編」(2012/3/28発売)
・「KINECT for Windows SDKプログラミング C++編」(発売予定)
Kinect for Windows SDKの正式版v1.0がリリースされ,初のKinect for Windows SDK解説本になります.
著者の中村薫さん(@kaorun55)にお声を掛けて頂き,私も微力ながら関わらせて頂きました.
詳しいレビューはこちらの記事を参照して下さい.
http://kgxpx834.blog58.fc2.com/blog-entry-29.html
・「Beginning Kinect Programming With the Microsoft Kinect SDK」(2012/2/29発売)
Kinect for Windows SDKの英語の解説書籍です.
「KINECT for Windows SDKプログラミング C#編」と同様にC#+WPFで解説しています.
各機能の基本を抑える他,ジェスチャーやNUIの解説・スワイプやプッシュといった基本的なジェスチャーの実装方法,Kinectプログラミングに必要な数学などが紹介されています.
特に第6章のジェスチャーは必読だと思います.
「KINECT for Windows SDKプログラミング C#編・C++編」を読んでKinect for Windows SDKプログラミングの基本を抑え,応用として「Beginning Kinect Programming With the Microsoft Kinect SDK」を読んでジェスチャーの知識や実装を抑えるのがオススメです.
・「Time-of-flight Cameras and Microsoft Kinect」(2012/4/30発売)
ToF方式やLight Coding方式(Kinect)のDepthカメラの英語の技術書籍です.
Kinectを使う上で知っておきたいDepthカメラの仕組みからRGB-Depthのキャリブレーション(位置合わせ),Depthの超解像,セグメンテーションなどのDepthカメラを使った応用事例を数式を交えて説明しています.
Kinectを使った研究やアプリケーション開発を考えている人には必須の知識なので一度目を通しておくといいかもしれません.
【おわりに】
Kinect for Windows SDKやサンプルプログラムなどの質問,リクエスト等あればコメント欄に記述下さい.
【参考文献】
- 関連記事
- 書籍「KINECT for Windows SDKプログラミング C#編」レビュー
- Kinect 3 -Kinect for Windows SDK-
- OpenNI Advent Calendar 2011/12/21 - KinectFusion -
OpenNI Advent Calendar 2011/12/21 - KinectFusion -

※ 本記事はOpenNI Advent Calendar(2011/12/21 http://atnd.org/events/22725)への参加記事です.
※ 曖昧な記述が多いので参考程度にご覧下さい.
【KinectFusionとは…】
Kinect FusionはMicorosoft ResearchがIEEE ISMAR2011(2011/10),ACM SIGGRAPH2011(talk)(2011/10)といったトップカンファレンスで発表しました.
高度なインタラクションのためにKinectを用いて高精度に3次元形状を再構成することを目的としている手法です.
例えば,ARでCGを重畳表示するような場面では,今まで平面としてしか認識できなかったところ,KinectFusionを使うことで凹凸などが認識でき,その認識した形状により重畳するCGに影響を与えるなど,より高度な重畳表示をすることができます.
この論文はISMAR2011のBEST S&T PAPER AWARDを受賞しています.
例えば,ARでCGを重畳表示するような場面では,今まで平面としてしか認識できなかったところ,KinectFusionを使うことで凹凸などが認識でき,その認識した形状により重畳するCGに影響を与えるなど,より高度な重畳表示をすることができます.
この論文はISMAR2011のBEST S&T PAPER AWARDを受賞しています.
詳しくは論文が公開されているので御覧ください.
難しいことはあとにして,まずは動画を見るとその凄さがわかると思います.
Microsoft Research - KinectFusion Project Page
http://research.microsoft.com/en-us/projects/surfacerecon/
Microsoft Research - KinectFusion Project Page
http://research.microsoft.com/en-us/projects/surfacerecon/
このKinect FusionのクローンプロジェクトとしてPCL(Point Cloud Library)ではKinfuというモジュールを開発しています.
先日,このKinfuの開発版が使えるようになったと発表されました.
※ あくまでも開発版です.
PCLに関してはこちらで丁寧に紹介されています.
PCLに関してはこちらで丁寧に紹介されています.
【動作確認環境】
OS:Microsoft Windows7 Ultimate SP1 64-bit
IDE:Micorosoft Visual Studio Professional SP1 (C++)
CPU:Intel Core i7 2600K
CPU:Intel Core i7 2600K
GPU:NVIDIA GeForce GTX580
(※ おそらくcompute capability 2.0以上のGPUが必要です.)
(※ おそらくcompute capability 2.0以上のGPUが必要です.)
PCL:PCL SVN/trunk revision 3580
Eigen:Eigen 3.0.3
FLANN:FLANN 1.6.11 64-bit
Boost:Boost 1.47.0 64-bit
VTK:VTK 5.8.0(static) 64-bit
CUDA:NVIDIA CUDA Toolkit 4.0 64-bit
VTK:VTK 5.8.0(static) 64-bit
CUDA:NVIDIA CUDA Toolkit 4.0 64-bit
Graphics Driver:NVIDIA GeForce Driver 275.33
OpenNI:OpenNI 1.3.2(PCLMod) 64-bit
SensorKinect:Sensor 5.0.3.3(PCLMod) 64-bit
KinectDriver:avin2-SensorKinect-2d13967
CMake:CMake 2.8.6
CMake:CMake 2.8.6
SVN:TortoiseSVN 1.6.16
【環境設定】
1. CUDA関連をインストールする.
※ cuda.lib,cudart.libが必要なみたいです.
※ CUDA Toolkit 4.0 Build Customization BUG FIX Updateを適用しておくこと.
2. PCL/3rdPartyをダウンロード/インストールする.
以下の3rdPartyはPCLのダウンロードページから対応バージョンをすることができる.
今回は,All-in-one installerを使ってインストールした.
・FLANN
・Boost
・VTK
・Eigen
・OpenNI/SensorKinect
(※ OpenNI/SensorKinectはPCLModになります.OpenNI.orgが配布するものではありません.)
※ All-in-one installerを使うと一度にインストールすることができます.
All-in-one installerでは以下のようにインストールされます.
C:\Program Files
├─PCL 1.3.0
│ ├─3rdParty
│ │ ├─Boost
│ │ ├─Eigen
│ │ ├─flann
│ │ ├─qhull
│ │ └─VTK 5.8.0
│ ├─bin
│ ├─cmake
│ ├─include
│ ├─lib
│ └─share
├─OpenNI
└─PrimeSense
└─SensorKinect
avin2/SensorKinectのDriverを別途インストールしておくこと.
avin2/SensorKinectのDriverを別途インストールしておくこと.
3. PCL/SVN/trunkからチェックアウトする.
TorroiseSVNを使い,PCL/SVN/trunkの最新リビジョンをチェックアウトする.
今回は,C:\Program Files\pclにチェックアウトした.
リポジトリのURL
http://svn.pointclouds.org/pcl/trunk
※ TortoiseSVNの使い方は以前の記事を参照してください.
http://kgxpx834.blog58.fc2.com/blog-entry-23.html
3rdPartyは2でインストールしたもの(C:\Program Files\PCL 1.3.0\3rdParty\~)を使うが,今回はチェックアウトしたディレクトリ(C:\Program Files\pcl\3rdParty\~)にコピーした.
以下のようなディレクトリ構成になる.
3rdPartyは2でインストールしたもの(C:\Program Files\PCL 1.3.0\3rdParty\~)を使うが,今回はチェックアウトしたディレクトリ(C:\Program Files\pcl\3rdParty\~)にコピーした.
以下のようなディレクトリ構成になる.
C:\Program Files
├─pcl
│ ├─.svn
│ ├─_3rdParty (※ チェックアウトした3rdParty.これは使いません.)
│ │ ├─.svn
│ │ ├─eigen
│ │ ├─flann
│ │ ├─openni
│ │ ├─qhull
│ │ └─vtk
│ ├─3rdParty (※ PCL 1.3.0/3rdPartyからコピーした3rdParty.)
│ │ ├─Boost
│ │ ├─Eigen
│ │ ├─flann
│ │ ├─OpenNI
│ │ ├─qhull
│ │ └─VTK 5.8.0
│ ├─android
│ ├─apps
│ ├─cmake
│ ├─common
│ ├─cuda
│ ├─doc
│ ├─feature
│ ├─filters
│ ├─io
│ ├─kdtree
│ ├─keypoints
│ ├─octtree
│ ├─pcl
│ ├─people
│ ├─proctor
│ ├─range_image
│ ├─registration
│ ├─sample_consensus
│ ├─search
│ ├─segmentation
│ ├─surface
│ ├─test
│ ├─tools
│ ├─tracking
│ ├─visualization
│ ├─AUTHORS.txt
│ ├─CMakeLists.txt
│ ├─LICENSE.txt
│ ├─pcl_config.h.in
│ ├─PCLConfig.cmake.in
│ └─PCLConfigVersion.cmake.in
├─OpenNI
└─PrimeSense
└─SensorKinect
環境変数は適宜設定しておく.
※ BOOST_INCLUDEDIRを設定する必要がある.
※ BOOST_INCLUDEDIRを設定する必要がある.
BOOST_INCLUDEDIR C:\Program Files\pcl\3rd3rdParty\Boost\include
4. CMakeで環境を設定し,ソリューションを作成する.
各項目を埋めていく.
OpenCVは干渉するらしいのでPathを消しておく.
ステータスでkinfuがビルドされるように設定する.
Where is the source code:
Where is the source code:
C:/Program Files/pcl
Where to build the binaries:
C:/Program Files/pcl/build
EIGEN_INCLUDE_DIR
C:/Program Files/pcl/3rdParty/Eigen/include
FLANN_INCLUDE_DIR
C:/Program Files/pcl/3rdParty/Flann/include
FLANN_LIBRARY
C:/Program Files/pcl/3rdParty/Flann/lib/flann.lib
FLANN_LIBRARY_DEBUG
C:/Program Files/pcl/3rdParty/Flann/lib/flann-gd.lib
VTK_DIR
C:/Program Files/pcl/3rdParty/VTK 5.8.0/lib/vtk-5.8
CUDA_SDK_ROOT_DIR
C:/ProgramData/NVIDIA Corporation/NVIDIA GPU Computing SDK 4.0/C
CUDA_TOOLKIT_ROOT_DIR
C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v4.0
BUILD_CUDA
チェック
BUILD_gpu_segmentation
チェック
CUDA_ARCH_BIN
20
CUDA_ARCH_PTX
空白
BUILD_visualization
チェック
他はデフォルトだと思います.
※ CUDA_ARCH_BINはcompute capabilityを表しています.
GF100なら20,GF104なら21です.
お使いのGPUに合わせて設定してください.
http://developer.nvidia.com/
5. ビルドする.
生成されたPCL.slnを開き,バッチビルドでALL_BUILD,INSTALLを選択してビルドする.
生成されたPCL.slnを開き,バッチビルドでALL_BUILD,INSTALLを選択してビルドする.
※ 上手くビルド出来なかったりしたら,バッチビルドでkinfu-appプロジェクトのみを選択してビルドする.
依存するプロジェクトが一緒にビルドされます.
依存するプロジェクトが一緒にビルドされます.
kinfu-app.exeが生成されていれば成功です.
【ダウンロード】
ビルドしたもの(kinfu.zip)を置いておきます.
CUDA対応GPU,最新のNVIDIA Driver及びAvin2 SensorKinect DriverがインストールされたWindows環境で動作します.
(動かなかったらすみません…)
【kinfu】
生成されたkinfu-app.exeを実行する.
※ 3rdPartyのdllが必要になるが,環境変数Pathにパスを通すか実行ファイルと同じディレクトリにコピーすることで動作します.
キー入力でポイントクラウド表示やpcdファイル,plyファイルへの保存などができます.
保存したpcdファイルはビューワー(pcd_viewer.exe)で表示できます.
以下,私の机の周りで試してみた動画です.
http://youtu.be/CSZ1iznlTkE
【おわり】
発表されたばかりの最新の研究を手元で試すことができて嬉しいですね.
発表されたKinectFusionの動画と比べると若干荒い感じもします.
kinfuはまだPCLの開発版に搭載されたばかりなので,これから改良されていくでしょう.
このkinfu以外にもPCLでは3次元点群に必要な様々な処理が実装されています.
(各種フィルタリング,特徴抽出,表面構成,位置合わせ,フィッティング,領域分割,ビジュアライゼーション…など)
このkinfu以外にもPCLでは3次元点群に必要な様々な処理が実装されています.
(各種フィルタリング,特徴抽出,表面構成,位置合わせ,フィッティング,領域分割,ビジュアライゼーション…など)
簡単にOpenNIからの取得したデータを扱うこともできるので,KinectやXtionから取得した3次元点群を処理できます.
是非,PCLで3次元点群処理を楽しんでみてください.
また,似たようなライブラリとしてThe Mobile Robot Programming Toolkitというライブラリがあります.
The Mobile Robot Programming Toolkit http://www.mrpt.org/
こちらはロボットプログラミングに特化したライブラリでKinectをサポートしています.
後々紹介できたらいいなと思います.
【追記】
kinfuを使ったVision-based ARの実装(CGの重畳表示)をした動画がアップロードされています.
凹凸を考慮してCGを重畳表示したり,オクルージョンを考慮してCGを重畳表示している様子がわかります.
是非,PCLで3次元点群処理を楽しんでみてください.
また,似たようなライブラリとしてThe Mobile Robot Programming Toolkitというライブラリがあります.
The Mobile Robot Programming Toolkit http://www.mrpt.org/
こちらはロボットプログラミングに特化したライブラリでKinectをサポートしています.
後々紹介できたらいいなと思います.
【追記】
kinfuを使ったVision-based ARの実装(CGの重畳表示)をした動画がアップロードされています.
凹凸を考慮してCGを重畳表示したり,オクルージョンを考慮してCGを重畳表示している様子がわかります.
3.) momma wiki http://www.eml.ele.cst.nihon-u.ac.jp/~momma/wiki/wiki.cgi/Point%20Cloud%20Library.html
4.) KinectFusion Project Page http://research.microsoft.com/en-us/projects/surfacerecon/
- 関連記事
- Kinect 3 -Kinect for Windows SDK-
- OpenNI Advent Calendar 2011/12/21 - KinectFusion -
- OpenNI Advent Calendar 2011/12/8 - OpenNIの設定ファイルに関するTips -
OpenNI Advent Calendar 2011/12/8 - OpenNIの設定ファイルに関するTips -
※ 本記事はOpenNI Advent Calendar(2011/12/8 http://atnd.org/events/22725)への参加記事です.
【OpenNIの設定ファイルに関するTips】
3.) KINECTセンサープログラミング
【OpenNIの設定ファイルに関するTips】
OpenNIでは一般にデバイスの設定をXMLで記述した設定ファイルを用います.
設定ファイルをソースコードの中で以下のように読み込みOpenNIのコンテキストを初期化します.
xn::Context context;
XnStatus status = context.InitFromXmlFile("../SamplesConfig.xml");
if(status != XN_STATUS_OK){
std::cout << xnGetStatusString(status) << std::endl;
}
通常の方法(xn::Context::InitFromXmlFile())も含め,メリット/デメリットあるので利用シーンに応じて適切な方法を選ぶ必要があります.
2.) OpenNI Documentation http://openni.org/Documentation/このとき,設定ファイルを実行ファイルからの相対パスで指定したりします.
しかし,設定ファイルと実行ファイルのディレクトリ関係が崩れるたりすると,パスの違いにより設定ファイルを読み取ることができなくなります.
設定ファイルを確実に読み取るためには,
1. 設定ファイルをプログラム実行時にユーザーに指定させる.
1. 設定ファイルをプログラム実行時にユーザーに指定させる.
2. 設定ファイルをソースコード中に埋め込む.
などの方法が考えられます.
などの方法が考えられます.
1の方法は,設定ファイルをプログラム実行時にダイアログで指定させることで,パスの違いによる設定ファイルの読み取りミスを防ぎます.
設定ファイルは外部ファイルとしてプログラムとは独立しているため,設定を書き換えることも可能になります.
しかし,プログラム実行時にユーザーが毎回指定する煩わしさがあります.
2の方法は,設定ファイルの設定XMLを直接ソースコードの中で記述してしまうことにより,パスの違いによる設定ファイルの読み取りミスを防ぎます.
2の方法は,設定ファイルの設定XMLを直接ソースコードの中で記述してしまうことにより,パスの違いによる設定ファイルの読み取りミスを防ぎます.
プログラム実行時に指定する必要も無いため,ユーザーへの煩わしさは感じさせません.
しかし,設定XMLがプログラムに埋め込まれるため,設定を書き換えることができません.
通常の方法(xn::Context::InitFromXmlFile())も含め,メリット/デメリットあるので利用シーンに応じて適切な方法を選ぶ必要があります.
ちなみに,OpenCVのOpenNIサポート(WITH_OPENNI)では2の方法が採用されています.
【設定ファイルをソースコード中に埋め込む】
今回は,2の方法を採用した書き方を紹介します.
【設定ファイルをソースコード中に埋め込む】
以下のページからサンプルプログラム(Sample.cpp)をダウンロードできます.
以下今回の記事内容の部分を抜粋します.(見やすいようにエラー処理等を除いています.)
以下今回の記事内容の部分を抜粋します.(見やすいようにエラー処理等を除いています.)
#include <iostream>
#include <fstream>
#include <XnCppWrapper.h>
const std::string configure =
const std::string configure =
"<OpenNI>"
"<Licenses>"
"<License vendor=\"PrimeSense\" key=\"0KOIk2JeIBYClPWVnMoRKn5cdY4=\"/>"
"</Licenses>"
"<Log writeToConsole=\"false\" writeToFile=\"false\">"
"<!-- 0 - Verbose, 1 - Info, 2 - Warning, 3 - Error (default) --->"
"<LogLevel value=\"3\"/>"
"<Masks>"
"<Mask name=\"ALL\" on=\"true\"/>"
"</Masks>"
"<Dumps>"
"</Dumps>"
"</Log>"
"<ProductionNodes>"
"<Node type=\"Image\" name=\"Image1\">"
"<Configuration>"
"<MapOutputMode xRes=\"640\" yRes=\"480\" FPS=\"30\"/>"
"<Mirror on=\"false\"/>"
"</Configuration>"
"</Node> "
"<Node type=\"Depth\" name=\"Depth1\">"
"<Configuration>"
"<MapOutputMode xRes=\"640\" yRes=\"480\" FPS=\"30\"/>"
"<Mirror on=\"false\"/>"
"</Configuration>"
"</Node>"
"<Node type=\"User\"/>"
"<Node type=\"Gesture\"/>"
"<Node type=\"Hands\"/>"
"</ProductionNodes>"
"</OpenNI>";
int main(int argc, char *argv[])
int main(int argc, char *argv[])
{
// コンテキストの初期化
xn::Context context;
context.Init();
std::ofstream outfile("SamplesConfig.xml");
outfile.write(configure.c_str(), configure.length());
outfile.close();
context.RunXmlScriptFromFile("SamplesConfig.xml");
/* context.RunXmlScript(configure.c_str()); // doesn't work this code, because there is a bug in xn::Context::RunXmlScript(). */
std::remove("SamplesConfig.xml");
細かくは解説しませんが,以下のような流れになっています.
ソースコード中に文字列で設定XMLを記述する.
ソースコード中に文字列で設定XMLを記述する.
↓
xn::Context::context.Init()で初期化する.
↓
一度,設定XMLの文字列をxmlファイルとして書きだす.
↓
xn::Context::RunXmlScriptFromFile()でxmlファイルを読み込み,設定する.
↓
書きだしたxmlファイルを削除する.
本来は,わざわざxmlファイルを書きだす必要は無く,xn::Context::RunXmlScript()で直接設定を読み取れますが,現在はxn::Context::RunXmlScript()にバグがあるため動作しません.
xn::Context::RunXmlScript()で動作するようになると,だいぶスッキリしたコードになると思います.
※ デストラクタや最適化との兼ね合いもあると思いますが,出力演算子を使って書けばXMLファイル書き出し部分が2行になります.(明示的に書いた方がいいのかは自信無し(´・ω・`))
std::ofstream outfile("SamplesConfig.xml");
outfile << configure;
本来は,わざわざxmlファイルを書きだす必要は無く,xn::Context::RunXmlScript()で直接設定を読み取れますが,現在はxn::Context::RunXmlScript()にバグがあるため動作しません.
xn::Context::RunXmlScript()で動作するようになると,だいぶスッキリしたコードになると思います.
※ デストラクタや最適化との兼ね合いもあると思いますが,出力演算子を使って書けばXMLファイル書き出し部分が2行になります.(明示的に書いた方がいいのかは自信無し(´・ω・`))
std::ofstream outfile("SamplesConfig.xml");
outfile << configure;
【おわりに】
本記事は,OpenCVのWITH_OPENNI実装を読んでいたら便利そうな記述を見つけたので一般化して紹介しました.
【参考文献】
【参考文献】
1.) OpenCV/highgui/cap_openni.cpp
3.) KINECTセンサープログラミング
- 関連記事
- OpenNI Advent Calendar 2011/12/21 - KinectFusion -
- OpenNI Advent Calendar 2011/12/8 - OpenNIの設定ファイルに関するTips -
- OpenNI Advent Calendar 2011/12/2 - OpenCVによるOpenNIサポートの環境構築~利用方法 -
Posted by







