www.pudn.com > VC_视频捕捉与帧处理.rar > CaptureTestDoc.cpp


// CaptureTestDoc.cpp : implementation of the CCaptureTestDoc class 
// 支持USB摄像头、带有准实时视频处理功能 
// bugzhao 2006 Jan 13th 
// E-MAIL: bugzhao@sdu.edu.cn 
 
#include "stdafx.h" 
#include "CaptureTest.h" 
 
#include "CaptureTestDoc.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
//forward definition for motion detector 
LONG	summ_rect_arena32(LPBYTE data, int dx, int dy, int ptX, int ptY, int rx, int ry); 
LONG	summ_rect_arena24(LPBYTE data, int dx, int dy, int ptX, int ptY, int rx, int ry); 
 
///////////////////////////////////////////////////////////////////////////// 
// CCaptureTestDoc 
 
IMPLEMENT_DYNCREATE(CCaptureTestDoc, CDocument) 
 
BEGIN_MESSAGE_MAP(CCaptureTestDoc, CDocument) 
	//{{AFX_MSG_MAP(CCaptureTestDoc) 
	ON_COMMAND(ID_CAPTURE_RTP_EDGE, OnCaptureRtpEdge) 
	ON_COMMAND(ID_CAPTURE_RTP_ORIGINAL, OnCaptureRtpOriginal) 
	ON_COMMAND(ID_CAPTURE_RTP_PAUSE, OnCaptureRtpPause) 
	ON_UPDATE_COMMAND_UI(ID_CAPTURE_RTP_ORIGINAL, OnUpdateCaptureRtpOriginal) 
	ON_UPDATE_COMMAND_UI(ID_CAPTURE_RTP_PAUSE, OnUpdateCaptureRtpPause) 
	ON_UPDATE_COMMAND_UI(ID_CAPTURE_RTP_EDGE, OnUpdateCaptureRtpEdge) 
	ON_COMMAND(ID_CAPTURE_RTP_MOTIONDETECT, OnCaptureRtpMotiondetect) 
	ON_UPDATE_COMMAND_UI(ID_CAPTURE_RTP_MOTIONDETECT, OnUpdateCaptureRtpMotiondetect) 
	ON_COMMAND(ID_EDIT_COPY, OnEditCopy) 
	ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy) 
	ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs) 
	ON_UPDATE_COMMAND_UI(ID_FILE_SAVE_AS, OnUpdateFileSaveAs) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CCaptureTestDoc construction/destruction 
 
LONG	summ_rect_arena32(LPBYTE data, int dx, int dy, int ptX, int ptY, int rx, int ry) 
{ 
	LONG summ = 0; 
	int lineBytes = dx*4; 
 
	data+= (lineBytes*ptY + ptX*4);//offset 
 
	for(int y = 0; y>8)&0xff - (ptr[x1y1]>>8)&0xff); 
						LONG b_diag1 = 	abs((ptr[x]>>16)&0xff -(ptr[x1y1]>>16)&0xff); 
 
						LONG r_diag2 = 	abs(ptr[x1y0]&0xff -ptr[x0y1]&0xff); 
						LONG g_diag2 = 	abs((ptr[x1y0]>>8)&0xff -(ptr[x0y1]>>8)&0xff); 
						LONG b_diag2 = 	abs((ptr[x1y0]>>16)&0xff -(ptr[x0y1]>>16)&0xff); 
						 
						tmpLine[x] = ((r_diag1+r_diag2)>>1) | 
									 (((g_diag1+g_diag2)>>1)<<8) | 
									 (((b_diag1+b_diag2)>>1)<<16); 
 
 
					} 
					memcpy(ptr,tmpLine, (arena_dx-1)*sizeof(DWORD)); 
					ptr+=arena_dx; 
				} 
				 
				delete tmpLine; 
			} 
			break; 
		case 24: 
			{ 
				BYTE * ptr =(BYTE *)IMAGEDATA(lpBi); 
				BYTE * tmpLine = new BYTE[arena_dx*3]; 
 
				for(int y=0; y< arena_dy-1;y++) 
				{ 
 
					for(int x=0; x>1; 
						tmpLine[x0y0+1]= (BYTE)(g_diag1+g_diag2)>>1; 
						tmpLine[x0y0+2]= (BYTE)(b_diag1+b_diag2)>>1; 
 
 
					} 
					memcpy(ptr,tmpLine, (arena_dx-1)*3); 
					ptr+=arena_dx*3; 
				} 
				 
				delete tmpLine; 
			} 
		default: break; 
		} 
	return TRUE; 
} 
 
