如何使用kinect检测人的视线?

Vip*_*ain 10 c# kinect kinect-sdk

目前我正在开展一个使用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);
 }
Run Code Online (Sandbox Code Playgroud)

这里point.X和point.Y是骨架的头部.

小智 1

您看过 FaceBasics 示例项目吗?

我相信您想使用 FaceFrameSource / FaceFrameReader (注意:不是 HDFace)。您将能够获得四元数形式的面部方向(示例项目将其转换为俯仰/偏航/滚动)。

将其与骨骼中头部的 3D 位置相结合,我认为您应该能够创建近似的视线。

指导视频涵盖了脸部,包括一些有关方向的信息(第 5 个视频,在 18:20 左右跳过 - 您的具体问题将在 21:49 提出)。

编辑:粗略的概念证明显示对 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);
Run Code Online (Sandbox Code Playgroud)

编辑 2:刚刚看到您的新评论说您正在使用 SDK v1.8 - 我的答案是 v2.0,而且我无法说出旧版 SDK/传感器的情况有何不同。