void HandsModel::updateskeletonTree() { m_rightHandExist = false; m_leftHandExist = false; // Iterate over hands int numOfHands = m_handData->QueryNumberOfHands(); for (int index = 0; index < numOfHands; ++index) { // Get hand by access order of entering time PXCHandData::IHand* handOutput = NULL; if (m_handData->QueryHandData(PXCHandData::ACCESS_ORDER_BY_TIME, index, handOutput) == PXC_STATUS_NO_ERROR) { // Get hand body side (left, right, unknown) int side = 0; if (handOutput->QueryBodySide() == PXCHandData::BodySideType::BODY_SIDE_RIGHT) { m_rightHandExist = true; side = 0; } else if (handOutput->QueryBodySide() == PXCHandData::BodySideType::BODY_SIDE_LEFT) { m_leftHandExist = true; side = 1; } PXCHandData::JointData jointData; handOutput->QueryTrackedJoint(PXCHandData::JointType::JOINT_WRIST, jointData); Node<PXCHandData::JointData> rootDataNode(jointData); // Iterate over hand joints for (int i = 2; i < MAX_NUMBER_OF_JOINTS - 3; i += 4) { handOutput->QueryTrackedJoint((PXCHandData::JointType)(i + 3), jointData); Node<PXCHandData::JointData> dataNode(jointData); handOutput->QueryTrackedJoint((PXCHandData::JointType)(i + 2), jointData); Node<PXCHandData::JointData> dataNode1(jointData); handOutput->QueryTrackedJoint((PXCHandData::JointType)(i + 1), jointData); Node<PXCHandData::JointData> dataNode2(jointData); handOutput->QueryTrackedJoint((PXCHandData::JointType)(i), jointData); Node<PXCHandData::JointData> dataNode3(jointData); dataNode1.add(dataNode); dataNode2.add(dataNode1); dataNode3.add(dataNode2); rootDataNode.add(dataNode3); } m_skeletonTree[side].setRoot(rootDataNode); } } }
void updateHandFrame() { // 手のデータを更新する handData->Update(); // 認識した手の数を取得する auto numOfHands = handData->QueryNumberOfHands(); for ( int i = 0; i < numOfHands; i++ ) { // 手を取得する PXCHandData::IHand* hand; auto sts = handData->QueryHandData( PXCHandData::AccessOrderType::ACCESS_ORDER_BY_ID, i, hand ); if ( sts < PXC_STATUS_NO_ERROR ) { continue; } // 指の関節を列挙する for ( int j = 0; j < PXCHandData::NUMBER_OF_JOINTS; j++ ) { PXCHandData::JointData jointData; sts = hand->QueryTrackedJoint( (PXCHandData::JointType)j, jointData ); if ( sts != PXC_STATUS_NO_ERROR ) { continue; } cv::circle( handImage, cv::Point( jointData.positionImage.x, jointData.positionImage.y ), 5, cv::Scalar( 128, 128, 0 ) ); } } // 認識したジェスチャーの数を取得する auto numOfGestures = handData->QueryFiredGesturesNumber(); for ( int i = 0; i < numOfGestures; i++ ) { // 認識したジェスチャーを取得する PXCHandData::GestureData gesture; auto sts = handData->QueryFiredGestureData( i, gesture ); if ( sts < PXC_STATUS_NO_ERROR ) { continue; } // ジェスチャーをした手を取得する PXCHandData::IHand* hand; sts = handData->QueryHandDataById( gesture.handId, hand ); if ( sts < PXC_STATUS_NO_ERROR ) { continue; } // どちらの手でジェスチャーしたのか auto side = hand->QueryBodySide(); if ( side == PXCHandData::BodySideType::BODY_SIDE_LEFT ){ ++leftGestureCount; } else { ++rightGestureCount; } } // ジェスチャーの検出数を表示する { std::stringstream ss; ss << "Left gesture : " << leftGestureCount; cv::putText( handImage, ss.str(), cv::Point( 10, 40 ), cv::FONT_HERSHEY_SIMPLEX, 1.2, cv::Scalar( 0, 0, 255 ), 2, CV_AA ); } { std::stringstream ss; ss << "Right gesture : " << rightGestureCount; cv::putText( handImage, ss.str(), cv::Point( 10, 80 ), cv::FONT_HERSHEY_SIMPLEX, 1.2, cv::Scalar( 0, 0, 255 ), 2, CV_AA ); } }