Как определить линию визирования человека с помощью kinect?

В настоящее время я работаю над проектом, использующим Kinect, который требует, чтобы я знал, где человек смотрит в то время, для которого я понял, что мне нужно найти линию зрения этого человека.

Сейчас я могу найти головную точку скелета человека, но не могу отслеживать движение глаз.

if (body.TrackingState == SkeletonTrackingState.Tracked)
{
    Joint joint = body.Joints[JointType.Head];
    SkeletonPoint skeletonPoint = joint.Position;

    // 2D coordinates in pixels
    System.Drawing.Point point = new System.Drawing.Point();

    if (_mode == CameraMode.Color)
    {
        // Skeleton-to-Color mapping
        ColorImagePoint colorPoint = _sensor.CoordinateMapper.MapSkeletonPointToColorPoint(skeletonPoint, ColorImageFormat.RgbResolution640x480Fps30);

        point.X = colorPoint.X;
        point.Y = colorPoint.Y;
        //Console.WriteLine(" X == " + point.X + " Y == " + point.Y);
        X = (int)Math.Floor(point.X + 0.5);
        Y = (int)Math.Floor(point.Y + 0.5);
    }

    // DRAWING...
    Ellipse ellipse = new Ellipse
    {
        Fill = System.Windows.Media.Brushes.LightBlue,
        Width = 20,
        Height = 20
    };

     Canvas.SetLeft(ellipse, point.X - ellipse.Width / 2);
     Canvas.SetTop(ellipse, point.Y - ellipse.Height / 2);

     canvas.Children.Add(ellipse);
 }

Здесь point.X и point.Y - это точки головы скелета.

Ответ 1

Вы посмотрели пример проекта FaceBasics?

Я считаю, что вы хотите использовать FaceFrameSource/FaceFrameReader (примечание: не HDFace). Вы сможете получить ориентацию лица как Quarternion (и пример проекта переводит это на Pitch/Yaw/Roll).

Объединяя это с трехмерным расположением головы из скелета, я думаю, вы должны иметь возможность создать приблизительную линию визирования.

Практические видео охватывают лицо, включая некоторую информацию о ориентации (5-е видео, пропустите примерно в 18:20 - задан ваш конкретный вопрос в 21:49).

EDIT: Грубое доказательство концепции, показывающее изменения, внесенные в проект SampleBashics FaceBasics, добавлено в строку 565, сразу после того, как информация о лицах нарисована (мне также необходимо было изменить масштаб шага/рыскания/ролика, определенного несколькими строками выше, и установить их значения по умолчанию для 0). Это создает круг для головы и желтую линию, смотрящую на приблизительное место взгляда.

Joint HeadJoint = this.bodies[faceIndex].Joints[JointType.Head];
ColorSpacePoint colorPoint = this.coordinateMapper.MapCameraPointToColorSpace(HeadJoint.Position);
Point HeadPoint = new Point(colorPoint.X, colorPoint.Y);
Point GazePoint = new Point(HeadPoint.X - Math.Sin((double)yaw * 0.0175) * 600, HeadPoint.Y - Math.Sin((double)pitch * 0.0175) * 600);
drawingContext.DrawLine(new Pen(System.Windows.Media.Brushes.Yellow, 5), HeadPoint, GazePoint);
drawingContext.DrawEllipse(System.Windows.Media.Brushes.LightBlue, null, HeadPoint, 70, 70);

ИЗМЕНИТЬ 2: Только что увидели ваш новый комментарий, говорящий, что вы используете SDK v1.8 - мой ответ уходит из версии 2.0, и я не могу говорить о том, как все будет по-другому с более старым SDK/Sensor.