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);
}