如何使用kinect检测人的视线?
How to detect the line of sight of a person using 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是骨架的头部点
您看过 FaceBasics 示例项目了吗?
我相信您想使用 FaceFrameSource / FaceFrameReader(注意:不是 HDFace)。您将能够获得 Quarternion 的面部方向(示例项目将其转换为 Pitch/Yaw/Roll)。
结合头部从骨骼的 3D 位置,我认为您应该能够创建一个近似的视线。
How-to Videos 封面包括一些关于方向的信息(第 5 个视频,跳过关于 18:20 - 你的具体问题在 21:49 被问到)。
编辑:
粗略的概念证明显示对 FaceBasics 示例项目所做的修改 - 添加到第 565 行,紧接着绘制面部信息(我还需要更改上面几行定义的 pitch/yaw/roll 的范围并将它们的默认值设置为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/Sensor.
目前我正在做一个使用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是骨架的头部点
您看过 FaceBasics 示例项目了吗?
我相信您想使用 FaceFrameSource / FaceFrameReader(注意:不是 HDFace)。您将能够获得 Quarternion 的面部方向(示例项目将其转换为 Pitch/Yaw/Roll)。
结合头部从骨骼的 3D 位置,我认为您应该能够创建一个近似的视线。
How-to Videos 封面包括一些关于方向的信息(第 5 个视频,跳过关于 18:20 - 你的具体问题在 21:49 被问到)。
编辑: 粗略的概念证明显示对 FaceBasics 示例项目所做的修改 - 添加到第 565 行,紧接着绘制面部信息(我还需要更改上面几行定义的 pitch/yaw/roll 的范围并将它们的默认值设置为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/Sensor.