www.pudn.com > Gesture[20040824].rar > GestureDoc.cpp


// GestureDoc.cpp : implementation of the CGestureDoc class 
// 
 
#include "stdafx.h" 
#include "Gesture.h" 
 
#include "GestureDoc.h" 
#include "GestureView.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CGestureDoc 
 
IMPLEMENT_DYNCREATE(CGestureDoc, CDocument) 
 
BEGIN_MESSAGE_MAP(CGestureDoc, CDocument) 
	//{{AFX_MSG_MAP(CGestureDoc) 
	ON_COMMAND(ID_GESTURE_SOURCE, OnOpenHandVideo) 
	ON_COMMAND(ID_BACKGROUND_SOURCE, OnOpenBkgVideo) 
	ON_COMMAND(ID_BACKGROUND_OPENBKGIMAGE, OnOpenBkgImage) 
	ON_COMMAND(ID_GESTURE_THRESHOLDING, OnGestureThresholding) 
	ON_COMMAND(ID_GESTURE_FEATUREDETECTION, OnGestureFeaturedetection) 
	ON_COMMAND(ID_SKINCOLOR_OPENSKINIMAGE, OnOpenSkinImage) 
	ON_COMMAND(ID_BACKGROUND_TRAINBACKGROUND, OnBackgroundTrainbackground) 
	ON_COMMAND(ID_BACKGROUND_TEST, OnBackgroundTest) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CGestureDoc construction/destruction 
 
CGestureDoc::CGestureDoc() 
{ 
	m_BkgAvi = new CCamAvi; 
	m_HandAvi = new CCamAvi; 
	m_currAvi = NULL; 
 
	m_background = new CBackground(m_BkgAvi); 
	m_skin = new CSkinColor; 
	m_gesture = new CHandGesture(m_background,m_skin); 
	showflag = false; 
} 
 
CGestureDoc::~CGestureDoc() 
{ 
} 
 
BOOL CGestureDoc::OnNewDocument() 
{ 
	if (!CDocument::OnNewDocument()) 
		return FALSE; 
 
	// TODO: add reinitialization code here 
	// (SDI documents will reuse this document) 
 
	return TRUE; 
} 
 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CGestureDoc serialization 
 
