Пример #1
0
        private void updateFubi()
        {
            if (clearRecognizersOnNextUpdate)
            {
                Fubi.clearUserDefinedRecognizers();
                if (Fubi.getNumUserDefinedCombinationRecognizers() == 0 && Fubi.getNumUserDefinedRecognizers() == 0)
                {
                    button3.IsEnabled = false;
                }
                clearRecognizersOnNextUpdate = false;
            }

            if (switchSensorOnNextUpdate)
            {
                Fubi.switchSensor(new FubiUtils.SensorOptions(new FubiUtils.StreamOptions(), new FubiUtils.StreamOptions(), new FubiUtils.StreamOptions(-1, -1, -1),
                                                              (FubiUtils.SensorType)Enum.Parse(typeof(FubiUtils.SensorType), sensorSelectionComboBox.SelectedItem.ToString())));
                switchSensorOnNextUpdate = false;
            }

            label1.Content = "User Count : " + Fubi.getNumUsers().ToString();

            // Update Fubi and get the debug image
            int width = 0, height = 0;

            FubiUtils.ImageNumChannels channels = FubiUtils.ImageNumChannels.C4;
            FubiUtils.ImageType        type     = FubiUtils.ImageType.Depth;

            uint renderOptions = 0;

            if (shapeCheckBox.IsChecked == true)
            {
                renderOptions |= (uint)FubiUtils.RenderOptions.Shapes;
            }
            if (skeletonCheckBox.IsChecked == true)
            {
                renderOptions |= (uint)FubiUtils.RenderOptions.Skeletons;
            }
            if (userCaptionscheckBox.IsChecked == true)
            {
                renderOptions |= (uint)FubiUtils.RenderOptions.UserCaptions;
            }
            if (localOrientCheckBox.IsChecked == true)
            {
                renderOptions |= (uint)FubiUtils.RenderOptions.LocalOrientCaptions;
            }
            if (globalOrientCheckBox.IsChecked == true)
            {
                renderOptions |= (uint)FubiUtils.RenderOptions.GlobalOrientCaptions;
            }
            if (localPosCheckBox.IsChecked == true)
            {
                renderOptions |= (uint)FubiUtils.RenderOptions.LocalPosCaptions;
            }
            if (globalPosCheckBox.IsChecked == true)
            {
                renderOptions |= (uint)FubiUtils.RenderOptions.GlobalPosCaptions;
            }
            if (backgroundCheckBox.IsChecked == true)
            {
                renderOptions |= (uint)FubiUtils.RenderOptions.Background;
            }
            if (swapRAndBcheckBox.IsChecked == true)
            {
                renderOptions |= (uint)FubiUtils.RenderOptions.SwapRAndB;
            }
            if (fingerShapecheckBox.IsChecked == true)
            {
                renderOptions |= (uint)FubiUtils.RenderOptions.FingerShapes;
            }
            if (detailedFaceCheckBox.IsChecked == true)
            {
                renderOptions |= (uint)FubiUtils.RenderOptions.DetailedFaceShapes;
            }
            if (bodyMeasuresCheckBox.IsChecked == true)
            {
                renderOptions |= (uint)FubiUtils.RenderOptions.BodyMeasurements;
            }

            FubiUtils.DepthImageModification depthMods = (FubiUtils.DepthImageModification)Enum.Parse(typeof(FubiUtils.DepthImageModification), comboBox1.SelectedItem.ToString(), true);

            if (checkBox3.IsChecked == true)
            {
                Fubi.getRgbResolution(out width, out height);
                channels = FubiUtils.ImageNumChannels.C3;
                type     = FubiUtils.ImageType.Color;
            }
            else
            {
                Fubi.getDepthResolution(out width, out height);
                channels = FubiUtils.ImageNumChannels.C4;
                type     = FubiUtils.ImageType.Depth;
            }

            // Display the debug image
            if (width > 0 && height > 0)
            {
                WriteableBitmap wb = image1.Source as WriteableBitmap;
                if (wb != null && (wb.Width != width || wb.Height != height || wb.Format.BitsPerPixel != (int)channels * 8))
                {
                    wb            = null;
                    image1.Width  = width;
                    image1.Height = height;
                    buffer        = new byte[(int)channels * width * height];
                }
                if (wb == null)
                {
                    PixelFormat format = PixelFormats.Bgra32;
                    if (channels == FubiUtils.ImageNumChannels.C3)
                    {
                        format = PixelFormats.Rgb24;
                    }
                    else if (channels == FubiUtils.ImageNumChannels.C1)
                    {
                        format = PixelFormats.Gray8;
                    }
                    wb            = new WriteableBitmap(width, height, 0, 0, format, BitmapPalettes.Gray256);
                    image1.Source = wb;
                }

                Fubi.updateSensor();
                Fubi.getImage(buffer, type, channels, FubiUtils.ImageDepth.D8, renderOptions, depthMods);

                int stride = wb.PixelWidth * (wb.Format.BitsPerPixel / 8);
                wb.WritePixels(new Int32Rect(0, 0, wb.PixelWidth, wb.PixelHeight), buffer, stride, 0);
            }

            //Check postures for all users
            for (uint i = 0; i < Fubi.getNumUsers(); i++)
            {
                uint id = Fubi.getUserID(i);
                if (id > 0)
                {
                    bool changedSomething = false;
                    // Print postures
                    if (checkBox1.IsChecked == true)
                    {
                        // Only user defined postures
                        for (uint p = 0; p < Fubi.getNumUserDefinedRecognizers(); ++p)
                        {
                            if (Fubi.recognizeGestureOn(p, id) == FubiUtils.RecognitionResult.RECOGNIZED)
                            {
                                // Posture recognized
                                if (!currentPostures.ContainsKey(p) || !currentPostures[p])
                                {
                                    // Posture start
                                    textBox1.Text     += "User" + id + ": START OF " + Fubi.getUserDefinedRecognizerName(p) + " -->\n";
                                    currentPostures[p] = true;
                                    changedSomething   = true;
                                }
                            }
                            else if (currentPostures.ContainsKey(p) && currentPostures[p])
                            {
                                // Posture end
                                textBox1.Text     += "User" + id + ": --> END OF " + Fubi.getUserDefinedRecognizerName(p) + "\n";
                                currentPostures[p] = false;
                                changedSomething   = true;
                            }
                        }

                        if (PredefinedCheckBox.IsChecked == true)
                        {
                            for (int p = 0; p < (int)FubiPredefinedGestures.Postures.NUM_POSTURES; ++p)
                            {
                                if (Fubi.recognizeGestureOn((FubiPredefinedGestures.Postures)p, id) == FubiUtils.RecognitionResult.RECOGNIZED)
                                {
                                    if (!currentPostures1[p])
                                    {
                                        // Posture recognized
                                        textBox1.Text      += "User" + id + ": START OF" + FubiPredefinedGestures.getPostureName((FubiPredefinedGestures.Postures)p) + "\n";
                                        currentPostures1[p] = true;
                                        changedSomething    = true;
                                    }
                                }
                                else if (currentPostures1[p])
                                {
                                    textBox1.Text      += "User" + id + ": --> END OF " + FubiPredefinedGestures.getPostureName((FubiPredefinedGestures.Postures)p) + "\n";
                                    currentPostures1[p] = false;
                                    changedSomething    = true;
                                }
                            }
                        }

                        if (changedSomething)
                        {
                            textBox1.ScrollToEnd();
                        }
                    }

                    // Print combinations
                    for (uint pc = 0; pc < Fubi.getNumUserDefinedCombinationRecognizers(); ++pc)
                    {
                        // Only user defined postures
                        if (checkBox2.IsChecked == true)
                        {
                            if (Fubi.getCombinationRecognitionProgressOn(Fubi.getUserDefinedCombinationRecognizerName(pc), id) == FubiUtils.RecognitionResult.RECOGNIZED)
                            {
                                // Posture recognized
                                textBox2.Text += "User" + id + ": " + Fubi.getUserDefinedCombinationRecognizerName(pc) + "\n";
                            }
                            else
                            {
                                Fubi.enableCombinationRecognition(Fubi.getUserDefinedCombinationRecognizerName(pc), id, true);
                            }
                        }
                        //else
                        //    Fubi.enableCombinationRecognition(Fubi.getUserDefinedCombinationRecognizerName(pc), id, false);
                    }

                    for (uint pc = 0; pc < (uint)FubiPredefinedGestures.Combinations.NUM_COMBINATIONS; ++pc)
                    {
                        if (checkBox2.IsChecked == true && PredefinedCheckBox.IsChecked == true)
                        {
                            if (Fubi.getCombinationRecognitionProgressOn((FubiPredefinedGestures.Combinations)pc, id) == FubiUtils.RecognitionResult.RECOGNIZED)
                            {
                                // Posture recognized
                                textBox2.Text += "User" + id + ": " + FubiPredefinedGestures.getCombinationName((FubiPredefinedGestures.Combinations)pc) + "\n";
                            }
                            else
                            {
                                Fubi.enableCombinationRecognition((FubiPredefinedGestures.Combinations)pc, id, true);
                            }
                        }
                        //else
                        //    Fubi.enableCombinationRecognition((FubiPredefinedGestures.Combinations)pc, id, false);
                    }
                    if (checkBox2.IsChecked == true)
                    {
                        textBox2.ScrollToEnd();
                    }
                }
            }

            uint closestId = Fubi.getClosestUserID();

            if (closestId > 0)
            {
                // For printing the user orientation
                //float[] mat = new float[9];
                //float confidence;
                //double timeStamp;
                //Fubi.getCurrentSkeletonJointOrientation(closestId, FubiUtils.SkeletonJoint.Torso, mat, out confidence, out timeStamp);
                //float rx, ry, rz;
                //FubiUtils.Math.rotMatToRotation(mat, out rx, out ry, out rz);
                //label1.Content = "UserOrient:" + String.Format("{0:0.#}", rx) + "/" + String.Format("{0:0.#}", ry) + "/" + String.Format("{0:0.#}", rz);


                if (controlMouse)
                {
                    float x, y;
                    FubiMouse.applyHandPositionToMouse(closestId, out x, out y, leftHandRadioButton.IsChecked == true);
                    label2.Content = "X:" + x + " Y:" + y;
                }

                if (checkBox4.IsChecked == true)
                {
                    FubiPredefinedGestures.Combinations activationGesture = FubiPredefinedGestures.Combinations.WAVE_RIGHT_HAND_OVER_SHOULDER;
                    // TODO use left hand waving
                    if (Fubi.getCombinationRecognitionProgressOn(activationGesture, closestId, false) == FubiUtils.RecognitionResult.RECOGNIZED)
                    {
                        if (controlMouse)
                        {
                            stopMouseEmulation();
                        }
                        else
                        {
                            startMouseEmulation();
                        }
                    }
                    else
                    {
                        Fubi.enableCombinationRecognition(activationGesture, closestId, true);
                    }
                }
            }
        }
