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