void CGestureDoc::Serialize(CArchive& ar) 
{ 
	if (ar.IsStoring()) 
	{ 
		// TODO: add storing code here 
	} 
	else 
	{ 
		// TODO: add loading code here 
	} 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CGestureDoc diagnostics 
 
#ifdef _DEBUG 
void CGestureDoc::AssertValid() const 
{ 
	CDocument::AssertValid(); 
} 
 
void CGestureDoc::Dump(CDumpContext& dc) const 
{ 
	CDocument::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CGestureDoc commands 
 
CView *CGestureDoc::GetGestureView() 
{ 
   POSITION pos = GetFirstViewPosition(); 
   while (pos != NULL) 
   { 
      CView* pView = GetNextView(pos); 
      if ( pView->IsKindOf( RUNTIME_CLASS(CGestureView) ) ) 
		  return pView; 
   } 
   return NULL; 
} 
 
void CGestureDoc::OnOpenHandVideo()  
{ 
	CFileDialog AviOpenDialog(true, "avi", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT , "avi 文件 (*.avi)|*.avi"); 
	if ( AviOpenDialog.DoModal() == IDOK ) 
	{ 
		m_currAvi = m_HandAvi; 
		if (m_currAvi->GetInitStatus()) m_currAvi->Uninitialize(); 
		m_currAvi->Initialize(AviOpenDialog.GetPathName()); 
 
		CGestureView *pView = (CGestureView *)GetGestureView(); 
		pView->SetAviStatus( Stopped ); 
		pView->SetShowStatus( ShowHandAvi ); 
		m_currAvi->SetReaderPosition(0); 
		m_currAvi->GetFrameFromAvi(); 
		pView->InitializeShowingWindows( m_currAvi->GetFramePointer() ); 
		pView->Invalidate(true); 
 
		m_gesture->Initialize(m_currAvi->GetFramePointer()->Width(),m_currAvi->GetFramePointer()->Height()); 
	} 
} 
 
void CGestureDoc::OnOpenBkgVideo()  
{ 
	CFileDialog AviOpenDialog(true, "avi", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT , "avi 文件 (*.avi)|*.avi"); 
	if ( AviOpenDialog.DoModal() == IDOK ) 
	{ 
		m_currAvi = m_BkgAvi; 
		if (m_currAvi->GetInitStatus()) m_currAvi->Uninitialize(); 
		m_currAvi->Initialize(AviOpenDialog.GetPathName()); 
 
		CGestureView *pView = (CGestureView *)GetGestureView(); 
		pView->SetAviStatus( Stopped ); 
		pView->SetShowStatus( ShowBkgAvi ); 
		m_currAvi->SetReaderPosition(0); 
		m_currAvi->GetFrameFromAvi(); 
		pView->InitializeShowingWindows( m_currAvi->GetFramePointer() ); 
		pView->Invalidate(true); 
		 
		showflag = true; 
	} 
	GetCBackground()->Settestflag(); 
} 
 
void CGestureDoc::OnOpenBkgImage()  
{ 
	CFileDialog filedialog(true, "bmp", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT , "bmp 文件 (*.bmp)|*.bmp"); 
	if ( filedialog.DoModal() == IDOK ) 
	{ 
		CImage *image = m_background->GetBkgImage(); 
		image->LoadBMP2IPL(filedialog.GetPathName(), true); 
		m_background->ConvertColorBkg2GrayBkg(); 
		m_background->SetBkgStatus(true); 
		CGestureView *pView = (CGestureView *)GetGestureView(); 
		pView->SetShowStatus( ShowBkgImage ); 
		pView->InitializeShowingWindows( image ); 
		pView->Invalidate(true); 
	} 
} 
 
void CGestureDoc::OnOpenSkinImage()  
{ 
	CFileDialog filedialog(true, "bmp", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT , "bmp 文件 (*.bmp)|*.bmp"); 
	if ( filedialog.DoModal() == IDOK ) 
	{/* 
		CImage *image = new CImage; 
		image->LoadBMP2IPL(filedialog.GetPathName(), true); 
		IplImage *image; 
		m_skin->GetSkinImage()->LoadIPL2IPL(grayimage); 
		m_skin->SetSkinStatus(true); 
		delete image; 
 
		CGestureView *pView = (CGestureView *)GetGestureView(); 
		pView->SetShowStatus( ShowBkgImage ); 
		pView->InitializeShowingWindows( image ); 
		pView->Invalidate(true); 
	*/} 
} 
 
void CGestureDoc::OnGestureThresholding()  
{ 
	m_gesture->ExtractHandRegion(m_HandAvi->GetFramePointer()->GetImage()); 
	 
	CGestureView *pView = (CGestureView *)GetGestureView(); 
	pView->SetShowStatus( ShowThreshImage ); 
	pView->Invalidate(true); 
} 
 
void CGestureDoc::OnGestureFeaturedetection()  
{ 
	m_gesture->ExtractHandRegion(m_HandAvi->GetFramePointer()->GetImage()); 
	m_gesture->ExtractStatisticFeatures(); 
	m_gesture->ExtractContourFeatures(); 
	 
	CGestureView *pView = (CGestureView *)GetGestureView(); 
	pView->SetShowStatus( ShowFeatureImage ); 
	pView->Invalidate(true); 
} 
 
void CGestureDoc::OnBackgroundTrainbackground()  
{ 
	GetCBackground()->ExtractBackgroundFromVideo(); 
	GetCBackground()->Settestflag(); 
} 
 
void CGestureDoc::OnBackgroundTest()  
{ 
	GetCBackground()->Test(); 
	if (showflag){ 
		showflag = false; 
	} 
	CGestureView *pView = (CGestureView *)GetGestureView(); 
	pView->Invalidate(true); 
}