Go to the documentation of this file.00001
00002
00003
00004
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;
00120 static const XnUInt32 ms_nDefaultInitialCooldown;
00121 static const XnFloat ms_fDefaultMaximumStdDevForSteady;
00122 static const XnFloat ms_fDefaultMinimumStdDevForNotSteady;
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
00145 XnStatus DetectSteady(XnUInt32 nId, const XnPoint3D& pt, XnFloat fTime);
00146
00147
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 };
00171
00172 #endif // _XNV_STEADY_DETECTOR_H_