gpt4 book ai didi

kinect - Microsoft Kinect 和背景/环境噪音

转载 作者:行者123 更新时间:2023-12-02 07:01:29 25 4
gpt4 key购买 nike

我目前正在 Windows 8.1 上使用 Microsoft Kinect for Windows SDK 2 进行编程。一切进展顺利,在家庭开发环境中,与“现实世界”相比,背景中显然没有太多噪音。

我想向那些具有 Kinect“现实世界”应用经验的人寻求一些建议。 Kinect(尤其是 v2)在背景中有路人、旁观者和意外物体的现场环境中表现如何?我确实预计,从 Kinect 传感器到用户的空间通常不会有干扰 - 我现在非常注意的是背景噪音本身。

虽然我知道 Kinect 在阳光直射下(无论是在传感器上还是在用户上)无法很好地跟踪 - 是否需要将某些照明条件或其他外部因素纳入代码中?

我正在寻找的答案是:

  1. 现场环境中可能会出现哪些类型的问题?
  2. 您是如何编码或解决这个问题的?

最佳答案

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) 始终了解玩家何时进入或离开场景。

维特鲁威提供了一种简单的方法来了解某人何时进入或离开场景。

Here is the source code以下是如何在您的应用程序中使用它:

    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 交互。

This is an example of removing the background and keeping the player pixels only .

7) 避免使用光滑的地板

某些地板(明亮的、有光泽的)可能会镜像人,而 Kinect 可能会混淆他们的某些关节(例如,Kinect 可能会将您的腿延伸到反射的 body )。如果您无法避免光面地板,请使用FloorClipPlane你的 BodyFrame 的属性。然而,最好的解决方案是在人们站立的地方铺一 block 简单的地毯。地毯还可以作为适当距离的指示,因此您可以提供更好的用户体验。

关于kinect - Microsoft Kinect 和背景/环境噪音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27852369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com