Hatena::ブログ(Diary)

明日とロボット このページをアンテナに追加 RSSフィード

2011-07-26

深度データのノイズ軽減とポリゴン表示

Kinect関連記事

内容

  • 深度データのノイズが気になったのものすごく適当にノイズをごまかした。
  • 今まではポイントの集合で図形を表示していたのを、ポリゴンの集合で表示することにした。

ノイズ除去

  • 本当は、ガウシアンフィルタとか使ってやるのがふさわしいのだと思うが、今はまだ勉強不足なので、簡単に以下の方法で。
  • kinectから受け取った深度データを色配列に入れる際に、指定したサイズ以下の空白(深度が0から4000外)はノイズと見なし、その前後の平均値の色で埋める。(深度データの復習はkinectセンサーから任意の範囲の深度マップ抽出より)
if(sizeCount++ < maxHoleSize)
    hole = true;
else
    hole = false;
  • ホールを抜けて、新たな深度データのセルに出くわした際に、そのホールを埋める
if (hole)
{
    int dist = (distance + startDist) / 2;
    int di = depthIndex / 2;
    int i;
    int tmpx = x;
    byte t = (byte)(255 * (dist - minRange) / range);

    while (sizeCount-- > 0)
    {
        i = ((width - (--tmpx) - 1) + heightOffset) * 4;
        colorFrame[i + BlueIndex] = t;
        colorFrame[i + GreenIndex] = t;
        colorFrame[i + RedIndex] = 10;
    }
    hole = false;
}
else
{
    startDist = distance;
    hole = false;
}

ものすごく適当だが、結果は以下の通り

  • before

f:id:astrobot:20110726194842j:image

  • after

f:id:astrobot:20110726194841j:image

イメージのポリゴン表示

f:id:astrobot:20110726200223j:image

  • 何も考えずに全部の点を繋げたため、当然、大きな格差がある部分もこのように延び延びで繋がってしまう。
  • よって、z座標の値にある基準以上のギャップがある場合は、描写しないことにしたところ、以下のようになった。

f:id:astrobot:20110726200224j:image

Kinect関連記事

2011-07-22

kinectの骨格追跡データで行動を認識する

Kinect関連記事

概要

方法

  • 10秒間、kinectの前で歩く、走る、スキップする、などの行動を行い、0.1秒ごとの骨格の動きを学習させる。
  • それぞれのjoint同士の距離で学習させ、少しだけ汎用性を効かせる。
  • タイマーの使い方
    • タイマーはDispatcherTimerを利用。
DispatcherTimer timer;
timer = new DispatcherTimer(DispatcherPriority.Normal);
timer.Interval = new TimeSpan(0, 0, 0, 0, 100);
timer.Tick += new EventHandler(timer_Tick);
  • このように宣言、初期化し、0.1秒ごとに呼ばれるtimer_Tick関数も作る。
private void timer_Tick(object sender, EventArgs e)
{
    actionTimeRemain -= 1;
    if (actionTimeRemain <= 0)
    {
        timer.Stop();
    }
}

デモ

  • 歩き×2、走り×2、スキップ×2と学習させ、それぞれを正しく認識できるかテストした。

D

Kinect関連記事