0

プログラムで、この記事に近いジェスチャ認識フレームワークを開発しました。

しかし、コンピューターの前に座っていると、誤検知があります。Skeleton の kinect ルーズ トラックで、間違ったデータを使用します。

1)この動作をフィルタリングしようとしました:

return sk.Joints[JointType.Head].TrackingState == JointTrackingState.Tracked
       && sk.Joints[JointType.WristLeft].TrackingState  == JointTrackingState.Tracked
       && sk.Joints[JointType.WristRight].TrackingState == JointTrackingState.Tracked
       && sk.Joints[JointType.HipLeft].TrackingState    == JointTrackingState.Tracked
       && sk.Joints[JointType.HipRight].TrackingState   == JointTrackingState.Tracked;

しかし、私の関節が見えなくても。Kinect は間違ったスケルトンを推測して追跡します。

2) TransformSmoothParametersも試してみましたが、何も変わりません (最適なパラメーターがわかりません)。

3) また、骨格追跡が失われた後、Kinectを回復する必要があることも読みました。しかし、それを検出する方法がわかりませんか?実際、通常は問題なく機能する多くの検索/損失値を取得しますが、PC の前にいると誤検知を引き起こします。

Skeleton が追跡状態であっても完全に間違っていることを検出するスマートな方法はありますか?

4

2 に答える 2

0

わかりましたので、より良い方法を見つけます:

  bool track = sk.Joints[JointType.Head].TrackingState == JointTrackingState.Tracked
            && sk.Joints[JointType.WristLeft].TrackingState == JointTrackingState.Tracked
            && sk.Joints[JointType.WristRight].TrackingState == JointTrackingState.Tracked
            && sk.Joints[JointType.HipLeft].TrackingState == JointTrackingState.Tracked
            && sk.Joints[JointType.HipRight].TrackingState == JointTrackingState.Tracked;

  if (track) {
    var head   = sk.Joints[JointType.Head].Position;
    var kludge = sk.Joints[JointType.FootLeft].Position;
    var diff = Math.Abs(head.Y - kludge.Y) * 100;
    track = diff > 80;
  }

足と頭の間の距離が完全に間違っている場合、スケルトンにバグがあると思います

于 2013-08-21T21:51:55.267 に答える
0

API が Skeleton のルーズ トラックを使用している場合に Skeleton Stream とのミス マッチを防ぐ唯一の方法は、Depth Sensor を使用することです。

var head   = sk.Joints[JointType.Head].Position;
var color  = Sensor.MapSkeletonPointToColor(head, ColorFormat);
var depth1 = Sensor.MapSkeletonPointToDepth(head, DepthFormat);
var depth2 = DepthPixels[color.X + color.Y * DepthW];

やっと、

  1. depth1 は head.Z と同じです (アルゴリズムは ax 1000 のみを行うと想定しています)
  2. depth2 はより正確で、0 にすることができます

ログを参照してください:

Skeleton: 1,259978 Depth1: 1260 Depth2: 0
Skeleton: 1,259845 Depth1: 1260 Depth2: 0
Skeleton: 1,259783 Depth1: 1260 Depth2: 0
Skeleton: 1,259672 Depth1: 1260 Depth2: 0
Skeleton: 1,259808 Depth1: 1260 Depth2: 0
Skeleton: 1,256333 Depth1: 1256 Depth2: 1221
Skeleton: 1,25608 Depth1: 1256 Depth2: 1216
Skeleton: 1,255606 Depth1: 1256 Depth2: 1216
Skeleton: 1,24086 Depth1: 1241 Depth2: 0
Skeleton: 1,236984 Depth1: 1237 Depth2: 735
Skeleton: 1,233512 Depth1: 1234 Depth2: 725

1221 と表示されることもあるため、depthFrame.MinDepth + X (私の場合は MinDepth = 800) の下にあるものもすべて無視する必要があります。

しかし、時々それはまだ怒っています:

Skeleton: 2,898029 Depth1: 2898 Depth2: 3528 Min: 800
Skeleton: 2,901603 Depth1: 2902 Depth2: 3565 Min: 800
Skeleton: 2,902839 Depth1: 2903 Depth2: 3528 Min: 800
于 2013-08-20T22:59:05.580 に答える