// Initialization void Start() { //AA: Filter visalization related initializations filter = new Filter(); fv = new FilterVisualization(); fm = new FilterManager(); fv.filterOutputLocX = Screen.width / 3 - 50; fv.Initialise(); fv.DrawCircle(); m_colorTextureDictionary = new Dictionary <string, Texture2D>(); foreach (Texture2D tex in m_colorTextures) { m_colorTextureDictionary.Add(tex.name, tex); } LoadFilters(); // First set instance so Fubi.release will not be called while destroying old objects instance = this; // Remain this instance active until new one is created DontDestroyOnLoad(this); // Destroy old instance of Fubi object[] objects = GameObject.FindObjectsOfType(typeof(FubiUnity)); if (objects.Length > 1) { Destroy(((FubiUnity)objects[0])); } m_lastMouseClick = 0; m_lastGesture = 0; // Init FUBI if (!m_disableFubi) { // Only init if not already done if (!Fubi.isInitialized()) { Fubi.init(new FubiUtils.SensorOptions(new FubiUtils.StreamOptions(640, 480, 30), new FubiUtils.StreamOptions(640, 480, 30), new FubiUtils.StreamOptions(-1, -1, -1), FubiUtils.SensorType.OPENNI2), new FubiUtils.FilterOptions()); if (!Fubi.isInitialized()) { Debug.Log("Fubi: FAILED to initialize Fubi!"); } else { Debug.Log("Fubi: initialized!"); } } } else { m_disableTrackingImage = true; } // Initialize debug image // m_depthMapTexture = new Texture2D((int)(m_xRes / m_factor), (int)(m_yRes / m_factor), TextureFormat.RGBA32, false); // m_depthMapPixels = new Color[(int)((m_xRes / m_factor) * (m_yRes / m_factor))]; // m_rawImage = new byte[(int)(m_xRes * m_yRes * 4)]; m_userImageTexture = null; // Disable system cursor if (m_defaultCursor != null && m_disableFubi == false) { Screen.showCursor = false; } else { Screen.showCursor = true; } // Default mapping values m_mapping.x = -100.0f; m_mapping.y = 200.0f; m_mapping.height = 550.0f; // Get screen aspect m_aspect = (float)Screen.width / (float)Screen.height; // Calculated Map width with aspect m_mapping.width = m_mapping.height / m_aspect; if (Fubi.isInitialized()) { // Clear old gesture recognizers Fubi.clearUserDefinedRecognizers(); // And (re)load them if (Fubi.loadRecognizersFromXML("UnitySampleRecognizers.xml")) { Debug.Log("Fubi: gesture recognizers 'BarRecognizers.xml' loaded!"); } else { Debug.Log("Fubi: loading XML recognizers failed!"); } // load mouse control recognizers if (Fubi.loadRecognizersFromXML("MouseControlRecognizers.xml")) { Debug.Log("Fubi: mouse control recognizers loaded!"); } else { Debug.Log("Fubi: loading mouse control recognizers failed!"); } } }
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); } } } }