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


// GestureView.cpp : implementation of the CGestureView 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 
///////////////////////////////////////////////////////////////////////////// 
// CGestureView 
 
IMPLEMENT_DYNCREATE(CGestureView, CView) 
 
BEGIN_MESSAGE_MAP(CGestureView, CView) 
	//{{AFX_MSG_MAP(CGestureView) 
	ON_COMMAND(ID_SHOW_BKGVIDEO, OnShowBkgvideo) 
	ON_UPDATE_COMMAND_UI(ID_SHOW_BKGVIDEO, OnUpdateShowBkgvideo) 
	ON_COMMAND(ID_SHOW_HANDVIDEO, OnShowHandvideo) 
	ON_UPDATE_COMMAND_UI(ID_SHOW_HANDVIDEO, OnUpdateShowHandvideo) 
	ON_COMMAND(ID_MEDIA_NEXTFRAME, OnMediaNextframe) 
	ON_UPDATE_COMMAND_UI(ID_MEDIA_NEXTFRAME, OnUpdateMediaNextframe) 
	ON_COMMAND(ID_MEDIA_PAUSE, OnMediaPause) 
	ON_UPDATE_COMMAND_UI(ID_MEDIA_PAUSE, OnUpdateMediaPause) 
	ON_COMMAND(ID_MEDIA_PLAY, OnMediaPlay) 
	ON_UPDATE_COMMAND_UI(ID_MEDIA_PLAY, OnUpdateMediaPlay) 
	ON_COMMAND(ID_MEDIA_PREVFRAME, OnMediaPrevframe) 
	ON_UPDATE_COMMAND_UI(ID_MEDIA_PREVFRAME, OnUpdateMediaPrevframe) 
	ON_COMMAND(ID_MEDIA_STOP, OnMediaStop) 
	ON_UPDATE_COMMAND_UI(ID_MEDIA_STOP, OnUpdateMediaStop) 
	ON_COMMAND(ID_SHOW_THRESHOLDRESULT, OnShowThresholdresult) 
	ON_UPDATE_COMMAND_UI(ID_SHOW_THRESHOLDRESULT, OnUpdateShowThresholdresult) 
	ON_COMMAND(ID_SHOW_FEATURERESULT, OnShowFeatureresult) 
	ON_UPDATE_COMMAND_UI(ID_SHOW_FEATURERESULT, OnUpdateShowFeatureresult) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CGestureView construction/destruction 
 
CGestureView::CGestureView() 
{ 
	m_ShowState = Empty; 
	m_AviState = Stopped; 
	m_bPlayingLoop = false; 
} 
 
CGestureView::~CGestureView() 
{ 
} 
 
BOOL CGestureView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CGestureView drawing 
 
