DXAppDoc.cpp
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:8k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. /**   * HandVu - a library for computer vision-based hand gesture   * recognition.   * Copyright (C) 2004 Mathias Kolsch, matz@cs.ucsb.edu   *   * This program is free software; you can redistribute it and/or   * modify it under the terms of the GNU General Public License   * as published by the Free Software Foundation; either version 2   * of the License, or (at your option) any later version.   *   * This program is distributed in the hope that it will be useful,   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   * GNU General Public License for more details.   *   * You should have received a copy of the GNU General Public License   * along with this program; if not, write to the Free Software   * Foundation, Inc., 59 Temple Place - Suite 330,    * Boston, MA  02111-1307, USA.   *   * $Id: DXAppDoc.cpp,v 1.11 2004/11/24 08:38:40 matz Exp $ **/ #include "stdafx.h"
  2. #include "Common.h"
  3. #include "DXApp.h"
  4. #include "DXAppDoc.h"
  5. #include "DXAppView.h"
  6. #include <direct.h>  // for getcwd
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #endif
  10. // CDXAppDoc
  11. IMPLEMENT_DYNCREATE(CDXAppDoc, CDocument)
  12. BEGIN_MESSAGE_MAP(CDXAppDoc, CDocument)
  13.   ON_COMMAND(ID_OVERLAY_LEVEL_0, OnOverlayLevel0)
  14.   ON_COMMAND(ID_OVERLAY_LEVEL_1, OnOverlayLevel1)
  15.   ON_COMMAND(ID_OVERLAY_LEVEL_2, OnOverlayLevel2)
  16.   ON_COMMAND(ID_OVERLAY_LEVEL_3, OnOverlayLevel3)
  17.   ON_COMMAND(ID_EXPOSURE_CONTROL, OnExposureControl)
  18.   ON_COMMAND(ID_LATENCY, OnLatency)
  19.   ON_COMMAND(ID_LOAD_CONDUCTOR, OnLoadConductor)
  20.   ON_COMMAND(ID_UNDISTORT, OnUndistort)
  21.   ON_COMMAND(ID_TOGGLE_FULLSCREEN, OnToggleFullscreen)
  22.   ON_COMMAND(ID_RESTART, OnRestart)
  23.   ON_COMMAND(ID_TOGGLE_MAINTENANCEAPP, OnToggleMaintenanceapp)
  24.   ON_COMMAND(ID_TOGGLE_FDL_ONLY, OnToggleFDLOnly)
  25.   ON_COMMAND(ID_SOURCE_WINDOW, OnSourceWindow)
  26.   ON_COMMAND(ID_TAKE_SNAPSHOT, OnTakeSnapshot)
  27. #if defined(HAVE_USER_STUDY)
  28.   ON_COMMAND(ID_ABORT_STUDYHV1_TASK, OnAbortStudyHV1Task)
  29.   ON_COMMAND(ID_ABORT_STUDYHV1_SESSION, OnAbortStudyHV1Session)
  30.   ON_COMMAND(ID_START_STUDY_HV1, OnStartStudyHV1)
  31.   ON_COMMAND(ID_START_STUDY_HV2, OnStartStudyHV2)
  32. #endif
  33. END_MESSAGE_MAP()
  34. // CDXAppDoc construction/destruction
  35. CDXAppDoc::CDXAppDoc()
  36. : m_source_window(false)
  37. {
  38. }
  39. CDXAppDoc::~CDXAppDoc()
  40. {
  41. }
  42. BOOL CDXAppDoc::OnNewDocument()
  43. {
  44. if (!CDocument::OnNewDocument())
  45. return FALSE;
  46. return TRUE;
  47. }
  48. bool CDXAppDoc::StartDXManager(bool print_version)
  49. {
  50.   bool success = false;
  51.   try {
  52.     // start playing live video
  53.     POSITION pos = GetFirstViewPosition();
  54.     CDXAppView* pView = (CDXAppView*) GetNextView( pos );
  55.     ASSERT(pos==NULL);
  56.     success = m_DXManager.BuildGraph(m_source_window, pView);
  57.     if (success) {
  58.       m_DXManager.StartPlayback();
  59.       // resize the window to the video size
  60.       int source_width, source_height;
  61.       m_DXManager.GetVideoSourceSize(&source_width, &source_height);
  62.       CRect viewRect, frameRect;
  63.       pView->GetWindowRect(&viewRect);
  64.     CWnd* pFrame = AfxGetMainWnd();
  65.       ASSERT(pFrame);
  66.       if (pFrame) {
  67.         pFrame->GetWindowRect(&frameRect);
  68.         int border_width = frameRect.right-frameRect.left-(viewRect.right-viewRect.left);
  69.         int border_height = frameRect.bottom-frameRect.top-(viewRect.bottom-viewRect.top);
  70.         int mf_width = source_width+border_width+4;
  71.         int mf_height = source_height+border_height+4;
  72.         pFrame->SetWindowPos(&CWnd::wndTop, -1, -1, 
  73.                             mf_width, mf_height,
  74.                             SWP_NOMOVE);
  75.         VERBOSE2(4, "AppDoc: mainframe width %d, height %d", 
  76.           mf_width, mf_height);
  77.       } else {
  78.         success = false;
  79.       }
  80.     }
  81.   } catch (HVException& hve) {
  82.     AfxMessageBox(hve.GetMessage().c_str());
  83.     success = false;
  84.   }
  85.   VERBOSE1(5, "AppDoc: starting DXManager %s", success?"succeeded":"failed!");
  86.   // print version if requested
  87.   if (print_version) {
  88.     string version;
  89.     m_DXManager.GetVersion(version);
  90.     VERBOSE1(3, "%s", version.c_str());
  91.     fprintf(stderr, "%sn", version.c_str());
  92.   }
  93.   return success;
  94. }
  95. bool CDXAppDoc::SetDefaults(const string& conductor_filename)
  96. {
  97.   VERBOSE1(5, "DXAppDoc: setting defaults and loading conductor %s",
  98.     conductor_filename.c_str());
  99.   try {
  100.     m_DXManager.HV()->LoadConductor(conductor_filename);
  101.   } catch (HVException& hve) {
  102.     AfxMessageBox(hve.GetMessage().c_str());
  103.     return false;
  104.   }
  105.   try {
  106.     m_DXManager.SetExposureControl(1);
  107.     m_DXManager.HV()->SetOverlayLevel(1);
  108.     m_DXManager.HV()->StartRecognition(0);
  109.     //m_DXManager.ToggleFullscreen();
  110.   } catch (HVException& hve) {
  111.     AfxMessageBox(hve.GetMessage().c_str());
  112.     return false;
  113.   }
  114.   return true;
  115. }
  116. void CDXAppDoc::SetHandVuLogfilename(const string& handvu_logfilename) {
  117.   m_DXManager.SetLogfilename(handvu_logfilename);
  118. }
  119. // CDXAppDoc commands
  120. void CDXAppDoc::OnOverlayLevel0()
  121. {
  122.   m_DXManager.HV()->SetOverlayLevel(0);
  123. }
  124. void CDXAppDoc::OnOverlayLevel1()
  125. {
  126.   m_DXManager.HV()->SetOverlayLevel(1);
  127. }
  128. void CDXAppDoc::OnOverlayLevel2()
  129. {
  130.   m_DXManager.HV()->SetOverlayLevel(2);
  131. }
  132. void CDXAppDoc::OnOverlayLevel3()
  133. {
  134.   m_DXManager.HV()->SetOverlayLevel(3);
  135. }
  136. void CDXAppDoc::OnExposureControl()
  137. {
  138.   m_DXManager.ToggleExposureControl();
  139. }
  140. void CDXAppDoc::OnLatency()
  141. {
  142.   m_DXManager.HV()->RecomputeNormalLatency();
  143. }
  144. #define MAX_PATH_CHARS 50000
  145. void CDXAppDoc::OnLoadConductor()
  146. {
  147. // load vision conductor
  148. CFileDialog open_dlg( true, 0, 0, OFN_OVERWRITEPROMPT, 
  149. "vision conductor files (*.conductor)|*.conductor|All Files (*.*)|*.*||", NULL );
  150. char buf[MAX_PATH_CHARS];
  151. buf[0] = 0;
  152. open_dlg.m_ofn.lpstrFile = buf;
  153. open_dlg.m_ofn.nMaxFile = MAX_PATH_CHARS;
  154.     
  155. if (open_dlg.DoModal()==IDOK) {
  156. string str = open_dlg.GetPathName();
  157. if (str.length()>0) {
  158.       try {
  159.         m_DXManager.HV()->LoadConductor(str);
  160.         bool active;
  161.         m_DXManager.HV()->IsActive(&active);
  162.         m_DXManager.HV()->StartRecognition(0);
  163.       } catch (HVException& hve) {
  164.         AfxMessageBox(hve.GetMessage().c_str());
  165.       }
  166.     }
  167.   }
  168. }
  169. void CDXAppDoc::OnUndistort()
  170. {
  171.   bool possible;
  172.   m_DXManager.HV()->CanCorrectDistortion(&possible);
  173.   if (possible) {
  174.     bool onoff;
  175.     m_DXManager.HV()->IsCorrectingDistortion(&onoff);
  176.     m_DXManager.HV()->CorrectDistortion(!onoff);
  177.   }
  178. }
  179. void CDXAppDoc::OnToggleFullscreen()
  180. {
  181.   m_DXManager.ToggleFullscreen();
  182. }
  183. void CDXAppDoc::OnRestart()
  184. {
  185.   m_DXManager.HV()->StartRecognition(0);
  186. }
  187. void CDXAppDoc::OnToggleMaintenanceapp()
  188. {
  189.   m_DXManager.HV()->ToggleMaintenanceApp();
  190. }
  191. void CDXAppDoc::OnToggleFDLOnly()
  192. {
  193.   m_DXManager.HV()->ToggleFDLOnly();
  194. }
  195. void CDXAppDoc::OnSourceWindow()
  196. {
  197.   m_DXManager.StopPlayback();
  198.   m_source_window = !m_source_window;
  199.   if (StartDXManager(false)) {
  200.     try {
  201.       m_DXManager.HV()->StartRecognition(0);
  202.     } catch (HVException& hve) {
  203.       AfxMessageBox(hve.GetMessage().c_str());
  204.     }
  205.     m_DXManager.HV()->RecomputeNormalLatency();
  206.     POSITION pos = GetFirstViewPosition();
  207.     CView* pView = GetNextView( pos );
  208.     ASSERT(pos==NULL);
  209.     pView->SendMessage(WM_SIZE, 0, 0);
  210.   }
  211. }
  212. void CDXAppDoc::OnTakeSnapshot()
  213. {
  214.   m_DXManager.HV()->TakeSnapshot();
  215. }
  216. #if defined(HAVE_USER_STUDY)
  217. void CDXAppDoc::OnAbortStudyHV1Task()
  218. {
  219.   m_DXManager.HV()->AbortStudyHV1Task();
  220. }
  221. void CDXAppDoc::OnAbortStudyHV1Session()
  222. {
  223.   m_DXManager.HV()->AbortStudyHV1Session();
  224. }
  225. void CDXAppDoc::OnStartStudyHV1()
  226. {
  227.   m_DXManager.HV()->StartStudyHV1();
  228. }
  229. void CDXAppDoc::OnStartStudyHV2()
  230. {
  231.   m_DXManager.HV()->StartStudyHV2();
  232. }
  233. #endif