Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用kinect检测人的视线?_C#_Kinect_Kinect Sdk - Fatal编程技术网

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

C# 如何使用kinect检测人的视线?,c#,kinect,kinect-sdk,C#,Kinect,Kinect Sdk,目前,我正在使用Kinect进行一个项目,该项目要求我知道那个人当时在看什么,为此我想我需要找到那个人的视线 现在,我可以找到人骨架的头部,但无法跟踪眼球运动 if (body.TrackingState == SkeletonTrackingState.Tracked) { Joint joint = body.Joints[JointType.Head]; SkeletonPoint skeletonPoint = joint.Position; // 2D coo

目前,我正在使用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是骨架的头部点。

您看过FaceBasics示例项目了吗

我相信您希望使用FaceFrameSource/FaceFrameReader(注意:不是HDFace)。您将能够将面方向转换为(示例项目将其转换为俯仰/偏航/滚动)

结合头部在骨骼上的三维位置,我认为你应该能够创建一个大致的视线

封面包括一些关于方向的信息(第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/传感器会有什么不同。

我已经很久没有弄乱Kinect SDK了,但是否可以检测到头部的旋转?@JohnOdom你认为如何在我的问题中使用头部的旋转……我不明白你的想法……尽管我可以用骨骼来计算头部位置的变化坐标我在想,如果你能够跟踪头部的旋转(面对kinect时为0度),你可以通过检查头部旋转的程度来计算“视线”。例如:如果头部在偏航(上/下Z轴)上旋转+45度,则用户向左看。这听起来可能有些过分,但这是我在不查看kinect sdk的情况下所能提供的一切。@JohnOdom 2 things 1。人员绕偏航旋转不会改变其头部点2。你的方法忽略了眼睛的运动而不是头部的运动。我知道我忽略了眼睛的运动,我不确定kinect是否足够先进来读取眼球运动。对于旋转,我指的是头部的旋转,而不是身体的旋转。我也不确定Kinect能否单独跟踪身体部位的旋转。是的,我看过那些视频,在我看来,修改视线的facebasics代码似乎是一项非常困难的任务,因为它包含了相互依赖的不同模块…谢谢。如果您想跟踪面部方向,但不使用FaceFrameSource,我认为您将经历一段非常艰难的时间。刚刚获得kinect v2和适配器…将实施您的建议现在…将让您知道进一步的更新