void CGestureView::OnDraw(CDC* pDC) 
{ 
	CGestureDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	if (pDoc->GetCBackground()->Gettestflag()){ 
		char temp[50]; 
		sprintf(temp,"从EM方法得到的mu是"); 
		pDC->TextOut(300,20,temp); 
		sprintf(temp,"               %f",pDoc->GetCBackground()->GetEMmu0()); 
		pDC->TextOut(300,50,temp); 
		sprintf(temp,"               %f",pDoc->GetCBackground()->GetEMmu1()); 
		pDC->TextOut(300,70,temp); 
		sprintf(temp,"               %f",pDoc->GetCBackground()->GetEMmu2()); 
		pDC->TextOut(300,90,temp); 
 
		/*sprintf(temp,"概率分布"); 
		pDC->TextOut(10,200,temp); 
		pDC->MoveTo(10,400); 
		for (int b=0;b<256;b++){ 
			pDC->LineTo(10+b,400-(pDoc->GetCBackground()->Getprobb(b))*100); 
		}*/ 
 
		CPen *pOldPen,cNewPen(PS_SOLID,1,0X02ff0000),cNewPen1(PS_SOLID,1,0x0200ff00),cNewPen2(PS_SOLID,1,0x020000ff); 
		sprintf(temp,"Gauss过程  运算后的密度  各象素值有多少点取"); 
		pDC->TextOut(300,200,temp); 
		pOldPen = pDC->SelectObject(&cNewPen); 
		pDC->MoveTo(200,400); 
		for (int a=0;a<256;a++){ 
			pDC->LineTo(200+a*2,400-(pDoc->GetCBackground()->Getgauss(a))*10000); 
		} 
		cNewPen.DeleteObject(); 
 
		pDC->SelectObject(&cNewPen1); 
		pDC->MoveTo(200,400); 
		for (int aa=0;aa<256;aa++){ 
			pDC->LineTo(200+aa*2,400-(pDoc->GetCBackground()->Getgauss2(aa))*10000); 
		} 
		cNewPen1.DeleteObject(); 
 
		pDC->SelectObject(&cNewPen2); 
		pDC->MoveTo(200,400); 
		for (int aaa=0;aaa<256;aaa++){ 
			pDC->LineTo(200+aaa*2,400-(pDoc->GetCBackground()->Getgeshu(aaa)/12000.0)*10000); 
		} 
		cNewPen2.DeleteObject(); 
		pDC->SelectObject(pOldPen); 
	} 
	if ( m_ShowState == Empty ) return; 
 
	CImage *image; 
	char AviInfo[50]; 
 
	if ( pDoc->GetCBackground()->GetBkgStatus() ) { 
		image = pDoc->GetCBackground()->GetBkgImage(); 
 		image->Show( pDC->m_hDC, m_BkgImageWin.left, m_BkgImageWin.top,  
                     image->Width(), image->Height(), 0 , 0 ); 
		pDC->TextOut(m_BkgImageWin.left, m_BkgImageWin.top-20, "Background Image"); 
	} 
 
	if (( pDoc->GetBkgAVI()->GetInitStatus() )&&(pDoc->Getshowflag())) { 
		image = pDoc->GetBkgAVI()->GetFramePointer(); 
		image->Show( pDC->m_hDC, m_BkgAviWin.left, m_BkgAviWin.top-22,  
                     image->Width(), image->Height(), 0 , 0 ); 
		sprintf(AviInfo, "Background Video Frame %d", pDoc->GetBkgAVI()->GetReaderPosition()+1); 
		pDC->TextOut(m_BkgAviWin.left, m_BkgAviWin.top-40, AviInfo); 
	} 
 
	if ( pDoc->GetHandAVI()->GetInitStatus() ) { 
		image = pDoc->GetHandAVI()->GetFramePointer(); 
		image->Show( pDC->m_hDC, m_HandAviWin.left, m_HandAviWin.top, 
                     image->Width(), image->Height(), 0 , 0 ); 
		sprintf(AviInfo, "Hand Video Frame %d", pDoc->GetHandAVI()->GetReaderPosition()+1); 
		pDC->TextOut(m_HandAviWin.left, m_HandAviWin.top-20, AviInfo); 
	} 
 
	if ( m_ShowState == ShowThreshImage ) { 
		image = pDoc->GetCGesture()->GetHnadBinImage(); 
		image->Show( pDC->m_hDC, m_ResultWin.left, m_ResultWin.top, 
                     image->Width(), image->Height(), 0 , 0 ); 
		sprintf(AviInfo, "Thresholoding Result Frame %d", pDoc->GetHandAVI()->GetReaderPosition()+1); 
		pDC->TextOut(m_ResultWin.left, m_ResultWin.top-20, AviInfo); 
	} 
 
	if ( m_ShowState == ShowFeatureImage ) { 
		image = pDoc->GetCGesture()->GetHnadBinImage(); 
		CImage FeatureImage; 
		FeatureImage.Create(image->Width(),image->Height(),8); 
		cvDrawContours(FeatureImage.GetImage(), pDoc->GetCGesture()->GetContours(), 255, 0, 0); 
		pDoc->GetCGesture()->DrawContourFeaturesToImage(FeatureImage.GetImage()); 
		pDoc->GetCGesture()->DrawStatisticFeaturesToImage(FeatureImage.GetImage()); 
		FeatureImage.Show( pDC->m_hDC, m_ResultWin.left, m_ResultWin.top, 
                           FeatureImage.Width(), FeatureImage.Height(), 0 , 0 ); 
		sprintf(AviInfo, "Feature Detection Result Frame %d", pDoc->GetHandAVI()->GetReaderPosition()+1); 
		pDC->TextOut(m_ResultWin.left, m_ResultWin.top-20, AviInfo); 
	} 
 
	if (pDoc->GetCBackground()->Getdisplayflag()){ 
		int h = GetDocument()->GetCBackground()->GetBkgAvi()->GetFramePointer()->Height(); 
		int w = GetDocument()->GetCBackground()->GetBkgAvi()->GetFramePointer()->Width(); 
 
		CImage *image1=pDoc->GetCBackground()->GetImageshow1(); 
		CImage *image2=pDoc->GetCBackground()->GetImageshow2(); 
		CImage *image3=pDoc->GetCBackground()->GetImageshow3(); 
		image1->Show(pDC->m_hDC,m_BkgImageWin.left,m_BkgAviWin.top-22,w,h,0,0);	 
		image2->Show(pDC->m_hDC,m_BkgAviWin.left,m_BkgImageWin.top+h-22,w,h,0,0); 
		image3->Show(pDC->m_hDC,m_BkgImageWin.left,m_BkgImageWin.top+h-22,w,h,0,0); 
		//pDoc->GetCBackground()->Setdisplayflag(); 
		//Invalidate(true); 
	} 
} 
 
