MainFrm.cpp
上传用户:smdfuse
上传日期:2015-11-06
资源大小:98k
文件大小:15k
源码类别:

图形图象

开发平台:

Visual C++

  1. // MainFrm.cpp : implementation of the CMainFrame class
  2. //
  3. #include "stdafx.h"
  4. #include "Video Demo.h"
  5. #include "Video demodoc.h"
  6. #include "MainFrm.h"
  7. #include "AVIHandler.h"   // AVI文件处理
  8. #include "colortrans.h"
  9. #include "StaticDetect.h"
  10. #include "ChafenMul.h"
  11. #include "POSDiag.h"
  12. #include "MotionDetectDiag.h"
  13. #include "GravityTrack.h"
  14. #include "GravityCenter.h"
  15. #ifdef _DEBUG
  16. #define new DEBUG_NEW
  17. #undef THIS_FILE
  18. static char THIS_FILE[] = __FILE__;
  19. #endif
  20. /////////////////////////////////////////////////////////////////////////////
  21. // CMainFrame
  22. IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
  23. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  24. //{{AFX_MSG_MAP(CMainFrame)
  25. ON_WM_CREATE()
  26. ON_COMMAND(ID_FILE_OPENVIDEO, OnFileOpenvideo)
  27. ON_COMMAND(ID_MOTION_SD, OnMotionSd)
  28. ON_COMMAND(ID_MOTION_DD, OnMotionDd)
  29. ON_COMMAND(ID_TRACEK_MEANSHIFT, OnTracekMeanshift)
  30. ON_COMMAND(ID_TRACEK_GAV, OnTracekGav)
  31. //}}AFX_MSG_MAP
  32. END_MESSAGE_MAP()
  33. static UINT indicators[] =
  34. {
  35. ID_SEPARATOR,           // status line indicator
  36. ID_INDICATOR_CAPS,
  37. ID_INDICATOR_NUM,
  38. ID_INDICATOR_SCRL,
  39. };
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CMainFrame construction/destruction
  42. CMainFrame::CMainFrame()
  43. {
  44. // TODO: add member initialization code here
  45. }
  46. CMainFrame::~CMainFrame()
  47. {
  48. }
  49. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  50. {
  51. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  52. return -1;
  53. //if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
  54. // | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  55. // !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
  56. // {
  57. // TRACE0("Failed to create toolbarn");
  58. // return -1;      // fail to create
  59. // }
  60. if (!m_wndStatusBar.Create(this) ||
  61. !m_wndStatusBar.SetIndicators(indicators,
  62.   sizeof(indicators)/sizeof(UINT)))
  63. {
  64. TRACE0("Failed to create status barn");
  65. return -1;      // fail to create
  66. }
  67. // TODO: Delete these three lines if you don't want the toolbar to
  68. //  be dockable
  69. //m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  70. // EnableDocking(CBRS_ALIGN_ANY);
  71. // DockControlBar(&m_wndToolBar);
  72. return 0;
  73. }
  74. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
  75. {
  76. if( !CFrameWnd::PreCreateWindow(cs) )
  77. return FALSE;
  78. // TODO: Modify the Window class or styles here by modifying
  79. //  the CREATESTRUCT cs
  80. return TRUE;
  81. }
  82. /************************************************************************/
  83. /* OnOpenOpenVideo                                                      */
  84. /* 打开AVI视频文件                                                      */
  85. /* 基于中央数据级控架构 */
  86. /************************************************************************/
  87. void CMainFrame::OnOpenOpenVideo()
  88. {
  89. AVIHandler *avi = NULL;
  90. //添加一路视频
  91. //考虑的问题是,如何将参数传递,到框架
  92. CString strFilter("Data Files (*.avi)|*.avi");
  93. CFileDialog diag(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,strFilter);
  94. //打开第一个文件
  95. int nID = diag.DoModal();
  96. if(nID == IDOK){
  97. // 新建一个子窗口
  98. POSITION pos=theApp.m_pDocManager->GetFirstDocTemplatePosition();
  99. // 取得一个文档模板,我取的是第一个,你可以去任何一个模板
  100. CDocTemplate* pDocTempl=theApp.m_pDocManager->GetNextDocTemplate(pos);
  101. // 通过打开文件的方式获得一个新窗口,并得到CDocument对象
  102. CVideoDemoDoc * doc = (CVideoDemoDoc *)pDocTempl->OpenDocumentFile(NULL);//theApp.m_pDocManager->OpenDocumentFile(NULL);
  103. // 建立视频数据源
  104. avi = new AVIHandler(diag.GetFileName());    // 打开AVI文件,AVI RGB
  105. theApp.curVideo = new VideoData();           // 当前视频数据源
  106. theApp.curVideo->doc = doc;
  107. theApp.curVideo->index = 0;
  108. theApp.curVideo->ms = (MediaSource*)avi;
  109. // 设置View的显示缓冲
  110. ImageData *id = new ImageData();   
  111. id->bytes = 3;
  112. id->coreDoc = doc;
  113. id->format = IMAGE_FORMAT_RGB24;
  114. id->imgWidth = avi->GetFrameWidth();
  115. id->imgHeight = avi->GetFrameHeight();
  116. id->data = avi->GetSingleFrame(0);                    // 获得第一帧图像
  117. doc->SetData(id);                                     // 设置第一帧图像
  118. // 设置文档和视图的视频源数据
  119. doc->SetVideoSource(theApp.curVideo);                 // 设置Document数据
  120. doc->RefreshView();               // 刷新显示View
  121. }
  122. }
  123. /////////////////////////////////////////////////////////////////////////////
  124. // CMainFrame diagnostics
  125. #ifdef _DEBUG
  126. void CMainFrame::AssertValid() const
  127. {
  128. CFrameWnd::AssertValid();
  129. }
  130. void CMainFrame::Dump(CDumpContext& dc) const
  131. {
  132. CFrameWnd::Dump(dc);
  133. }
  134. #endif //_DEBUG
  135. /////////////////////////////////////////////////////////////////////////////
  136. // CMainFrame message handlers
  137. /************************************************************************/
  138. /* 打开视频文件AVI                                                      */
  139. /************************************************************************/
  140. void CMainFrame::OnFileOpenvideo() 
  141. {
  142. AVIHandler *avi = NULL;
  143. //添加一路视频
  144. //考虑的问题是,如何将参数传递,到框架
  145. CString strFilter("Data Files (*.avi)|*.avi");
  146. CFileDialog diag(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,strFilter);
  147. //打开第一个文件
  148. int nID = diag.DoModal();
  149. if(nID == IDOK){
  150. // 新建一个子窗口
  151. POSITION pos=theApp.m_pDocManager->GetFirstDocTemplatePosition();
  152. // 取得一个文档模板,我取的是第一个,你可以去任何一个模板
  153. CDocTemplate* pDocTempl=theApp.m_pDocManager->GetNextDocTemplate(pos);
  154. // 通过打开文件的方式获得一个新窗口,并得到CDocument对象
  155. CVideoDemoDoc * doc = (CVideoDemoDoc *)pDocTempl->OpenDocumentFile(NULL);//theApp.m_pDocManager->OpenDocumentFile(NULL);
  156. // 建立视频数据源
  157. avi = new AVIHandler(diag.GetFileName());    // 打开AVI文件,AVI RGB
  158. if(!avi->isLoaded())
  159. {
  160. AfxMessageBox("打开文件错误!");
  161. return;
  162. }
  163. if(avi->GetLPBM()->biBitCount != 24)
  164. {
  165. delete avi;
  166. AfxMessageBox("AVI文件必须是24位非压缩彩色视频!");
  167. return;
  168. }
  169. theApp.curVideo = new VideoData();           // 当前视频数据源
  170. theApp.curVideo->doc = doc;
  171. theApp.curVideo->index = 0;
  172. theApp.curVideo->ms = (MediaSource*)avi;
  173. // 设置View的显示缓冲
  174. ImageData *id = new ImageData();   
  175. id->bytes = 3;
  176. id->coreDoc = doc;
  177. id->format = IMAGE_FORMAT_RGB24;
  178. id->imgWidth = avi->GetFrameWidth();
  179. id->imgHeight = avi->GetFrameHeight();
  180. id->data = avi->GetSingleFrame(0);                    // 获得第一帧图像
  181. doc->SetData(id);                                     // 设置第一帧图像
  182. // 设置文档和视图的视频源数据
  183. doc->SetVideoSource(theApp.curVideo);                 // 设置Document数据
  184. doc->RefreshView();               // 刷新显示View
  185. }
  186. }
  187. /************************************************************************/
  188. /* 静止背景目标检测                                                     */
  189. /************************************************************************/
  190. DWORD WINAPI StaticDetectT(LPVOID data){
  191. CVideoDemoDoc *doc = (CVideoDemoDoc*)data;
  192. int frameLength = theApp.curVideo->ms->GetFrameCount();
  193. MediaSource *avi = theApp.curVideo->ms;
  194. unsigned char *frame = avi->GetSingleFrame(0);
  195. int frameWidth = avi->GetFrameWidth();
  196. int frameHeight = avi->GetFrameHeight();
  197. // 色彩变换
  198. ColorTrans ct;
  199. CStatsticDetect sd(frameWidth,frameHeight);
  200. // 输出缓冲
  201. unsigned char * outBuffer = new unsigned char[frameHeight * frameWidth * 3];
  202. for(int i = 0; i < frameLength - 1; i++)
  203. {
  204. // 获得一帧图像
  205. frame = avi->GetSingleFrame(i);
  206. // 转换到灰度图像
  207. //ct.RGB2Gray8(frame,grayBuffer,frameWidth,frameHeight);
  208. sd.ReceiveFrame(i,frame,D_STATISTIC);
  209. // 添加一帧数据
  210. ct.gray2RGB2(sd.m_pDiffImage,outBuffer,frameWidth,frameHeight);
  211. doc->id->data = outBuffer;
  212. doc->RefreshView();
  213. }
  214. delete[] outBuffer;
  215. return 0;
  216. }
  217. /************************************************************************/
  218. /* 静止背景目标检测                                                     */
  219. /************************************************************************/
  220. void CMainFrame::OnMotionSd()
  221. {
  222. DWORD exitCode;
  223. if(GetExitCodeThread(th,&exitCode)){
  224.    TerminateThread(th,exitCode);
  225. }
  226. DWORD pID;
  227. //控制线程播放
  228. int frameLength = theApp.curVideo->ms->GetFrameCount();
  229. MediaSource *avi = theApp.curVideo->ms;
  230. if(!theApp.curVideo)
  231. {
  232. AfxMessageBox("没有打开视频文件 !");
  233. return;
  234. }
  235. // 创建线程
  236. th = CreateThread(NULL,0,StaticDetectT,theApp.curVideo->doc,0,&pID);
  237. }
  238. /************************************************************************/
  239. /* 动止背景目标检测                                                     */
  240. /************************************************************************/
  241. DWORD WINAPI MotionDetectT(LPVOID data){
  242. CVideoDemoDoc *doc = (CVideoDemoDoc*)theApp.curVideo->doc;
  243. int frameLength = theApp.curVideo->ms->GetFrameCount();
  244. MediaSource *avi = theApp.curVideo->ms;
  245. unsigned char *frame = avi->GetSingleFrame(0);
  246. int frameWidth = avi->GetFrameWidth();
  247. int frameHeight = avi->GetFrameHeight();
  248. // 色彩变换
  249. ColorTrans ct;
  250. int *threshold = (int*)data;
  251. MotionDetectDiag diag;
  252. //if(diag.DoModal()){
  253. // threshold = diag.m_index;
  254. //}
  255. CStatsticDetect sd(frameWidth,frameHeight);
  256. //CStaticDetect sd(frameWidth,frameHeight);
  257. ChafenMul cm(frameWidth,frameHeight,*threshold);
  258. // 输出缓冲
  259. unsigned char * outBuffer = new unsigned char[frameHeight * frameWidth * 3];
  260. unsigned char * gray = new unsigned char[frameWidth * frameHeight * 3];
  261. for(int i = 0; i < frameLength - 1; i++)
  262. {
  263. // 获得一帧图像
  264. frame = avi->GetSingleFrame(i);
  265. ct.RGB2Gray8(frame,gray,frameWidth,frameHeight);
  266. // 准备数据
  267. cm.PrepareData(gray,frameWidth,frameHeight);
  268. if(i % 4 == 0 && i != 0)
  269. {
  270. cm.process();
  271. sd.DeNoise(cm.frame1,frameWidth,frameHeight);
  272. ct.gray2RGB2(cm.frame1,outBuffer,frameWidth,frameHeight);
  273. doc->id->data = outBuffer;
  274. doc->RefreshView();
  275. }
  276. }
  277. delete[] outBuffer;
  278. return 0;
  279. }
  280. /************************************************************************/
  281. /* 动背景目标检测                                                       */
  282. /************************************************************************/
  283. void CMainFrame::OnMotionDd() 
  284. {
  285. DWORD exitCode;
  286. if(GetExitCodeThread(th,&exitCode)){
  287.    TerminateThread(th,exitCode);
  288. }
  289. if(theApp.curVideo == NULL)
  290. AfxMessageBox("没有打开视频文件!");
  291. DWORD pID;
  292. //控制线程播放
  293. int frameLength = theApp.curVideo->ms->GetFrameCount();
  294. MediaSource *avi = theApp.curVideo->ms;
  295. int threshold = 100;
  296. MotionDetectDiag mdd;
  297. if(mdd.DoModal())
  298. {
  299. threshold = mdd.m_index;
  300. }
  301. int * thre = (int*)malloc(sizeof(int));
  302. *thre = threshold;
  303. // 创建线程
  304. th = CreateThread(NULL,0,MotionDetectT,thre,0,&pID);
  305. }
  306. /************************************************************************/
  307. /* 动止背景目标检测                                                     */
  308. /************************************************************************/
  309. DWORD WINAPI MSS(LPVOID data){
  310. CVideoDemoDoc *doc = (CVideoDemoDoc*)theApp.curVideo->doc;//(CVideoDemoDoc*)data;
  311. int frameLength = theApp.curVideo->ms->GetFrameCount();
  312. MediaSource *avi = theApp.curVideo->ms;
  313. unsigned char *frame = avi->GetSingleFrame(0);
  314. int frameWidth = avi->GetFrameWidth();
  315. int frameHeight = avi->GetFrameHeight();
  316. MeanShiftSegger* mms = (MeanShiftSegger*)data;
  317. // 输出缓冲
  318. unsigned char * outBuffer = new unsigned char[frameHeight * frameWidth * 3];
  319. for(int i = 0; i < frameLength - 1; i++)
  320. {
  321. // 获得一帧图像
  322. frame = avi->GetSingleFrame(i);
  323. mms->MeanShiftTrackProcess(frame,i);
  324. doc->id->data = frame;
  325. doc->RefreshView();
  326. }
  327. delete[] outBuffer;
  328. return 0;
  329. }
  330. /************************************************************************/
  331. /* MeanShift跟踪                                                        */
  332. /************************************************************************/
  333. void CMainFrame::OnTracekMeanshift() 
  334. {
  335. DWORD exitCode;
  336. if(GetExitCodeThread(th,&exitCode)){
  337.    TerminateThread(th,exitCode);
  338. }
  339. DWORD pID;
  340. if(theApp.curVideo == NULL){
  341. AfxMessageBox("没有打开视频!");
  342. return;
  343. }
  344. int x,y,width,height;
  345. POSDiag pd;
  346. if(pd.DoModal())
  347. {
  348. x= pd.m_x;
  349. y= pd.m_y;
  350. width = pd.m_width;
  351. height = pd.m_height;
  352. }
  353. else
  354. return;
  355. mss = new MeanShiftSegger();
  356. int frameLength = theApp.curVideo->ms->GetFrameCount();
  357. MediaSource *avi = theApp.curVideo->ms;
  358. unsigned char *frame = avi->GetSingleFrame(0);
  359. int frameWidth = avi->GetFrameWidth();
  360. int frameHeight = avi->GetFrameHeight();
  361. mss->InitMeanShiftTracker(frame,frameWidth,frameHeight,x,y,width,height);
  362. th = CreateThread(NULL,0,MSS,mss,0,&pID);
  363. }
  364. /************************************************************************/
  365. /* 重心 法 跟踪                                                         */
  366. /************************************************************************/
  367. DWORD WINAPI GAV(LPVOID data){
  368. int* threshold = (int*)data;
  369. CVideoDemoDoc *doc = (CVideoDemoDoc*)theApp.curVideo->doc;
  370. int frameLength = theApp.curVideo->ms->GetFrameCount();
  371. MediaSource *avi = theApp.curVideo->ms;
  372. unsigned char *frame = avi->GetSingleFrame(0);
  373. int frameWidth = avi->GetFrameWidth();
  374. int frameHeight = avi->GetFrameHeight();
  375. // 输出缓冲
  376. unsigned char * outBuffer = new unsigned char[frameHeight * frameWidth * 3];
  377. unsigned char * grayBuffer =new unsigned char[frameWidth * frameHeight];
  378. ColorTrans ct;
  379. CGravityCenter* m_gravitycenter;
  380. TARGETPARA m_target;
  381. for(int i = 0; i < frameLength - 1; i++)
  382. {
  383. // 获得一帧图像
  384. frame = avi->GetSingleFrame(i);
  385. ct.RGB2Gray8(frame,grayBuffer,frameWidth,frameHeight);
  386. if(i == 0)
  387. {
  388. m_gravitycenter = new CGravityCenter(frameWidth,frameHeight);
  389. m_gravitycenter->InitalObjectTracker(T_GRACENTER,*threshold);
  390. m_gravitycenter->GravityCenter(i, frame);
  391. }
  392. else 
  393. {
  394. m_gravitycenter->GravityCenter(i, frame);
  395. }
  396. m_target = m_gravitycenter->m_result;
  397. /*
  398. // 重心跟踪
  399. WININFO info = GravityTrack(grayBuffer,frameWidth,frameHeight,*threshold);
  400. if(!info.flag)
  401. {
  402. for(int j = max(info.pt.y - info.h / 2,0);j <= min(info.pt.y + info.h / 2,frameHeight); j ++)
  403. for(int i = max(info.pt.x - info.w / 2,0);i <= min(info.pt.x + info.w / 2,frameWidth); i ++)
  404. {
  405. frame[j * frameWidth * 3 + i * 3] = 255;
  406. }
  407. }*/
  408. doc->id->data = frame;
  409. doc->RefreshView();
  410. }
  411. delete[] grayBuffer;
  412. delete[] outBuffer;
  413. return 0;
  414. }
  415. /************************************************************************/
  416. /* 重心法跟踪                                                           */
  417. /************************************************************************/
  418. void CMainFrame::OnTracekGav() 
  419. {
  420. DWORD exitCode;
  421. if(GetExitCodeThread(th,&exitCode)){
  422.    TerminateThread(th,exitCode);
  423. }
  424. DWORD pID;
  425. if(theApp.curVideo == NULL){
  426. AfxMessageBox("没有打开视频!");
  427. return;
  428. }
  429. int threshold = 100;
  430. MotionDetectDiag mdd;
  431. if(mdd.DoModal())
  432. {
  433. threshold = mdd.m_index;
  434. }
  435. int * thre = (int*)malloc(sizeof(int));
  436. *thre = threshold;
  437. th = CreateThread(NULL,0,GAV,thre,0,&pID);
  438. }