如何使用kinect检测人的视线

本文关键字:视线 检测 何使用 kinect | 更新日期: 2023-09-27 17:51:00

目前我正在做一个使用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);
 }

这一点。X和点。Y是骨架的头点

如何使用kinect检测人的视线

你看过FaceBasics样例项目吗?

我相信你想使用FaceFrameSource/FaceFrameReader(注意:不是HDFace)。你将能够获得面向作为四分之一(和样例项目将其转换为俯仰/偏航/滚动)。

结合骷髅头的3D位置,我认为你应该能够创建一个近似的视线。

How-to视频涵盖了Face,包括一些关于Orientation的信息(第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);

编辑2:刚刚看到你的新评论说你正在使用SDK v1.8 -我的答案是v2.0,我不能说事情会与旧的SDK/传感器有什么不同。