Outlaw Lemur 详细描述了您在现实世界场景中可能遇到的大多数问题。
使用 Kinect for Windows 版本 2,您无需调整电机,因为没有电机且传感器具有更大的视野。这将使您的生活更轻松。
我想添加以下提示和建议:
1) 避免直射光(物理或内部照明)
Kinect 有一个可能会混淆的红外传感器。该传感器不应与任何光源直接接触。您可以通过使用普通的激光笔和手电筒在家里/办公室模拟这样的环境。
2)如果您只跟踪一个人,请选择最近的跟踪用户
如果您的应用程序只需要一个玩家,则该玩家需要 a) 完全跟踪 b) 比其他玩家更靠近传感器。这是一种让参与者了解谁被跟踪而不会使您的 UI 更复杂的简单方法。
public static Body Default(this IEnumerable<Body> bodies)
{
Body result = null;
double closestBodyDistance = double.MaxValue;
foreach (var body in bodies)
{
if (body.IsTracked)
{
var position = body.Joints[JointType.SpineBase].Position;
var distance = position.Length();
if (result == null || distance < closestBodyDistance)
{
result = body;
closestBodyDistance = distance;
}
}
}
return result;
}
3) 使用追踪ID区分不同的玩家
每个玩家都有一个 TrackingID 属性。当玩家干扰或在随机位置移动时使用该属性。但是,不要使用该属性作为人脸识别的替代品。
ulong _trackinfID1 = 0;
ulong _trackingID2 = 0;
void BodyReader_FrameArrived(object sender, BodyFrameArrivedEventArgs e)
{
using (var frame = e.FrameReference.AcquireFrame())
{
if (frame != null)
{
frame.GetAndRefreshBodyData(_bodies);
var bodies = _bodies.Where(b => b.IsTracked).ToList();
if (bodies != null && bodies.Count >= 2 && _trackinfID1 == 0 && _trackingID2 == 0)
{
_trackinfID1 = bodies[0].TrackingId;
_trackingID2 = bodies[1].TrackingId;
// Alternatively, specidy body1 and body2 according to their distance from the sensor.
}
Body first = bodies.Where(b => b.TrackingId == _trackinfID1).FirstOrDefault();
Body second = bodies.Where(b => b.TrackingId == _trackingID2).FirstOrDefault();
if (first != null)
{
// Do something...
}
if (second != null)
{
// Do something...
}
}
}
}
4) 当玩家离传感器太远或太近时显示警告。
为了获得更高的准确性,玩家需要站在特定的距离:不要离传感器太远或太近。以下是如何检查:
const double MIN_DISTANCE = 1.0; // in meters
const double MAX_DISTANCE = 4.0; // in meters
double distance = body.Joints[JointType.SpineBase].Position.Z; // in meters, too
if (distance > MAX_DISTANCE)
{
// Prompt the player to move closer.
}
else if (distance < MIN_DISTANCE)
{
// Prompt the player to move farther.
}
else
{
// Player is in the right distance.
}
5) 始终知道玩家何时进入或离开场景。
Vitruvius 提供了一种简单的方法来了解有人何时进入或离开现场。
这是源代码,这里是如何在您的应用程序中使用它:
UsersController userReporter = new UsersController();
userReporter.BodyEntered += UserReporter_BodyEntered;
userReporter.BodyLeft += UserReporter_BodyLeft;
userReporter.Start();
void UserReporter_BodyEntered(object sender, UsersControllerEventArgs e)
{
// A new user has entered the scene. Get the ID from e param.
}
void UserReporter_BodyLeft(object sender, UsersControllerEventArgs e)
{
// A user has left the scene. Get the ID from e param.
}
6)有一个视觉线索来跟踪哪个玩家
如果玩家周围有很多人,您可能需要在屏幕上显示被跟踪的人。您可以突出显示深度帧位图或使用 Microsoft 的 Kinect Interactions。
这是移除背景并仅保留玩家像素的示例。
7)避免光滑的地板
某些地板(明亮、有光泽)可能会镜像人,而 Kinect 可能会混淆他们的某些关节(例如,Kinect 可能会将您的腿伸到反射的身体上)。如果您无法避免光滑的地板,请使用 BodyFrame 的FloorClipPlane属性。但是,最好的解决方案是在您希望人们站立的地方铺一块简单的地毯。地毯还可以作为适当距离的指示,因此您可以提供更好的用户体验。