TouchEvent::TouchEvent(int id, Type eventType, BlobPtr pBlob, const IntPoint& pos, Source source, const glm::vec2& speed) : CursorEvent(id, eventType, pos, source), m_pBlob(pBlob), m_bHasHandOrientation(false) { setSpeed(speed); if (pBlob) { m_Orientation = pBlob->getOrientation(); m_Area = pBlob->getArea(); m_Center = pBlob->getCenter(); m_Eccentricity = pBlob->getEccentricity(); const glm::vec2& axis0 = m_pBlob->getScaledBasis(0); const glm::vec2& axis1 = m_pBlob->getScaledBasis(1); if (glm::length(axis0) > glm::length(axis1)) { m_MajorAxis = axis0; m_MinorAxis = axis1; } else { m_MajorAxis = axis1; m_MinorAxis = axis0; } } else { m_Orientation = 0; m_Area = 20; m_Center = glm::vec2(0, 0); m_Eccentricity = 0; m_MajorAxis = glm::vec2(5, 0); m_MinorAxis = glm::vec2(0, 5); } }
void TrackerThread::correlateHands(BlobVectorPtr pTrackBlobs, BlobVectorPtr pTouchBlobs) { if (!pTrackBlobs || !pTouchBlobs) { return; } for (BlobVector::iterator it1 = pTouchBlobs->begin(); it1 != pTouchBlobs->end(); ++it1) { BlobPtr pTouchBlob = *it1; IntPoint touchCenter = (IntPoint)(pTouchBlob->getCenter()); for (BlobVector::iterator it2 = pTrackBlobs->begin(); it2 != pTrackBlobs->end(); ++it2) { BlobPtr pTrackBlob = *it2; if (pTrackBlob->contains(touchCenter)) { pTouchBlob->addRelated(pTrackBlob); pTrackBlob->addRelated(pTouchBlob); break; } } } }