// Update is called once per frame void Update() { handData = SenseToolkitManager.Instance.HandDataOutput; if (handData != null) { handData.Update(); for (int i = 0; i < handData.QueryFiredGesturesNumber(); i++) { if (handData.QueryFiredGestureData(i, out gestureData) == pxcmStatus.PXCM_STATUS_NO_ERROR) { DisplayGestures(gestureData); } } PXCMHandData.AlertData alertData; for (int i = 0; i < handData.QueryFiredAlertsNumber(); i++) { if (handData.QueryFiredAlertData(i, out alertData) == pxcmStatus.PXCM_STATUS_NO_ERROR) { ProcessAlerts(alertData); } } } }
// Update is called once per frame void Update() { /* Make sure SenseManager Instance is valid */ if (sm == null) { return; } /* Wait until any frame data is available */ if (sm.AcquireFrame(false) != pxcmStatus.PXCM_STATUS_NO_ERROR) { return; } /* Retrieve hand tracking Module Instance */ handAnalyzer = sm.QueryHand(); if (handAnalyzer != null) { /* Retrieve hand tracking Data */ PXCMHandData _handData = handAnalyzer.CreateOutput(); if (_handData != null) { _handData.Update(); /* Retrieve Gesture Data to manipulate GUIText */ PXCMHandData.GestureData gestureData; for (int i = 0; i < _handData.QueryFiredGesturesNumber(); i++) { if (_handData.QueryFiredGestureData(i, out gestureData) == pxcmStatus.PXCM_STATUS_NO_ERROR) { DisplayGestures(gestureData); } } /* Retrieve Alert Data to manipulate GUIText */ PXCMHandData.AlertData alertData; for (int i = 0; i < _handData.QueryFiredAlertsNumber(); i++) { if (_handData.QueryFiredAlertData(i, out alertData) == pxcmStatus.PXCM_STATUS_NO_ERROR) { ProcessAlerts(alertData); } } /* Retrieve all joint Data */ for (int i = 0; i < _handData.QueryNumberOfHands(); i++) { PXCMHandData.IHand _iHand; if (_handData.QueryHandData(PXCMHandData.AccessOrderType.ACCESS_ORDER_FIXED, i, out _iHand) == pxcmStatus.PXCM_STATUS_NO_ERROR) { for (int j = 0; j < MaxJoints; j++) { if (_iHand.QueryTrackedJoint((PXCMHandData.JointType)j, out jointData[i][j]) != pxcmStatus.PXCM_STATUS_NO_ERROR) { jointData[i][j] = null; } } if (!handList.ContainsKey(_iHand.QueryUniqueId())) { handList.Add(_iHand.QueryUniqueId(), _iHand.QueryBodySide()); } } } /* Smoothen and Display the Data - Joints and Bones*/ DisplayJoints(); } handAnalyzer.Dispose(); } sm.ReleaseFrame(); RotateCam(); }
private void ProcessingHandThread() { // Start AcquireFrame/ReleaseFrame loop while (senseManager.AcquireFrame(true) >= pxcmStatus.PXCM_STATUS_NO_ERROR) { hand = senseManager.QueryHand(); if (hand != null) { // Retrieve the most recent processed data handData = hand.CreateOutput(); handData.Update(); // Get number of tracked hands nhands = handData.QueryNumberOfHands(); if (nhands > 0) { // Retrieve hand identifier handData.QueryHandId(PXCMHandData.AccessOrderType.ACCESS_ORDER_BY_TIME, 0, out handId); // Retrieve hand data handData.QueryHandDataById(handId, out ihand); // Retrieve all hand joint data for (int i = 0; i < nhands; i++) { for (int j = 0; j < 0x20; j++) { PXCMHandData.JointData jointData; ihand.QueryTrackedJoint((PXCMHandData.JointType)j, out jointData); nodes[i][j] = jointData; } } // Get world coordinates for tip of middle finger on the first hand in camera range handTipX = nodes[0][Convert.ToInt32(PXCMHandData.JointType.JOINT_MIDDLE_TIP)].positionWorld.x; handTipY = nodes[0][Convert.ToInt32(PXCMHandData.JointType.JOINT_MIDDLE_TIP)].positionWorld.y; handTipZ = nodes[0][Convert.ToInt32(PXCMHandData.JointType.JOINT_MIDDLE_TIP)].positionWorld.z; // Retrieve gesture data if (handData.IsGestureFired("spreadfingers", out gestureData)) { gesture = Gesture.FingerSpread; } else if (handData.IsGestureFired("two_fingers_pinch_open", out gestureData)) { gesture = Gesture.Pinch; } else if (handData.IsGestureFired("wave", out gestureData)) { gesture = Gesture.Wave; } } else { gesture = Gesture.Undefined; } // Get alert status for (int i = 0; i < handData.QueryFiredAlertsNumber(); i++) { PXCMHandData.AlertData alertData; if (handData.QueryFiredAlertData(i, out alertData) != pxcmStatus.PXCM_STATUS_NO_ERROR) { continue; } //Displaying last alert switch (alertData.label) { case PXCMHandData.AlertType.ALERT_HAND_DETECTED: detectionAlert = "Hand Detected"; detectionStatusOk = true; break; case PXCMHandData.AlertType.ALERT_HAND_NOT_DETECTED: detectionAlert = "Hand Not Detected"; detectionStatusOk = false; break; case PXCMHandData.AlertType.ALERT_HAND_CALIBRATED: calibrationAlert = "Hand Calibrated"; calibrationStatusOk = true; break; case PXCMHandData.AlertType.ALERT_HAND_NOT_CALIBRATED: calibrationAlert = "Hand Not Calibrated"; calibrationStatusOk = false; break; case PXCMHandData.AlertType.ALERT_HAND_INSIDE_BORDERS: bordersAlert = "Hand Inside Borders"; borderStatusOk = true; break; case PXCMHandData.AlertType.ALERT_HAND_OUT_OF_BORDERS: bordersAlert = "Hand Out Of Borders"; borderStatusOk = false; break; } } UpdateUI(); if (handData != null) handData.Dispose(); } senseManager.ReleaseFrame(); } }
/* Displaying current frame alerts */ private void DisplayAlerts(PXCMHandData handAnalysis, int frameNumber) { bool isChanged = false; string sAlert = "Alert: "; for (int i = 0; i < handAnalysis.QueryFiredAlertsNumber(); i++) { PXCMHandData.AlertData alertData; if (handAnalysis.QueryFiredAlertData(i, out alertData) != pxcmStatus.PXCM_STATUS_NO_ERROR) { continue; } //See PXCMHandAnalysis.AlertData.AlertType for all available alerts switch (alertData.label) { case PXCMHandData.AlertType.ALERT_HAND_DETECTED: { sAlert += "Hand Detected, "; isChanged = true; break; } case PXCMHandData.AlertType.ALERT_HAND_NOT_DETECTED: { sAlert += "Hand Not Detected, "; isChanged = true; break; } case PXCMHandData.AlertType.ALERT_HAND_CALIBRATED: { sAlert += "Hand Calibrated, "; isChanged = true; break; } case PXCMHandData.AlertType.ALERT_HAND_NOT_CALIBRATED: { sAlert += "Hand Not Calibrated, "; isChanged = true; break; } case PXCMHandData.AlertType.ALERT_HAND_INSIDE_BORDERS: { sAlert += "Hand Inside Border, "; isChanged = true; break; } case PXCMHandData.AlertType.ALERT_HAND_OUT_OF_BORDERS: { sAlert += "Hand Out Of Borders, "; isChanged = true; break; } } } if (isChanged) { form.UpdateInfo("Frame " + frameNumber + ") " + sAlert + "\n", Color.RoyalBlue); } }
/* Displaying current frame alerts */ private void DisplayAlerts(PXCMHandData handAnalysis, int frameNumber) { bool isChanged = false; string sAlert = "Alert: "; for (int i = 0; i < handAnalysis.QueryFiredAlertsNumber(); i++) { PXCMHandData.AlertData alertData; if (handAnalysis.QueryFiredAlertData(i, out alertData) != pxcmStatus.PXCM_STATUS_NO_ERROR) continue; //See PXCMHandAnalysis.AlertData.AlertType for all available alerts switch (alertData.label) { case PXCMHandData.AlertType.ALERT_HAND_DETECTED: { sAlert += "Hand Detected, "; isChanged = true; break; } case PXCMHandData.AlertType.ALERT_HAND_NOT_DETECTED: { sAlert += "Hand Not Detected, "; isChanged = true; break; } case PXCMHandData.AlertType.ALERT_HAND_CALIBRATED: { sAlert += "Hand Calibrated, "; isChanged = true; break; } case PXCMHandData.AlertType.ALERT_HAND_NOT_CALIBRATED: { sAlert += "Hand Not Calibrated, "; isChanged = true; break; } case PXCMHandData.AlertType.ALERT_HAND_INSIDE_BORDERS: { sAlert += "Hand Inside Border, "; isChanged = true; break; } case PXCMHandData.AlertType.ALERT_HAND_OUT_OF_BORDERS: { sAlert += "Hand Out Of Borders, "; isChanged = true; break; } } } if (isChanged) { form.UpdateInfo("Frame " + frameNumber + ") " + sAlert + "\n", Color.RoyalBlue); } }