Пример #2
0
        private void updateStats()
        {
            //Check all users
            var numUsers = Fubi.getNumUsers();
            var numHands = Fubi.getNumHands();

            if (numUsers == 0 && numHands == 0)
            {
                warnLabel.Visibility = Visibility.Visible;
            }
            else
            {
                warnLabel.Visibility = Visibility.Hidden;
            }

            int currentIndex = 0;

            for (uint i = 0; i < numUsers + 1; i++)
            {
                var id = (i == numUsers && Fubi.isPlayingSkeletonData()) ? FubiUtils.PlaybackUserID : Fubi.getUserID(i);
                if (id > 0)
                {
                    // Not existent yet
                    if (currentIndex >= statsTree.Items.Count)
                    {
                        statsTree.Items.Add(new TvUser());
                        ((TvUser)statsTree.Items[currentIndex]).IsExpanded = true;
                    }
                    // Wrong type, i.e. TvHand instead of TvUser
                    if (statsTree.Items[currentIndex].GetType() != typeof(TvUser))
                    {
                        statsTree.Items[currentIndex] = new TvUser();
                        ((TvUser)statsTree.Items[currentIndex]).IsExpanded = true;
                    }
                    var tUser = (TvUser)statsTree.Items[currentIndex];
                    tUser.id = id;

                    // Update user defined combinations
                    var  numRecs    = Fubi.getNumUserDefinedCombinationRecognizers();
                    uint actualRecs = 0;
                    for (uint pc = 0; pc < numRecs; ++pc)
                    {
                        var name = Fubi.getUserDefinedCombinationRecognizerName(pc);
                        while (actualRecs >= tUser.Recs.Count)
                        {
                            tUser.Recs.Add(new TvRec());
                        }

                        var rec = tUser.Recs[(int)actualRecs];
                        rec.id   = pc;
                        rec.name = name;
                        uint numStates;
                        bool isInterrupted, isInTransition;
                        rec.currState      = Fubi.getCurrentCombinationRecognitionState(name, id, out numStates, out isInterrupted, out isInTransition) + 1;
                        rec.numStates      = numStates;
                        rec.isInterrupted  = isInterrupted;
                        rec.isInTransition = isInTransition;
                        if (Recognitions.ContainsKey(id) && Recognitions[id].ContainsKey(name) && Fubi.getCurrentTime() - Recognitions[id][name] < 2.0)
                        {
                            rec.bgColor = "LightGreen";
                        }
                        else
                        {
                            rec.bgColor = Color.Transparent.Name;
                        }
                        if (Hints.ContainsKey(id) && Hints[id].ContainsKey(name))
                        {
                            rec.hint = Hints[id][name];
                        }
                        actualRecs++;
                    }

                    while (tUser.Recs.Count > actualRecs)
                    {
                        tUser.Recs.RemoveAt(tUser.Recs.Count - 1);
                    }

                    ++currentIndex;
                }
            }

            for (uint i = 0; i < numHands + 1; i++)
            {
                var id = (i == numHands && Fubi.isPlayingSkeletonData()) ? FubiUtils.PlaybackHandID : Fubi.getHandID(i);
                if (id > 0)
                {
                    if (currentIndex >= statsTree.Items.Count)
                    {
                        statsTree.Items.Add(new TvHand());
                        ((TvHand)statsTree.Items[currentIndex]).IsExpanded = true;
                    }
                    // Wrong type, i.e. TvUser instead of TvUHand
                    if (statsTree.Items[currentIndex].GetType() != typeof(TvHand))
                    {
                        statsTree.Items[currentIndex] = new TvHand();
                        ((TvHand)statsTree.Items[currentIndex]).IsExpanded = true;
                    }
                    var tHand = (TvHand)statsTree.Items[currentIndex];
                    tHand.id = id;

                    // Update combinations
                    var  numRecs    = Fubi.getNumUserDefinedCombinationRecognizers();
                    uint actualRecs = 0;
                    for (uint pc = 0; pc < numRecs; ++pc)
                    {
                        var name = Fubi.getUserDefinedCombinationRecognizerName(pc);
                        while (actualRecs >= tHand.Recs.Count)
                        {
                            tHand.Recs.Add(new TvRec());
                        }

                        var rec = tHand.Recs[(int)actualRecs];
                        rec.id   = pc;
                        rec.name = name;
                        uint numStates;
                        bool isInterrupted, isInTransition;
                        rec.currState      = Fubi.getCurrentCombinationRecognitionStateForHand(name, id, out numStates, out isInterrupted, out isInTransition) + 1;
                        rec.numStates      = numStates;
                        rec.isInterrupted  = isInterrupted;
                        rec.isInTransition = isInTransition;
                        if (HandRecognitions.ContainsKey(id) && HandRecognitions[id].ContainsKey(name) && Fubi.getCurrentTime() - HandRecognitions[id][name] < 2.0)
                        {
                            rec.bgColor = "LightGreen";
                        }
                        else
                        {
                            rec.bgColor = Color.Transparent.Name;
                        }
                        if (HandHints.ContainsKey(id) && HandHints[id].ContainsKey(name))
                        {
                            rec.hint = HandHints[id][name];
                        }

                        actualRecs++;
                    }

                    while (tHand.Recs.Count > actualRecs)
                    {
                        tHand.Recs.RemoveAt(tHand.Recs.Count - 1);
                    }

                    ++currentIndex;
                }
            }

            while (statsTree.Items.Count > currentIndex)
            {
                statsTree.Items.RemoveAt(statsTree.Items.Count - 1);
            }
        }