robo8080のブログ

ロボット製作や電子工作など。

Kinect SDK 1.5のFacetrackingサンプルプログラムを改造して、顔の回転角をTCPへ出力してみた。

2012年06月02日 | Kinect SDK

Kinect SDK 1.5付属のFacetrackingサンプルプログラムを改造して、顔の回転角をTCPへ出力してみた。

【手順1】サンプルプログラムのソースをインストールする。

 ”FaceTrackingBasics-WPF”を適当なディレクトリにインストールする。

 

【手順2】プログラムを改造する。

 ”FaceTrackingBasics-WPF”のソリューションを開く。

 ”FaceTrackingViewer.xaml.cs”を開き、下記赤枠のように追加する。

 参考として、シリアルポートに出力する例もコメントに入れてある。

  注意:異常処理は手抜きしているので必要に応じて追加してください。

         ------------------------------  途中省略  --------------------------------------

        ------------------------------ 途中省略 --------------------------------------

        ------------------------------ 途中省略 --------------------------------------

      ------------------------------ 途中省略 --------------------------------------

 

【手順3】動作確認

 動作確認には、ProcessingのReferenceに載っているサンプルプログラムをそのまま使用した。

 このProcessingのTCPサーバーを起動後、FaceTrackingBasics-WPFを起動する。

 うまく行けばこのようになるはず。

 

 

シリアルポートに出力するようにしたときはこんな感じ。

 

【応用例1】

 この記事の改造例をベースに、さらに手を加えてRCサーボモータでWebCameraのパン・チルトを制御してみた。

 RCサーボモータの制御にはこれを使っている。

 追加の修正個所はこんな感じ。 (2012.9.16追記)

 通信コマンドの詳細はこちらを参照してください。

 " faceInformation.Rotation.X"と"faceInformation.Rotation.Y"に掛けている係数は、動かしてみて調整する。

 

【応用例2】

 この記事の改造例をベースに、シリアル通信でWebCameraのパン・チルトを制御してみた。

 こちらはシリアルコマンド方式サーボモータを使用している。

 

 

― 以上 -

 

関連する記事

RCサーボモータをmbed+LAN+ProcessingでGUI制御(その1) 【mbed編】

RCサーボモータをArduinoとProcessingでGUI制御(その1) 【Arduino編】

XBeeでシリアルコマンドサーボモータを動かしてみた。

参考にしたリンク

Arduinoでロボゼロのサーボを動かしてみよう


Kinect SDK V1.0を使ってみた。(Kinect for Xbox 360使用)

2012年02月25日 | Kinect SDK

Kinect SDK V1.0が公開されたのでさっそく使ってみた。

まず、ここからSDKをダウンロード。

インストーラーが1つなのでOpenNIに比べてインストールも簡単。

サンプルの”Kinect Explorer”もサクッと動いた。 

OpenNIだとなかなかこうはいかない。インストールでトラブル人が多いようだ。

 

まず、”Kinect Explorer”でSkeletonTrackingを試してみた。

simple-openniでやった時より安定している(ふらつかない)ような気がする。

 

ZOOM for Xbox 360 を使ってみた。椅子に座ったままでも全身が画面に入りやすくなる。

 

さて、SDKが使えるようになったので、サンプルのソースを読んでみる。

Kinect SDKはサンプルプログラムの数が少ない。

OpenNIはサンプルプログラムが多かったから、やりたいことがすぐ試せたんだが...

ここを参考にさせていただく。シンプルでわかり易い。

Kinect for Windows SDK で RGBカメラの画像を表示する(C# + WPF)

 

まずは、Kinect SDK + C# でDepthの3次元表示をやってみたい。

DirectXは使ったことないから、やはり使い慣れたOpenGLかな。

C# でOpenGLを使うにはOpenTKがよさそうだ。ここの説明がわかり易い。

 

どうもKinectでいろいろ実験するには、processing + simple-openniが一番簡単な気がする。

余計なことに煩わされずにやりたいことにすぐ到達できる。

いまのところ、Kinectを使ったアプリを配布するならKinect SDKで、自分で作って自分で使うだけならOpenNIの方が楽かな。

Kinect SDK + Processingが使えるようになれば状況が変わるかもしれないが...。

 

Kinect SDK API Referenceを読む。

Depthとカメラ画像を重ねて3次元表示したいのだが、OpenNIの"depthMapRealWorld()"みたいなAPIはないのかな...

"KinectSensor.MapDepthFrameToColorFrame()"を使えば同様のことが出来そうだ。

 

試行錯誤の末、Depthを使ったカメラ画像の切り出しがやっと出来た。

Depthとカメラ画像がちゃんと重なっているので指の形も分かる。が...表示が異様に遅い。

 

これを見ながらKinect SDKでのDepthデータの扱い方を勉強。

今日、一日中試行錯誤でやって来たことは間違っていなかったようだ。

Working with Depth Data (Channel 9)

 

SDKのサンプルに付属の"KinectWpfViewers"を使うと、ほとんどコードを書かなくても簡単にDepth表示やSkeleton表示ができることが分かった。

やり方は、ここの動画の最後の3分30秒ぐらいから ...(英語ですが、見てればわかります。)

 

あぁ~。OpenNI + Processingを使えば半日もかからなかったことが、Kinect SDK + C# だと4日掛かってもまだ先が遠い。

やりたいことにたどり着くまでにマスターしなければならないことが多すぎる!!

 

"KinectSensor.MapDepthFrameToColorFrame"を使うと表示がカクカクになってしまう。

処理が重いのかな~。

現象が出るのはrgb,depth共に640x480の時。depthが320x240ならOK。

色々調べてみるとデータ取得イベント内での処理が重くて、次のフレームデータ来るまでに終わらないのが原因のようだ。

データ取得イベント内でやっていた表示処理を外へ移すことにする。

 

さらに、Kinect SDK API Referenceを読む。

Tilt Motorを制御して首を振るときは、1秒に一回ぐらいにしろと書いてある。

Tilt Motorでトラッキングするのは無理か...。サーボモーターを外付けするかな。

やっと C#+OpenGL(OpenTK)の使い方がわかってきた。つぎは、Kinect SDKと組み合わせてDepthを3次元表示してみる。

 

ついに、Kinect SDK + C# + OpenGL(OpenTK)で、Depthを3次元表示出来るようになった。

 

動画はこちら。

Kinect SDK + C# + OpenGLで、Depthを3次元表示してみた。

 

次は、カメラ画像とDepthを3次元表示してみた。

 

 

さらに、Skeletonも3次元表示できるようにした。

 

 

動画はこちら。

Kinect SDK v 1.0 + C# + OpenGL(OpenTK)で、カメラ画像、Depth、スケルトンを3次元表示してみた。

 

―以上―

 

関連するリンク

ProcessingでKinectを使ってみた。

DOWNLOAD KINECT FOR WINDOWS SDK

simple-openni

Kinect for Windows SDK で RGBカメラの画像を表示する(C# + WPF)

OpenTK

OpenGL with C# (1) : 初期化

Working with Depth Data (Channel 9)