void CGestureView::InitializeShowingWindows( CImage *image ) 
{ 
	const int offset_x = 20, offset_y = 40; 
	int w = image->Width(), h = image->Height(); 
 
	m_BkgAviWin.left   = offset_x; 
	m_BkgAviWin.top    = offset_y; 
	m_BkgAviWin.right  = m_BkgAviWin.left+w; 
	m_BkgAviWin.bottom = m_BkgAviWin.top+h; 
 
	m_HandAviWin.left   = offset_x; 
	m_HandAviWin.top    = m_BkgAviWin.bottom+offset_y; 
	m_HandAviWin.right  = m_HandAviWin.left+w; 
	m_HandAviWin.bottom = m_HandAviWin.top+h; 
 
	m_BkgImageWin.left   = m_BkgAviWin.right+offset_x; 
	m_BkgImageWin.top    = offset_y; 
	m_BkgImageWin.right  = m_BkgImageWin.left+w; 
	m_BkgImageWin.bottom = m_BkgImageWin.top+h; 
 
	m_ResultWin.left   = m_BkgAviWin.right+offset_x; 
	m_ResultWin.top    = m_BkgAviWin.bottom+offset_y; 
	m_ResultWin.right  = m_ResultWin.left+w; 
	m_ResultWin.bottom = m_ResultWin.top+h; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CGestureView diagnostics 
 
#ifdef _DEBUG 
void CGestureView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CGestureView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CGestureDoc* CGestureView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGestureDoc))); 
	return (CGestureDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CGestureView message handlers 
 
///////////////////////////////////////////////////////////////////////////// 
// Animation Control Functions 
 
 
void CGestureView::OnShowBkgvideo()  
{ 
	CGestureDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	CCamAvi *avi = pDoc->GetBkgAVI(); 
 
	if ( avi->GetInitStatus() ) { 
		pDoc->SetCurrAvi(avi); 
		m_ShowState = ShowBkgAvi; 
		avi->FirstFrame(); 
		avi->GetFrameFromAvi(); 
		SetAviStatus( Stopped ); 
		Invalidate(true); 
	} 
} 
 
void CGestureView::OnUpdateShowBkgvideo(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck( m_ShowState == ShowBkgAvi ); 
} 
 
void CGestureView::OnShowHandvideo()  
{ 
	CGestureDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	CCamAvi *avi = pDoc->GetHandAVI(); 
 
	if ( avi->GetInitStatus() ) { 
		pDoc->SetCurrAvi(avi); 
		m_ShowState = ShowHandAvi; 
		avi->FirstFrame(); 
		avi->GetFrameFromAvi(); 
		SetAviStatus( Stopped ); 
		Invalidate(true); 
	} 
} 
 
void CGestureView::OnUpdateShowHandvideo(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck( m_ShowState == ShowHandAvi ); 
} 
 
void CGestureView::OnShowThresholdresult()  
{ 
	CGestureDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	CCamAvi *avi = pDoc->GetHandAVI(); 
	CBackground *bkg = pDoc->GetCBackground(); 
 
	if ( avi->GetInitStatus() && bkg->GetBkgStatus() ) { 
		pDoc->SetCurrAvi(avi); 
		m_ShowState = ShowThreshImage; 
		Invalidate(true); 
	} 
} 
 
void CGestureView::OnUpdateShowThresholdresult(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck( m_ShowState == ShowThreshImage ); 
} 
 
void CGestureView::OnShowFeatureresult()  
{ 
	CGestureDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	CCamAvi *avi = pDoc->GetHandAVI(); 
	CBackground *bkg = pDoc->GetCBackground(); 
 
	if ( avi->GetInitStatus() && bkg->GetBkgStatus() ) { 
		pDoc->SetCurrAvi(avi); 
		m_ShowState = ShowFeatureImage; 
		Invalidate(true); 
	} 
} 
 
void CGestureView::OnUpdateShowFeatureresult(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck( m_ShowState == ShowFeatureImage ); 
} 
 
void CGestureView::OnMediaPlay()  
{ 
	CGestureDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	CCamAvi *avi = pDoc->GetCurrAVI(); 
	CHandGesture *gesture = pDoc->GetCGesture(); 
 
	m_AviState = Playing; 
 
	MSG msg; 
	while ( m_AviState==Playing ) { 
		avi->NextFrame(); 
 
		avi->GetFrameFromAvi(); 
 
		switch ( m_ShowState ) { 
		case ShowThreshImage : 
			gesture->ExtractHandRegion(avi->GetFramePointer()->GetImage()); 
			break; 
		case ShowFeatureImage : 
			gesture->ExtractHandRegion(avi->GetFramePointer()->GetImage()); 
			gesture->ExtractStatisticFeatures(); 
			gesture->ExtractContourFeatures(); 
			break; 
		case ShowCompositedImage : 
			break; 
		default : 
			break; 
		} 
 
		Invalidate(false); 
 
		Sleep(40); 
 
		while (::PeekMessage(&msg,0,0,0,PM_REMOVE)) 
		{ 
			if (msg.message == WM_QUIT)	SetMediaStop(); 
			// Dispatch any messages as needed 
			if (!AfxGetApp()->PreTranslateMessage(&msg)) { 
				::TranslateMessage(&msg); 
				::DispatchMessage(&msg); 
			} 
			// Give the Idle system some time 
			AfxGetApp()->OnIdle(0); 
			AfxGetApp()->OnIdle(1); 
		} 
		if ( !m_bPlayingLoop && avi->IsLastFrame() ) 
			SetMediaStop(); 
	} 
 
	if (msg.message == WM_QUIT)	::PostQuitMessage(0); 
} 
 
void CGestureView::OnUpdateMediaPlay(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable( CanPlay() ); 
} 
 
void CGestureView::OnMediaPause()  
{ 
	m_AviState = Paused; 
} 
 
void CGestureView::OnUpdateMediaPause(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable( CanPause() ); 
} 
 
void CGestureView::OnMediaStop()  
{ 
	CGestureDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	CCamAvi *avi = pDoc->GetCurrAVI(); 
 
	m_AviState = Stopped; 
 
	avi->SetReaderPosition(0); 
	avi->GetFrameFromAvi(); 
	Invalidate(true); 
} 
 
void CGestureView::OnUpdateMediaStop(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable( CanStop() ); 
} 
 
void CGestureView::OnMediaNextframe()  
{ 
	CGestureDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	CCamAvi *avi = pDoc->GetCurrAVI(); 
 
	avi->NextFrame(); 
	avi->GetFrameFromAvi(); 
	Invalidate(true); 
} 
 
void CGestureView::OnUpdateMediaNextframe(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable( CanPlay() ); 
} 
 
void CGestureView::OnMediaPrevframe()  
{ 
	CGestureDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	CCamAvi *avi = pDoc->GetCurrAVI(); 
 
	avi->PrevFrame(); 
	avi->GetFrameFromAvi(); 
	Invalidate(true); 
} 
 
void CGestureView::OnUpdateMediaPrevframe(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable( CanPlay() ); 
} 
 
void CGestureView::SetMediaPause()  
{ 
	if ( CanPause() ) m_AviState = Paused; 
} 
 
void CGestureView::SetMediaPlay()  
{ 
	if ( CanPlay() ) m_AviState = Playing; 
} 
 
void CGestureView::SetMediaStop()  
{ 
	if ( CanStop() ) m_AviState = Stopped; 
}