3

我有一个奇怪的问题。我正在为应用程序创建一个 NUI,并将一些简单的手势绑定到左右箭头。问题是当我启动应用程序时。当我第一次做手势时,我的应用程序连续命中 2 次。之后,它可以按我的意愿 100% 工作。只有开始才是问题所在。

我正在将两个关节和时间戳添加到我的历史结构中,该结构被放入 ArrayList

        this._history.Add(new HistoryItem()
            {
                timestamp = timestamp,
                activeHand = hand,
                controlJoint = controlJoint
            }
        );

然后在 foreach 循环中我正在比较数据

if (Math.Abs((hand.Position.X - item.controlJoint.Position.X)) < MainWindow.treshold && Math.Abs((hand.Position.Y - item.controlJoint.Position.Y)) < MainWindow.verticalTreshold)

如果它击中,我会立即打破 lopp

break;

之后我清除历史 ArrayList

this._history.Clear();

所以我不明白。为什么启动后会连续命中两次?

// 编辑

历史 ArrayList 初始化

private List<HistoryItem> _history = new List<HistoryItem>(16);

循环中

foreach (HistoryItem item in this._history)
        {
         if ((hand.Position.X - item.controlJoint.Position.X) < MainWindow.treshold)
                            {
                                float tmp = (hand.Position.X - controlJoint.Position.X);
                                MainWindow.slideNumber++;
                                this._logger.Log("Next slide: " + MainWindow.slideNumber);
                                this._logger.Log(hand.Position.X + " - " + controlJoint.Position.X + " = " + tmp + " | " + MainWindow.treshold);
                                this.startTime = 0;
                                this.gestureStart = false;
                                answerFlag = true;
                                System.Windows.Forms.SendKeys.SendWait("{Right}");
                                break;
                            }
                }

现在。正如你所看到的,我在这里打破了。因此,不应连续第二次调用此代码

这如何清除某些东西

// 编辑 2

我还要补充一点,要进入这部分代码,gestureStart 标志需要设置为 true。正如您在此处进入“if”部分后所看到的,我将其设置为 false。所以代码不可能立即到达这部分

// 编辑 3 WORKAROUND

我创造了一种解决方法。我添加了时间控制。我正在比较调用代码的时间戳和上次手势识别的时间戳。如果它太快(我是几毫秒,这是不可能的)我不允许击中箭头。我不确定这是否是一个完美的解决方案,但它是一个可行的解决方案

4

1 回答 1

1

好的,我的问题是代码。Ofc 在调试中无法追踪的一个小错误。我使用一个函数来分析帧的历史。

该方法在 2 种模式下工作。我已经将其分离并创建了 2 种不同的方法,每种方法用于每个任务,现在效果很好

于 2012-04-11T15:29:54.917 回答