2013-08-17 2 views
0

В программе я разработал схему распознавания жестов, близкую к this article.Распознавание жестов Kinect: сброс, восстановление и точность

Но у меня есть ложный позитив, когда я сидел перед компьютером. Kinect потеряет трек Skeleton, а затем использует неверные данные.

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 после скелетного слежения потерян. Но я не знаю, как это обнаружить? На самом деле, я получаю много находок/потерянных значений, которые отлично работают в нормальном случае, но срабатывают ложно, когда я нахожусь перед ПК.

Есть ли разумный способ обнаружить, что скелет полностью ошибочен, даже если он находится в состоянии отслеживания?

+2

Когда слишком близко, X, Y, Z является укомплектовать неправильно –

+0

Как далеко от я e компьютер – Kinected

+0

В дополнение к вопросу @Kinected, вы используете Kinect для Xbox 360 или Kinect для Windows? Если вы используете Kinect для Windows, вы находитесь в «Near Mode»? –

ответ

0

Ok поэтому я считаю, лучше путь:

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

Если расстояние между ногами и головой укомплектовать ложь Я предполагаю, что скелет глючит

0

Единственный способ предотвратить пропуску матча со Скелетным потоком, когда API-интерфейс Skeleton - использовать датчик глубины.

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 (я предполагаю, что алгоритм делать только топор 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 

Beca использовать иногда говорит 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 
+0

Не знаю, есть ли более прямой алгоритм поиска глубины голова, используя только глубину потока. –

+0

Поскольку скелет и глубина разделяют одни и те же данные, этот ответ не является достаточно точным. –

Смежные вопросы