【问题标题】:Kinect Gesture Recognition: Reset, Recovering and AccuracyKinect 手势识别:重置、恢复和准确性
【发布时间】:2013-08-17 11:10:12
【问题描述】:

在一个程序中,我开发了一个接近 this article 的手势识别框架。

但是当我坐在电脑前时,我有误报。 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 need to recover。但我不知道如何检测?事实上,我得到了很多找到/丢失的值,这些值在正常情况下工作正常,但是当我在 PC 前面时会触发误报。

是否有一种智能方法可以检测 Skeleton 是否完全错误,即使它处于跟踪状态?

【问题讨论】:

  • 太近时,X,Y,Z 完全错误
  • 你离电脑多远
  • 除了@Kinected 问题,您使用的是用于Xbox 360 的Kinect 还是用于Windows 的Kinect?如果是 Kinect for Windows,您是否处于“近距离模式”?
  • 我正在使用 Kinect XBox360(因此我没有激活 NearMode)。我距离 Kinect 大约 80 厘米,上面写着 2M。我认为它至少应该说是 JointTrackingState.Infered。我将不得不使用深度框架来检查:-(
  • @Jean 好吧,你正在重置 return 语句中的值,但在你这样做之前是关节 Tracked

标签: c# api kinect gesture


【解决方案1】:

API 松散跟踪 Skeleton 时,防止 Skeleton Stream 丢失匹配的唯一方法是使用深度传感器。

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(我假设算法只做 x 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

【讨论】:

  • 不知道是否有更直接的算法来仅使用深度流找到头部深度
  • 因为 Skeleton 和 Depth 共享相同的数据,所以这个答案不够准确。
【解决方案2】:

好的,我找到了更好的方法:

  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;
  }

如果脚和头之间的距离是完全错误的,我认为骨架是错误的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多