NITE 1.4.1 - API Reference
|
00001 /******************************************************************************* 00002 * * 00003 * PrimeSense NITE 1.3 * 00004 * Copyright (C) 2010 PrimeSense Ltd. * 00005 * * 00006 *******************************************************************************/ 00007 00008 00009 #ifndef _XNV_STEADY_DETECTOR_H_ 00010 #define _XNV_STEADY_DETECTOR_H_ 00011 00012 #include "XnVNiteDefs.h" 00013 #include "XnVPointControl.h" 00014 class XnVPointBuffer; 00015 00021 class XNV_NITE_API XnVSteadyDetector : 00022 public XnVPointControl 00023 { 00024 public: 00028 typedef void (XN_CALLBACK_TYPE *SteadyCB)(XnUInt32 nId, XnFloat fStdDev, void* pUserCxt); 00029 typedef void (XN_CALLBACK_TYPE *NotSteadyCB)(XnUInt32 nId, XnFloat fStdDev, void* pUserCxt); 00030 00039 XnVSteadyDetector(XnUInt32 nCooldownFrames = ms_nDefaultInitialCooldown, 00040 XnUInt32 nDetectionDuration = ms_nDefaultDetectionDuration, 00041 XnFloat fMaximumStdDevForSteady = ms_fDefaultMaximumStdDevForSteady, 00042 const XnChar* strName = "XnVSteadyDetector"); 00043 00044 ~XnVSteadyDetector(); 00053 XnCallbackHandle RegisterSteady(void* cxt, SteadyCB CB); 00059 void UnregisterSteady(XnCallbackHandle hCB); 00060 00069 XnCallbackHandle RegisterNotSteady(void* cxt, NotSteadyCB CB); 00075 void UnregisterNotSteady(XnCallbackHandle hCB); 00079 void Reset(); 00080 00086 XnUInt32 GetDetectionDuration() const; 00092 XnFloat GetMaximumStdDevForSteady() const; 00098 XnFloat GetMinimumStdDevForNotSteady() const; 00099 00105 void SetDetectionDuration(XnUInt32 nDuration); 00111 void SetMaximumStdDevForSteady(XnFloat fStdDev); 00117 void SetMinimumStdDevForNotSteady(XnFloat fStdDev); 00118 00119 static const XnUInt32 ms_nDefaultDetectionDuration; // = 200 ms 00120 static const XnUInt32 ms_nDefaultInitialCooldown; // = 0 00121 static const XnFloat ms_fDefaultMaximumStdDevForSteady; // 0.01 m/s 00122 static const XnFloat ms_fDefaultMinimumStdDevForNotSteady; // 0.02 m/s 00123 00129 void OnPointCreate(const XnVHandPointContext* cxt); 00136 void OnPointUpdate(const XnVHandPointContext* cxt); 00137 00138 XnFloat XN_API_DEPRECATED("Please use GetMaximumStdDevForSteady() instead.") 00139 GetMaximumVelocity() const; 00140 void XN_API_DEPRECATED("Please use SetMaximumStdDevForSteady() instead.") 00141 SetMaximumVelocity(XnFloat fVelocity); 00142 protected: 00143 void Reset(XnUInt32 id); 00144 // called whenever we have a new point 00145 XnStatus DetectSteady(XnUInt32 nId, const XnPoint3D& pt, XnFloat fTime); 00146 00147 // broadcasts the event to all listeners 00148 virtual void OnSteadyDetected(XnUInt32 nId, XnFloat fStdDev); 00149 virtual void OnNotSteadyDetected(XnUInt32 nId, XnFloat fStdDev); 00150 00151 XnUInt32 m_nDetectionDuration; 00152 XnFloat m_fMaximumStdDevForSteady; 00153 XnFloat m_fMaximumVarianceForSteady; 00154 XnFloat m_fMinimumStdDevForNotSteady; 00155 XnFloat m_fMinimumVarianceForNotSteady; 00156 00157 XnUInt32 m_nInitialCooldownFrames; 00158 00159 struct SteadyState 00160 { 00161 XnUInt32 nCurrentCooldownFrames; 00162 XnBool bCurrentSteady; 00163 XnVPointBuffer* pPoints; 00164 }; 00165 XN_DECLARE_DEFAULT_HASH(XnUInt32, SteadyState*, SteadyStates); 00166 SteadyStates m_SteadyStates; 00167 private: 00168 XnVUintFloatSpecificEvent m_SteadyCBs; 00169 XnVUintFloatSpecificEvent m_NotSteadyCBs; 00170 }; // XnVSteadyDetector 00171 00172 #endif // _XNV_STEADY_DETECTOR_H_