【问题标题】:How to detect open/closed hand using Microsoft Kinect for Windows SDK ver 1.7 C#如何使用 Microsoft Kinect for Windows SDK ver 1.7 C# 检测张开/闭合的手
【发布时间】:2013-09-10 21:37:15
【问题描述】:

我最近开始使用 Microsoft Kinect for Windows SDK 来使用 Kinect 设备编程一些东西。

我正在拼命想办法检测某只手是合上还是张开。

我看到了 Kinect for Windows Toolkit,但文档不存在,我找不到让它工作的方法。

有没有人知道检测手部状况的简单方法?如果不需要使用 Kinect 工具包,那就更好了。

【问题讨论】:

标签: sdk kinect


【解决方案1】:

这就是我最终的做法:

首先,我们需要一个看起来像这样的虚拟类:

public class DummyInteractionClient : IInteractionClient
{
    public InteractionInfo GetInteractionInfoAtLocation(
        int skeletonTrackingId,
        InteractionHandType handType,
        double x,
        double y)
    {
        var result = new InteractionInfo();
        result.IsGripTarget = true;
        result.IsPressTarget = true;
        result.PressAttractionPointX = 0.5;
        result.PressAttractionPointY = 0.5;
        result.PressTargetControlId = 1;

        return result;
    }
}

然后,在主应用程序代码中,我们需要像这样声明交互事件处理程序:

this.interactionStream = new InteractionStream(args.NewSensor, new DummyInteractionClient());
                this.interactionStream.InteractionFrameReady += InteractionStreamOnInteractionFrameReady;

最后,处理程序本身的代码:

private void InteractionStreamOnInteractionFrameReady(object sender, InteractionFrameReadyEventArgs e)
    {
        using (InteractionFrame frame = e.OpenInteractionFrame())
        {
            if (frame != null)
            {
                if (this.userInfos == null)
                {
                    this.userInfos = new UserInfo[InteractionFrame.UserInfoArrayLength];
                }

                frame.CopyInteractionDataTo(this.userInfos);
            }
            else
            {
                return;
            }
        }



        foreach (UserInfo userInfo in this.userInfos)
        {
            foreach (InteractionHandPointer handPointer in userInfo.HandPointers)
            {
                string action = null;

                switch (handPointer.HandEventType)
                {
                    case InteractionHandEventType.Grip:
                        action = "gripped";
                        break;

                    case InteractionHandEventType.GripRelease:
                        action = "released";

                        break;
                }

                if (action != null)
                {
                    string handSide = "unknown";

                    switch (handPointer.HandType)
                    {
                        case InteractionHandType.Left:
                            handSide = "left";
                            break;

                        case InteractionHandType.Right:
                            handSide = "right";
                            break;
                    }

                    if (handSide == "left")
                    {
                        if (action == "released")
                        {
                            // left hand released code here
                        }
                        else
                        {
                            // left hand gripped code here
                        }
                    }
                    else
                    {
                        if (action == "released")
                        {
                            // right hand released code here
                        }
                        else
                        {
                            // right hand gripped code here
                        }
                    }
                }
            }
        }
    }

【讨论】:

  • ,感谢您的回答!我尝试将您的代码添加到我的项目中,但它说我的项目不包含交互流的定义。我是初学者!你能把整个代码放在一个示例 .sln 文件中并分享吗?我正在运行 kinect SDK 1.8
  • 并且它还会在您在 dummyclass 中创建的“InteractionHandType”上给出错误..即使我已经包含了“使用 Microsoft.Kinect.Toolkit.Interaction;”求大神帮忙~!
  • 请参阅this answer 以将 Microsoft.Kinect.Toolkit.Interaction 添加到您的项目中
【解决方案2】:

SDK 1.7 引入了名为“grip”的交互概念。您可以通过以下链接了解所有 KinectInteraction 概念:http://msdn.microsoft.com/en-us/library/dn188673.aspx

Microsoft 实现这一点的方式是通过来自KinectRegion 的事件。在KinectRegion Events 中有HandPointerGripHandPointerGripRelease,它们会在适当的时候触发。因为事件来自于手已结束的元素,所以您可以轻松地从事件处理程序中采取适当的行动。

请注意,KinectRegion 可以是任何东西。基类是 ContentControl,因此您可以在要操作的区域内将简单的图像(如图像)放置到复杂的 Grid 布局中。

您可以在 SDK 提供的 ControlBasics-WPF example 中找到如何使用此交互的示例。

更新:

KinectRegion 只是一个花哨的ContentControl,而它又只是一个容器,里面可以放任何东西。查看ControlBasics-WPF 示例、Kinect for Windows CodePlex,并在MainWindow.xaml 文件中搜索KinectRegion。你会看到它里面有几个被操作的控件。

要查看此示例中如何实现GripGripRelease,最好在Visual Studio 中打开解决方案并搜索“grip”。在我看来,他们这样做的方式有点奇怪,但它是一个流畅的干净实现。

【讨论】:

  • 试过了,文档非常有限,很难弄清楚它是如何工作的。只是为了确保我的理解正确,我可以将任何内容设置为“KinectRegion”?
  • 好吧,我设法让该区域正常工作。但是,我找不到为夹点和夹点释放创建事件的方法。有什么见解吗?
  • 我遇到了同样的问题:我可以创建一个“KinectRegion”类型的 XAML 元素,但我无法设置它的“Grip”事件处理程序,例如:<k:KinectRegion HandPointerGrip="kinectRegion_HandPointerGrip" x:Name="kinectRegion">...</k:KinectRegion>跨度>
【解决方案3】:

据我所知,Microsoft kinect for windows SDK 不能最好地检测打开和关闭的手。 Microsoft 提供对 20 个body 部分的跟踪,不包括手指。您可以以不恰当的方式利用 kinect 交互。本教程展示了如何: http://dotneteers.net/blogs/vbandi/archive/2013/05/03/kinect-interactions-with-wpf-part-iii-demystifying-the-interaction-stream.aspx

但我认为跟踪手指运动的最佳解决方案是使用OpenNI SDK。

OpenNI 的一些MiddleWares 允许手指跟踪。

【讨论】:

  • 不幸的是,链接中提供的代码对我不起作用。我不知道为什么,相机甚至无法启动。
  • 不再是真的了。使用 kinect sdk 1.7,MS 原生支持它。
  • 我已经测试过Quicksoul提供的代码。对我来说它确实有效。
  • 代码对 jacob 不起作用可能是因为 kinect 版本。也许 Jacob 使用的是 xbox 360 版本。并且博客中的代码尝试激活 Xbox 360 版本中没有的近距离模式。我也用过Xbox 360版本。一开始它对我不起作用,但后来我对代码进行了一些修改并开始工作。
  • @CodingWolf 你能分享一个检测拳头和握力释放手势的示例工作代码吗?如果您能分享它的链接,我将不胜感激。这是我的电子邮件:faizan.zad@gmail.com
【解决方案4】:

你可以使用这样的东西

private void OnHandleHandMove(object source, HandPointerEventArgs args)
    {
        HandPointer ptr = args.HandPointer;
        if (ptr.HandEventType==HandEventType.Grip)
        {
           // TODO
        }
    }

【讨论】:

  • 它给出了你在 dummyclass 中创建的“InteractionHandType”的错误..即使我已经包含了“使用 Microsoft.Kinect.Toolkit.Interaction;”求大神帮忙~!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
相关资源
最近更新 更多