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

Visual C++

  1. #include "StdAfx.h"
  2. #include "RunTrack.h"
  3. RunTrack::RunTrack(void)
  4. : m_pFilePath(NULL)
  5. , m_pCapture(NULL)
  6. , m_pImage(NULL)
  7. , m_pTracker(NULL)
  8. , m_FrameCount(0)
  9. , m_State(0)
  10. , m_Style(0)
  11. {
  12. m_Param.FGTrainFrames = 0; m_Param.pFG = NULL; m_Param.pBD = NULL; m_Param.pBT = NULL; m_Param.pBTGen = NULL; m_Param.pBTA = NULL; m_Param.pBTPP = NULL; m_Param.UsePPData = 0;
  13. }
  14. RunTrack::~RunTrack(void)
  15. {
  16. ReleaseParam();
  17. if(m_pImage) cvReleaseImage(&m_pImage);
  18. if(m_pCapture) cvReleaseCapture(&m_pCapture);
  19. if(m_pTracker) cvReleaseBlobTrackerAuto(&m_pTracker);
  20. }
  21. int RunTrack::Init(char* pFilePath,int _style, CvParamSet m_ParamSet)
  22. {
  23. m_pFilePath = pFilePath;
  24. if(m_pFilePath == NULL)
  25. return 0;
  26. if(m_pCapture)
  27. cvReleaseCapture(&m_pCapture);
  28. m_pCapture = cvCaptureFromFile(m_pFilePath);
  29. m_State = 0;
  30. m_Style = _style;
  31. if (m_Style > 0)
  32. {
  33. if (m_pTracker) 
  34. {
  35. cvReleaseBlobTrackerAuto(&m_pTracker);
  36. }
  37. ResetParam(m_ParamSet);
  38. if (m_Param.pBTGen&&m_Param.UsePPData)
  39. {
  40. sprintf(m_GenFile,"%s.xml",m_pFilePath);
  41. m_Param.pBTGen->SetFileName(m_GenFile);
  42. }
  43. m_pTracker = new BlobTrackerAuto(&m_Param);
  44. }
  45. m_FrameCount = 0;
  46. return (int)cvGetCaptureProperty(m_pCapture,CV_CAP_PROP_FRAME_COUNT);
  47. }
  48. void RunTrack::Run(void)
  49. {
  50. m_State = 1;
  51. }
  52. void RunTrack::Pause(void)
  53. {
  54. m_State = 2;
  55. }
  56. void RunTrack::Stop(void)
  57. {
  58. m_State = 0;
  59. m_FrameCount = 0;
  60. }
  61. int RunTrack::GetState(void)
  62. {
  63. return m_State;
  64. }
  65. IplImage* RunTrack::GetNextFrame(void)
  66. {
  67. if(m_State == 0)
  68. {
  69. if (m_pImage) cvReleaseImage(&m_pImage);
  70. m_pImage = NULL;
  71. }
  72. if(m_State == 1)
  73. {
  74. if(m_pCapture)
  75. {
  76. IplImage* pImg = cvQueryFrame(m_pCapture);
  77. if(pImg != NULL)  { m_FrameCount++;
  78. if (m_Style == 0)
  79. {
  80. if (m_pImage) cvReleaseImage(&m_pImage);
  81. m_pImage = cvCloneImage(pImg);
  82. }
  83. else if(m_Style == 1)
  84. {
  85. if(m_pTracker) m_pTracker->Process(pImg);
  86. if (m_pImage) cvReleaseImage(&m_pImage);
  87. m_pImage = cvCloneImage(m_pTracker->GetFGMask());
  88. }
  89. else if (m_Style == 2)
  90. {
  91. if(m_pTracker) m_pTracker->Process(pImg);
  92. if (m_pImage) cvReleaseImage(&m_pImage);
  93. m_pImage = ProcessResult(pImg, m_pTracker);
  94. }
  95. }
  96. else
  97. {
  98. m_State = 0;
  99. m_FrameCount = 0;
  100. }
  101. }
  102. }
  103. return m_pImage;
  104. }
  105. int RunTrack::GetFrameCount(void)
  106. {
  107. return m_FrameCount;
  108. }
  109. void RunTrack::SetPosition(int Pos)
  110. {
  111. m_FrameCount = Pos;
  112. cvSetCaptureProperty(m_pCapture,CV_CAP_PROP_POS_FRAMES,Pos);
  113. }
  114. CString RunTrack::GetTimeFre(void)
  115. {
  116. CString retval;
  117. if (m_State != 0)
  118. {
  119. double AllFrames = cvGetCaptureProperty(m_pCapture,CV_CAP_PROP_FRAME_COUNT);
  120. double NowFrames = cvGetCaptureProperty(m_pCapture,CV_CAP_PROP_POS_FRAMES);
  121. retval.Format(TEXT("%d / %d"),(int)NowFrames,(int)AllFrames);
  122. }
  123. return retval;
  124. }
  125. IplImage* RunTrack::ProcessResult(IplImage* pImage, CvBlobTrackerAuto* m_pTracker)
  126. {
  127. char str[1024];
  128. int line_type = CV_AA;
  129. CvFont font;
  130. static IplImage* pI;
  131. if (pI) cvReleaseImage(&pI);
  132. pI = cvCloneImage(pImage);
  133. cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, 1.2, 1.2, 0, 2, line_type);
  134. for(int i=m_pTracker->GetBlobNum(); i>0; i--)
  135. {
  136. CvSize  TextSize;
  137. CvBlob* pB = m_pTracker->GetBlob(i-1);
  138. CvPoint p = cvPoint(cvRound(pB->x*256),cvRound(pB->y*256));
  139. CvSize  s = cvSize(MAX(1,cvRound(CV_BLOB_RX(pB)*256)), MAX(1,cvRound(CV_BLOB_RY(pB)*256)));
  140. int c = cvRound(255*m_pTracker->GetState(CV_BLOB_ID(pB)));
  141. cvEllipse(pI, p, s, 0, 0, 360, CV_RGB(c,255-c,0), 2, CV_AA, 8);
  142. p.x >>= 8; p.y >>= 8; s.width >>= 8; s.height >>= 8;
  143. sprintf(str,"%d",CV_BLOB_ID(pB));
  144. cvGetTextSize( str, &font, &TextSize, NULL );
  145. p.y -= s.height;
  146. cvPutText( pI, str, p, &font, CV_RGB(0,255,255));
  147. {
  148. const char* pS = m_pTracker->GetStateDesc(CV_BLOB_ID(pB));
  149. if(pS)
  150. {
  151. char* pStr = strdup(pS);
  152. char* pStrFree = pStr;
  153. while (pStr && strlen(pStr) > 0)
  154. {
  155. char* str_next = strchr(pStr,'n');
  156. if(str_next)
  157. {
  158. str_next[0] = 0; str_next++;
  159. }
  160. p.y += TextSize.height+1;
  161. cvPutText( pI, pStr, p, &font, CV_RGB(0,255,255));
  162. pStr = str_next;
  163. }
  164. free(pStrFree);
  165. }
  166. }
  167. }
  168. BlobTrackerAuto* pTracker = (BlobTrackerAuto*)m_pTracker;
  169. BlobTrackGen *pGen= (BlobTrackGen*)pTracker->GetTrackGen();
  170. if (pGen)
  171. {
  172. CvBlobSeq *m_TrackList = pGen->GetTrackList();
  173. for(int i=m_TrackList->GetBlobNum(); i>0; i--) { DefBlobTrack* pTrack = (DefBlobTrack*)m_TrackList->GetBlob(i-1); CvBlobSeq* pSeq = pTrack->pSeq; if (pTrack->FrameLast+1 < m_FrameCount)
  174. continue;
  175. for(int j=0; j<pSeq->GetBlobNum()-1; j++) { CvBlob* pB1 = pSeq->GetBlob(j); CvBlob* pB2 = pSeq->GetBlob(j+1); CvPoint p1 =cvPoint(cvRound(pB1->x*256),cvRound(pB1->y*256)); CvPoint p2 =cvPoint(cvRound(pB2->x*256),cvRound(pB2->y*256)); cvLine(pI, p1, p2, CV_RGB(0,255,255), 2, CV_AA, 8 ); }
  176. }
  177. }
  178. return cvCloneImage(pI);
  179. }
  180. void RunTrack::ReleaseParam(void)
  181. {
  182. if(m_Param.pFG) cvReleaseFGDetector(&m_Param.pFG);m_Param.pFG = NULL; if(m_Param.pBD) cvReleaseBlobDetector(&m_Param.pBD);m_Param.pBD = NULL; if(m_Param.pBT) cvReleaseBlobTracker(&m_Param.pBT);m_Param.pBT = NULL; if(m_Param.pBTGen) cvReleaseBlobTrackGen(&m_Param.pBTGen);m_Param.pBTGen = NULL; if(m_Param.pBTPP) cvReleaseBlobTrackPostProc(&m_Param.pBTPP);m_Param.pBTPP = NULL; if(m_Param.pBTA) cvReleaseBlobTrackAnalysis(&m_Param.pBTA);m_Param.pBTA = NULL;
  183. }
  184. void RunTrack::ResetParam(CvParamSet m_ParamSet) { ReleaseParam(); if (m_Style > 0)
  185. { m_Param.FGTrainFrames = 0; if (m_ParamSet.m_FG == 1)
  186. {
  187. m_Param.pFG = cvCreateFGDetectorBoa();
  188. if (m_Param.pFG)
  189. {
  190. m_Param.pFG->SetParam("Threshold",m_ParamSet.m_Threshold);
  191. }
  192. }
  193. else if (m_ParamSet.m_FG == 2)
  194. m_Param.pFG = cvCreateFGDetectorBase(CV_BG_MODEL_FGD, NULL);
  195. else if (m_ParamSet.m_FG == 3)
  196. m_Param.pFG = cvCreateFGDetectorBase(CV_BG_MODEL_MOG, NULL);
  197. else
  198. m_Param.pFG = NULL;
  199. if (m_Style > 1)
  200. {
  201. m_Param.pBD = cvCreateBlobDetectorBoa();
  202. if (m_ParamSet.m_BT == 1)
  203. m_Param.pBT = cvCreateBlobTrackerCC();
  204. else if (m_ParamSet.m_BT == 2)
  205. m_Param.pBT = cvCreateBlobTrackerMSFG();
  206. else if (m_ParamSet.m_BT == 3)
  207. m_Param.pBT = cvCreateBlobTrackerMSPF();
  208. else
  209. m_Param.pBT = NULL;
  210. if (m_ParamSet.m_Check)
  211. {
  212. m_Param.pBTGen = cvCreateModuleBlobTrackGenBoa();
  213. m_Param.UsePPData = 1;
  214. if (m_ParamSet.m_BPP == 1)
  215. m_Param.pBTPP = cvCreateModuleBlobTrackPostProcKalman();
  216. else if (m_ParamSet.m_BPP == 2)
  217. m_Param.pBTPP = cvCreateModuleBlobTrackPostProcTimeAverRect();
  218. else if (m_ParamSet.m_BPP == 3)
  219. m_Param.pBTPP = cvCreateModuleBlobTrackPostProcTimeAverExp();
  220. else
  221. m_Param.pBTPP = NULL;
  222. if (m_ParamSet.m_BTA == 1)
  223. m_Param.pBTA = cvCreateModuleBlobTrackAnalysisTrackDist();
  224. else if (m_ParamSet.m_BTA == 2)
  225. m_Param.pBTA = cvCreateModuleBlobTrackAnalysisHistP();
  226. else if (m_ParamSet.m_BTA == 3)
  227. m_Param.pBTA = cvCreateModuleBlobTrackAnalysisHistPV();
  228. else if (m_ParamSet.m_BTA == 4)
  229. m_Param.pBTA = cvCreateModuleBlobTrackAnalysisHistPVS();
  230. else
  231. m_Param.pBTA = NULL;
  232. }
  233. else
  234. {
  235. m_Param.pBTGen = NULL;
  236. m_Param.UsePPData = 0; m_Param.pBTPP = NULL; m_Param.pBTA = NULL;
  237. }
  238. }
  239. } }