void FubiRecorder::recordNextSkeletonFrame(const FubiUser& user, const Fubi::FingerCountData& leftFingerCountData, const Fubi::FingerCountData& rightFingerCountData) { const Fubi::TrackingData* data = m_useFilteredData ? user.currentFilteredTrackingData() : user.currentTrackingData(); int leftFingerCount = -1, rightFingerCount = -1; if (leftFingerCountData.trackingEnabled && leftFingerCountData.fingerCounts.size() > 0) leftFingerCount = leftFingerCountData.fingerCounts.back(); if (rightFingerCountData.trackingEnabled && rightFingerCountData.fingerCounts.size() > 0) rightFingerCount = rightFingerCountData.fingerCounts.back(); recordNextSkeletonFrame(data, leftFingerCount, rightFingerCount); }
void FubiRecorder::recordNextSkeletonFrame(const FubiUser& user, const FubiUser::FingerCountData& leftFingerCountData, const FubiUser::FingerCountData& rightFingerCountData) { if (m_isRecording && (user.currentTrackingData()->timeStamp - m_lastTimeStamp) > Math::Epsilon) { const FubiUser::TrackingData* data = m_useFilteredData ? user.currentFilteredTrackingData() : user.currentTrackingData(); m_lastTimeStamp = data->timeStamp; xml_document<> doc; // Create base node xml_node<>* frameNode = doc.allocate_node(node_element, "Frame"); doc.append_node(frameNode); // With time attribute xml_attribute<>* attr = doc.allocate_attribute("time", doc.allocate_string(numToString(m_lastTimeStamp-m_recordingStart, 6).c_str())); frameNode->append_attribute(attr); // And frame id attr = doc.allocate_attribute("frameID", doc.allocate_string(numToString(m_currentFrameID++, 0).c_str())); frameNode->append_attribute(attr); // Create all sub nodes for the frame xml_node<>* jointPositions = doc.allocate_node(node_element, "JointPositions"); frameNode->append_node(jointPositions); xml_node<>* jointOrientations = doc.allocate_node(node_element, "JointOrientations"); frameNode->append_node(jointOrientations); // Now fill them with the joint data for (int i = 0; i < SkeletonJoint::NUM_JOINTS; ++i) { xml_node<>* joint = doc.allocate_node(node_element, "Joint"); joint->append_attribute(doc.allocate_attribute("name", getJointName((SkeletonJoint::Joint)i))); const Vec3f* pos = &(data->jointPositions[i].m_position); joint->append_attribute(doc.allocate_attribute("x", doc.allocate_string(numToString(pos->x, 0).c_str()))); joint->append_attribute(doc.allocate_attribute("y", doc.allocate_string(numToString(pos->y, 0).c_str()))); joint->append_attribute(doc.allocate_attribute("z", doc.allocate_string(numToString(pos->z, 0).c_str()))); joint->append_attribute(doc.allocate_attribute("confidence", doc.allocate_string(numToString(data->jointPositions[i].m_confidence, 0).c_str()))); jointPositions->append_node(joint); joint = doc.allocate_node(node_element, "Joint"); joint->append_attribute(doc.allocate_attribute("name", getJointName((SkeletonJoint::Joint)i))); const Vec3f* rot = &(data->jointOrientations[i].m_orientation.getRot()); joint->append_attribute(doc.allocate_attribute("x", doc.allocate_string(numToString(rot->x, 2).c_str()))); joint->append_attribute(doc.allocate_attribute("y", doc.allocate_string(numToString(rot->y, 2).c_str()))); joint->append_attribute(doc.allocate_attribute("z", doc.allocate_string(numToString(rot->z, 2).c_str()))); joint->append_attribute(doc.allocate_attribute("confidence", doc.allocate_string(numToString(data->jointOrientations[i].m_confidence, 0).c_str()))); jointOrientations->append_node(joint); } int leftFingerCount = -1, rightFingerCount = -1; if (leftFingerCountData.trackingEnabled && leftFingerCountData.fingerCounts.size() > 0) leftFingerCount = leftFingerCountData.fingerCounts.back(); if (rightFingerCountData.trackingEnabled && rightFingerCountData.fingerCounts.size() > 0) rightFingerCount = rightFingerCountData.fingerCounts.back(); if (leftFingerCount > -1 || rightFingerCount > -1) { xml_node<>* fingercounts = doc.allocate_node(node_element, "FingerCounts"); frameNode->append_node(fingercounts); fingercounts->append_attribute(doc.allocate_attribute("left", doc.allocate_string(numToString(leftFingerCount, 0).c_str()))); fingercounts->append_attribute(doc.allocate_attribute("right", doc.allocate_string(numToString(rightFingerCount, 0).c_str()))); } // Write the frame node to the file // Call the internal print_node directly to start at a different indent level internal::print_node(std::ostream_iterator<char>(m_file), frameNode, 0, 1); if (m_file.fail()) { Fubi_logErr("Error writing skeleton data to file: %s \n", m_fileName.c_str()); stopRecording(); } } }