Kinectを複数使う場合、Macならマルチキネクト(Multi-Kinect)が可能です。
しかし、Windows環境ではまだドライバが対応しておらず、マルチキネクト(Multi-Kinect)を行うことができません。
できるみたいです。
USB端子の大元?が異なる端子で繋げば出来るみたい。
ex)デスクトップPCの前面パネルと後面パネルのUSB端子
ドライバが対応してないなら、違うPCで動かせばいいじゃない
っということで取得したKinectの画像を送受信してみます。
今回はUDPによって送受信を行います。
UDPはTCPと違い、相手に正しくデータが届くとは限りません。
届いたかどうかや誤りの確認をしていないからです。
そのかわり、高速でデータを送信することが可能となります。
よく、音声や画像のストリーム形式での配信に用いられるプロトコルです。
まず、Kinectから取得できるRGB画像と深度画像のサイズを計算してみます。
RGB画像
8bit (1byte)
3Channel -> 921600byte -> 900KB
480 * 640
深度画像
16bit (2byte)
1Channel -> 614400byte -> 600KB
480 * 640
合計 1500KB
RGB画像と深度画像のサイズは1500KB(約1.5MB)となります。
結構大きいですね・・・
では、このデータをUDPで送信することになりますが、UDPはこのような大きなサイズを一気に送ることはできません。
なので分割して送ります。
大体UDPで送ることができる最大サイズは60KBくらいなので、60KBで分割します。
RGB画像:900KB / 60KB = 15分割
深度画像:600KB / 60KB = 10分割
このことを頭において、プログラムを作ると
送信
送信するためにbuffという配列を用意します。
buffには画像に関する情報のヘッダ部と画像データを格納します。
ここでヘッダ部では
buff[0]にRGB画像か深度画像か判別する情報を入れます
つぎに
buff[1]にこのデータが何分割目のデータを格納します。
なぜこのようなことをするのかというと、UDPは送信したデータが相手に届くかわからず、また順番も送信した順になるとはかぎりません。
なので、受信側が分割されたデータを1つの画像に復元する際、必要になります。
データの送信はsendtoで行います
次に受信
受信
ヘッダ部の情報を元に、RGB画像か深度画像のどちらにデータを格納するか選び
分割番号を元に、格納するデータの位置を決定します。
これでKinectの画像データを他のPCに送ることができます。
データの受信はrecvfromで行います
ちなみにrecvfromはデータを受信するまで、待ち状態になります。
利用する際は、受信は別スレッドで動作させましょう。
ここではUDPのくわしいプログラムは説明しません。
各自調べてください。
これでWindows環境でもマルチキネクト(
Multi-Kinect) が可能に!?
骨格情報に関しては紹介しませんでしたが、同じような感じでできるんじゃないでしょうか。
ということで、サンプルプログラムどん
参考
プログラミング色々
0 件のコメント:
コメントを投稿