Tech Sketch Bucket of Technical Chips by TIS Inc.

Kinect Hack 映像をNode.jsで擬似ストリーミング・・・まだまだだね(2)

Pocket

みなさん、楽しくKinectをHackしていますか?

Kinect&Node.jsの環境構築をした前回に引き続き、今回は

Kinect → OpenNI → OpenCV → C++Addon → Node.js → websocket → HTML5

とつないでいくソースコードをご紹介します。

出現する言語は、C++とjavascriptとpythonスクリプトです。

前回もお世話になった KINECTセンサープログラミング に、掲載されているソースコードを、かなり参考にさせていただきました。
また矢野直樹(Yano Naoki)
さんのブログ yanoの日記 の記事 C++ による base64 変換 のbase64変換コードを流用させていただきました。
この場を借りてお礼申し上げます。

今回の一連のソースコードにより、以下のような映像がWebsocketクライアントに配信されることになります。



1. Kinectから映像情報と震度情報を取得し、デプスマップを作成するC++クラス

Kinectから映像情報と深度情報を取得し、映像上にデプスマップを重畳します。

このクラス自身には、適切なFPSでKinectから情報を取得するイベントループ機能はありません。
イベントループは、このクラスを呼び出すNode.js側で実装します。

なお、画像データをbase64で文字列化するために、C++ による base64 変換 のbase64変換コード(base64.h 及び base64.cpp)を用いています。

kinect.hpp

kinect.cpp

2. KinectクラスとNode.jsを連結するWrapperクラス

1. で作ったKinectクラスは、KinectのライブラリとOpenCVにのみ依存していました。それらをNode.jsから利用できるようにラップします。

wrapper.cpp

3. Addon作成

1. と2. で作ったクラスを元に、Node.jsで利用できるAddonを作成するのが、node-wafコマンドです。
このコマンドは背後でGCCを呼び出しますので、includeディレクトリのパスやリンクするライブラリを教えてあげなければなりません。それが次のPythonスクリプトです。
obj.includesやobj.libpathは、環境に従って変更してください。

wscript

前回作成した雛形ディレクトリに「addon」というディレクトリを作成し、上記のソース(と、base64変換ライブラリのソース)、設定スクリプトを配置します。

と実行することで、Node.jsから呼び出すことができるKinect addonモジュールが作成されます。

4. Node.jsアプリ本体の作成

作成したKinect addonモジュールを適切なFPSで呼び出し、Websocket経由でクライアントにPUSHするNode.jsアプリを作成します。

Node.jsに内蔵されたTimerにより、setIntervalで指定したタイミング(このソースでは34ms=29.4FPS)ごとにwebsocketのsendメソッドが呼び出され、Kinect addonモジュールから映像を取り出してクライアントに送り付ける実装となっています。

app.js

5. WebsocketクライアントをJadeで作成

最後に、雛形ディレクトリ直下のviewsディレクトリにあるindex.jadeを修正します。
サーバからbase64エンコードされた画像がPUSHされるたびに、タグの中身を書き換えることで、擬似的に映像を表示しています。

6. 実行!

ここまでで、準備は完了です。
以下のコマンドを実行して、起動させましょう。

上記のようにログが出れば、起動成功です。

Google ChromeやSafari5.1のような、HTML5をサポートしているブラウザで、 http://KinectServer:3000/ にアクセスしてください。動画(っぽいナニカ)が見えるはずです。

いかがだったでしょうか。
この画像データを送り続ける擬似ストリーミングは、プロトコルと実装はシンプルですが、ネットワーク帯域を占有しますしクライアント側のCPU能力を必要とします。
実際、iPhone3GSのwebkitをクライアントとして動作させてみましたが、5FPS程度しか出せず、まともな動画には見えませんでした。
次はこの部分を、RTMPやRTSPといったストリーミングプロトコルに置き換えてみたいと思います。

エンジニア採用中!私たちと一緒に働いてみませんか?