【问题标题】:Increase variable once on gesture detect在手势检测时增加变量一次
【发布时间】:2013-11-21 13:18:59
【问题描述】:

我正在使用一些第三方库在基于 Kinect 的应用程序中进行手势检测。一切正常,但我只有一个小问题,如果有人能帮助我,那就太好了。

要使用这个库,我必须像这样写kinect_SkeletonFrameReady

    void kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
    {
        Skeleton[] skeletons = new Skeleton[0];

        using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
        {
            if (skeletonFrame != null)
            {
                skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
                skeletonFrame.CopySkeletonDataTo(skeletons);
            }
        }

        if (skeletons.Length > 0 && inter != null)
        {
            Skeleton first = null;
            int b = 0;
            while (b < skeletons.Length && first == null)
            {
                if (skeletons[b].TrackingState == SkeletonTrackingState.Tracked)
                    first = skeletons[b];
                b++;
            }
            if (first != null)
            {
                GDLWatch.Stop();
                double TimeHelp = GDLWatch.Elapsed.TotalSeconds;
                GDLWatch.Reset();
                GDLWatch.Start();
                Point3D[] bodyParts = GenerateBodyPartArray(first, 0);
                System.String[] con = inter.ReturnConclusions(bodyParts, 0, TimeHelp);
                System.String conclusionsString = "";
                for (int a = 0; a < con.Length; a++)
                {
                    conclusionsString += con[a] + "\r\n";
                    System.Diagnostics.Debug.WriteLine(conclusionsString);
                    if (conclusionsString.Contains("!"))
                    {
                        this.alreadyDone++;
                        this.RaisePropertyChanged(() => this.AlreadyDone);
                    }
                }
            }
        }
    }

唯一的问题是变量allreadyDone不是增加一次,而是多次增加。我认为来自传感器的数据在一段时间内与手势描述相匹配。当手势第一次出现时,如何只增加一次这个变量? 添加类似breakreturn 的内容在这里不起作用。

【问题讨论】:

    标签: c# events kinect-sdk nui


    【解决方案1】:

    为什么不把alreadyDone 变成bool,然后做:

    alreadyDone &= true;
    

    如果它必须是int,为什么不添加另一个字段/属性:bool hasBeenCalled,然后这样做:

    alreadyDone += hasBeenCalled ? 0 : 1;
    

    另一个想法:

    为什么不把你的代码修改成这样 - 这样循环就被删除了(我认为这是你的问题):

    // get the string[] from the method
    var conclusionsStrings = inter.ReturnConclusions(bodyParts, 0, TimeHelp);
    // combine each of the strings with a new line between each
    var conclusionsString = String.Join(Environment.NewLine, conclusionsStrings);
    // does the combined string have a ! in?
    if (conclusionsString.Contains("!"))
    {
        this.alreadyDone++;
        this.RaisePropertyChanged(() => this.AlreadyDone);
    }
    

    上面的内容也更高效,因为不是使用+= 进行string 连接,而是使用.Join(,它位于mscorlib.dll 中,这意味着它可以访问string 的原始内存,而不是每次创建一个新实例(有关详细信息,请参阅C# in Depth - Jon Skeet: Strings in C# and .NET)。

    【讨论】:

    • 或者说,alreadyDone = true 可能没问题,具体取决于系统的其余部分。
    • 我需要已经完成是 int 因为它必须增​​加并绑定到 UI
    • 从你的描述看来,它似乎只需要从0 增加到1 就再也不用了。你能澄清一下吗?
    • 每次都要增加,检测到手势
    • @TomaszKowalczyk 运气好吗?
    【解决方案2】:

    SkeletonFrameReady 每次在流中准备好帧时都会触发。 (见http://msdn.microsoft.com/en-us/library/microsoft.kinect.kinectsensor.skeletonstream.aspx)。这意味着如果您跟踪运动,随着时间的推移会出现许多帧,可能仅限于 Kinect 设备和计算机的功能。

    所以如果你想跟踪一次手势,你需要验证它是否已经增加了。或者做类似 dav_i 提议的事情。

    【讨论】:

    • 我知道,但它不能回答我的问题,而且很难根据你的帖子做点什么。
    【解决方案3】:

    我找到了解决方案。不得不添加一个属性:

        private bool _isGestureCatched;
        private bool IsGestureCatched
        {
            get { return _isGestureCatched; }
            set
            {
                if (_isGestureCatched != value)
                {
                    if (!IsGestureCatched)
                    {
                        this._alreadyDone++;
                        this.RaisePropertyChanged(() => this.AlreadyDone);
                    }            
                }
    
                _isGestureCatched = value;
            }
        } 
    

    然后在SkeletonFrameReady 中必须这样设置:

    if (conclusionsString.Contains("!"))
                    {
                        IsGestureCatched = true;
                    }
                    else
                    {
                        IsGestureCatched = false;
                    }
    

    它正在工作,只是有时这段代码会捕捉一个手势两次,所以如果有人有更好的想法,欢迎,@dav_i 的回复很有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 2011-02-10
      • 2022-01-26
      相关资源
      最近更新 更多