BOOL CCaptureTestDoc::RunDetector(LPBITMAPINFO lpBi) 
{ 
	//constants definitions for motion detector 
#define	ZONESX	4 
#define	ZONESY	4 
#define	ZONES	ZONESX*ZONESY 
#define	DETECTION_LEVEL 0.05f 
 
	static LONG lastIntensity[ZONES]; 
	static BOOL init = TRUE; 
 
	LONG newIntensity[ZONES]; 
 
	int rx = IMAGEWIDTH(lpBi)/ZONESX; 
	int ry = IMAGEHEIGHT(lpBi)/ZONESY; 
 
	for(int y = 0; yDETECTION_LEVEL) 
				{ret=TRUE; break;} 
		} 
 
	 
	} 
	memcpy(lastIntensity,newIntensity, ZONES*sizeof(LONG)); 
	init = FALSE; 
	return ret; 
} 
 
void CCaptureTestDoc::OnCaptureRtpEdge()  
{ 
	m_ProcessorMode=PROCESSOR_RTP_EDGEDETECT;	 
} 
 
void CCaptureTestDoc::OnCaptureRtpOriginal()  
{ 
	m_ProcessorMode=PROCESSOR_ORIGINAL_PLAY; 
} 
 
void CCaptureTestDoc::OnCaptureRtpPause()  
{ 
	m_ProcessorMode=PROCESSOR_ORIGINAL_PAUSE; 
} 
 
void CCaptureTestDoc::OnUpdateCaptureRtpOriginal(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(m_ProcessorMode==PROCESSOR_ORIGINAL_PLAY);	 
} 
 
void CCaptureTestDoc::OnUpdateCaptureRtpPause(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(m_ProcessorMode==PROCESSOR_ORIGINAL_PAUSE); 
} 
 
void CCaptureTestDoc::OnUpdateCaptureRtpEdge(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(m_ProcessorMode==PROCESSOR_RTP_EDGEDETECT);	 
} 
 
void CCaptureTestDoc::OnCaptureRtpMotiondetect()  
{ 
	m_ProcessorMode=PROCESSOR_RTP_MOTIONDETECT; 
} 
 
void CCaptureTestDoc::OnUpdateCaptureRtpMotiondetect(CCmdUI* pCmdUI)  
{ 
	pCmdUI->SetCheck(m_ProcessorMode==PROCESSOR_RTP_MOTIONDETECT); 
} 
 
void CCaptureTestDoc::OnEditCopy()  
{ 
	if(m_ImageBitmap.GetSafeHandle() && AfxGetMainWnd()->OpenClipboard()) 
	{ 
		EmptyClipboard(); 
		SetClipboardData(CF_DIB, m_ImageBitmap.DibFromBitmap()); 
		CloseClipboard(); 
	}	 
} 
 
void CCaptureTestDoc::OnUpdateEditCopy(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable((BOOL)m_ImageBitmap.GetSafeHandle());	 
} 
 
void CCaptureTestDoc::OnFileSaveAs()  
{ 
	UINT oldp=m_ProcessorMode; 
 
	m_ProcessorMode=PROCESSOR_ORIGINAL_PAUSE; 
 
	CDC *pDC=m_ImageBitmap.BegingModify();	 
	pDC->SetTextColor(196); 
	pDC->SetBkMode(TRANSPARENT); 
	CSize sz=m_ImageBitmap.GetSize(); 
	char str[32]; 
	char str2[32]; 
	CString title; 
	 
	title.Format("REC %s %s", _strtime(str),_strdate(str2));; 
	pDC->TextOut(16,sz.cy-16, title); 
	m_ImageBitmap.EndModify(); 
 
	m_ImageBitmap.Save(NULL); 
	m_ProcessorMode=oldp; 
} 
 
void CCaptureTestDoc::OnUpdateFileSaveAs(CCmdUI* pCmdUI)  
{ 
	pCmdUI->Enable((BOOL)m_ImageBitmap.GetSafeHandle()); 
}