libfreenectの取得フレームレートを無理矢理変える方法 - TK's HP

TK's HP ホーム » スポンサー広告 » kinect » libfreenectの取得フレームレートを無理矢理変える方法

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

libfreenectの取得フレームレートを無理矢理変える方法

KinectをノートPCで動かしたいと思ったとき、OpenNIだと少しフレームレートが安定しなかったり、微妙に重かったりしますよね。
ロボットで使うときとかだと、人検出する必要なんて無いので、OpenKinectを使うことにします。

また、ノートPCでセンサとして使う場合、本当に30Hz必要かというと、どうせ処理が間に合わないことが予想できますし、KinectのためだけにCPUパワーを消費するとなると微妙です。

そこで、フレームレートを変更できないかどうか調べていました。
目的は「赤外線カメラのVGA画像を10~15fpsで取得する」ことです。
フレームレートを下げるって誰得な感じはしますが、とりあえず私は使いますので、書いておきます。

無理矢理変更する方法を以下に書きます。



軽くソースコードを確認したところOpenKinect、フレームレートの変更ができません。
(というか内部で固定値になっている)

誰か変更できるようにしているかなーと思ってgithubを調べてみても、forkが多すぎて確認するきになれません。
あきらめて自分でプロトコルを調べて内部をいじることにしましたが、なぜかうまくいきません。
(おそらくIR画像のVGAサイズは30fps固定になっていそうな気がする。)


しょうがないのでKinectからの取得レートの変更は諦めて、擬似的に変更することにします。
方針としては、「3回に1回だけデータ取得のコールバック関数を呼び出す」です。


環境


とりあえず私の現在の環境は、
Ubuntu 11.04 (32bit) Thinkpad X200
ですが、他の環境でも大体同じ感じでできると思います。

OpenKinectのインストール


Kinect ubuntu10.04にlibfreenectをインストールするを参考にlibfreenectをインストールしてください。

改造


libfreenect/src/cameras.cを編集します。

static void video_process(freenect_device *dev, uint8_t *pkt, int len)
{
static int cnt=0; //ここを追加
freenect_context *ctx = dev->parent;

if (len == 0)
return;

if (!dev->video.running)
return;

// stream_processまでは必ず実行しなければならない
int got_frame_size = stream_process(ctx, &dev->video, pkt, len);
if( ++cnt % 3 ) return; // ここを追加
//以下続く

static void video_process()赤文字の部分を追加します。

depth_process()も同様にすると周波数が下がります。
そして、再度コンパイル・再インストールします。

まあ、見ていてわかると思いますが、かなり無理矢理です。
 
これをやってもKinectとの通信は行っているので、負荷はそれなりにありますが、これでもバッファのコピーや変換が少なくなるため、CPU使用率はこれだけでそれなりに下がります。

また、ユーザー側からはまるでフレームレートが10fpsになったかのように見えます。


ただし、multikinectとかした瞬間に破綻します。
mutikinectとかでも周波数を変えたい場合は、
freenect_device構造体の中にcull_videoとかcull_groupとか追加して、それをカウンタとして使うと良いかと思います。


私の場合はkinectは1個しか使う気が無いので、とりあえずこれで良いことにします。
関連記事
記事に間違いなどがあればすぐに訂正いたしますので、コメントしてください。
コメント
非公開コメント

トラックバック

http://tclip.blog.fc2.com/tb.php/115-a314de8f

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。