BlobTracker.h
上传用户:sdgangtie
上传日期:2020-03-07
资源大小:7324k
文件大小:5k
开发平台:

Visual C++

  1. #pragma once
  2. #include "cvaux.h" #include "highgui.h" #include <stdio.h>
  3. #include <time.h>
  4. /************************************************************************/
  5. /*                        前景检测模块——背景差部分                    */
  6. /************************************************************************/
  7. // 动态连接库计算两幅图像间的仿射变换矩阵
  8. #pragma comment (lib,"../Release/SIFT_VC")
  9. extern "C" __declspec(dllimport) void GetMaskBySIFT( IplImage* img1, IplImage* img2, int flag, CvMat *T );
  10. class FGDetector :
  11. public CvFGDetector
  12. {
  13. public:
  14. FGDetector(void);
  15. ~FGDetector(void);
  16. IplImage* GetMask(void);
  17. void Process(IplImage* pFrame);
  18. void Release(void);
  19. private:
  20. int m_FrameCount;
  21. int m_Transform; // 计算方式:‘1’为仿射变换;‘0’为透视变换
  22. double m_Threshold; // 前景阈值化参数,大小一般为10-30之间
  23. IplImage* m_pFramePre;
  24. IplImage* m_pFGMask;
  25. IplImage* m_pTransPre;
  26. };
  27. static CvFGDetector* cvCreateFGDetectorBoa() { return new FGDetector(); }
  28. /************************************************************************/
  29. /*                      对象检测模块——连通分量方法                    */
  30. /************************************************************************/
  31. class BlobDetector :
  32. public CvBlobDetector
  33. {
  34. public:
  35. BlobDetector(void);
  36. ~BlobDetector(void);
  37. int DetectNewBlob(IplImage* pImg, IplImage* pImgFG, CvBlobSeq* pNewBlobList, CvBlobSeq* pOldBlobList);
  38. void Release(void);
  39. private:
  40. void cvFindBlobsByCCClasters(IplImage* pFG, CvBlobSeq* pBlobs, CvMemStorage* storage);
  41. double m_HMin;
  42. double m_HMax;
  43. double m_WMin;
  44. double m_WMax;
  45. };
  46. static CvBlobDetector* cvCreateBlobDetectorBoa() { return new BlobDetector(); }
  47. /************************************************************************/
  48. /*                     轨迹生成模块——对象特征方法                     */
  49. /************************************************************************/
  50. typedef struct DefBlobTrack { CvBlob      blob; CvBlobSeq*  pSeq; int         FrameBegin; int         FrameLast; int         Saved; } DefBlobTrack;
  51. class BlobTrackGen :
  52. public CvBlobTrackGen
  53. {
  54. public:
  55. BlobTrackGen(void);
  56. ~BlobTrackGen(void);
  57. void SetFileName(char* pFileName);
  58. void AddBlob(CvBlob* pBlob);
  59. void Process(IplImage* pImg, IplImage* pFG);
  60. void Release(void);
  61. CvBlobSeq *GetTrackList(){return &m_TrackList;};
  62. private:
  63. int m_FrameCount;
  64. int m_Transform; // 计算方式:‘1’为仿射变换;‘0’为透视变换
  65. char* m_pFileName;
  66. CvSize m_Size;
  67. CvBlobSeq m_TrackList;
  68. CvPoint2D64f affine_xform_pt(CvPoint2D64f pt, CvMat* T);
  69. CvPoint2D64f persp_xform_pt(CvPoint2D64f pt, CvMat* T);
  70. void SaveAll(void);
  71. };
  72. static CvBlobTrackGen* cvCreateModuleBlobTrackGenBoa() { return new BlobTrackGen(); }
  73. /************************************************************************/
  74. /*                主模块——各个子模块综合模块                          */
  75. /************************************************************************/
  76. typedef struct CvBlobTrackAuto { CvBlob  blob; int     BadFrames; } CvBlobTrackAuto;
  77. struct CvBlobTrackerAutoParam { int FGTrainFrames; CvFGDetector* pFG; CvBlobDetector* pBD; CvBlobTracker* pBT;  CvBlobTrackGen* pBTGen;  CvBlobTrackPostProc* pBTPP;   int UsePPData; CvBlobTrackAnalysis* pBTA; };
  78. class BlobTrackerAuto: public CvBlobTrackerAuto
  79. {
  80. public:
  81. BlobTrackerAuto(CvBlobTrackerAutoParam* param);
  82. ~BlobTrackerAuto();
  83. CvBlob* GetBlob(int index){return m_BlobList.GetBlob(index);};
  84. CvBlob* GetBlobByID(int ID){return m_BlobList.GetBlobByID(ID);};
  85. int     GetBlobNum(){return m_BlobList.GetBlobNum();};
  86. virtual IplImage* GetFGMask(){return m_pFGMask;};
  87. float   GetState(int BlobID){return m_pBTA?m_pBTA->GetState(BlobID):0;};
  88. const char*   GetStateDesc(int BlobID){return m_pBTA?m_pBTA->GetStateDesc(BlobID):NULL;};
  89. void Process(IplImage* pImg, IplImage* pMask = NULL);
  90. void Release(){delete this;};
  91. virtual void SaveState(CvFileStorage* fs)
  92. {
  93. cvWriteInt(fs,"FrameCount",m_FrameCount);
  94. cvWriteInt(fs,"NextBlobID",m_NextBlobID);
  95. m_BlobList.Write(fs,"BlobList");
  96. };
  97. virtual void LoadState(CvFileStorage* fs, CvFileNode* node)
  98. {
  99. CvFileNode* BlobListNode = cvGetFileNodeByName(fs,node,"BlobList");
  100. m_FrameCount = cvReadIntByName(fs,node, "FrameCount", m_FrameCount);
  101. m_NextBlobID = cvReadIntByName(fs,node, "NextBlobID", m_NextBlobID);
  102. if(BlobListNode)
  103. {
  104. m_BlobList.Load(fs,BlobListNode);
  105. }
  106. };
  107. CvBlobTrackGen* GetTrackGen() { return m_pBTGen; };
  108. private:
  109. IplImage*               m_pFGMask;
  110. int                     m_FGTrainFrames;
  111. CvFGDetector*           m_pFG; 
  112. CvBlobTracker*          m_pBT;
  113. CvBlobDetector*         m_pBD;
  114. CvBlobTrackGen*         m_pBTGen;
  115. CvBlobTrackPostProc*    m_pBTPostProc;
  116. int                     m_UsePPData;
  117. CvBlobTrackAnalysis*    m_pBTA;
  118. CvBlobSeq               m_BlobList;
  119. int                     m_FrameCount;
  120. int                     m_NextBlobID;
  121. };
  122. static CvBlobTrackerAuto* cvCreateBlobTrackerAutoBoa(CvBlobTrackerAutoParam* param) { return (CvBlobTrackerAuto*)new BlobTrackerAuto(param); } //////////////////////////////////////////////////////////////////////////