?? mainfrm.cpp
字號:
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "Video Demo.h"
#include "Video demodoc.h"
#include "MainFrm.h"
#include "AVIHandler.h" // AVI文件處理
#include "colortrans.h"
#include "StaticDetect.h"
#include "ChafenMul.h"
#include "POSDiag.h"
#include "MotionDetectDiag.h"
#include "GravityTrack.h"
#include "GravityCenter.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(ID_FILE_OPENVIDEO, OnFileOpenvideo)
ON_COMMAND(ID_MOTION_SD, OnMotionSd)
ON_COMMAND(ID_MOTION_DD, OnMotionDd)
ON_COMMAND(ID_TRACEK_MEANSHIFT, OnTracekMeanshift)
ON_COMMAND(ID_TRACEK_GAV, OnTracekGav)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
// | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
// !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
// {
// TRACE0("Failed to create toolbar\n");
// return -1; // fail to create
// }
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
//m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
// EnableDocking(CBRS_ALIGN_ANY);
// DockControlBar(&m_wndToolBar);
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return TRUE;
}
/************************************************************************/
/* OnOpenOpenVideo */
/* 打開AVI視頻文件 */
/* 基于中央數據級控架構 */
/************************************************************************/
void CMainFrame::OnOpenOpenVideo()
{
AVIHandler *avi = NULL;
//添加一路視頻
//考慮的問題是,如何將參數傳遞,到框架
CString strFilter("Data Files (*.avi)|*.avi");
CFileDialog diag(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,strFilter);
//打開第一個文件
int nID = diag.DoModal();
if(nID == IDOK){
// 新建一個子窗口
POSITION pos=theApp.m_pDocManager->GetFirstDocTemplatePosition();
// 取得一個文檔模板,我取的是第一個,你可以去任何一個模板
CDocTemplate* pDocTempl=theApp.m_pDocManager->GetNextDocTemplate(pos);
// 通過打開文件的方式獲得一個新窗口,并得到CDocument對象
CVideoDemoDoc * doc = (CVideoDemoDoc *)pDocTempl->OpenDocumentFile(NULL);//theApp.m_pDocManager->OpenDocumentFile(NULL);
// 建立視頻數據源
avi = new AVIHandler(diag.GetFileName()); // 打開AVI文件,AVI RGB
theApp.curVideo = new VideoData(); // 當前視頻數據源
theApp.curVideo->doc = doc;
theApp.curVideo->index = 0;
theApp.curVideo->ms = (MediaSource*)avi;
// 設置View的顯示緩沖
ImageData *id = new ImageData();
id->bytes = 3;
id->coreDoc = doc;
id->format = IMAGE_FORMAT_RGB24;
id->imgWidth = avi->GetFrameWidth();
id->imgHeight = avi->GetFrameHeight();
id->data = avi->GetSingleFrame(0); // 獲得第一幀圖像
doc->SetData(id); // 設置第一幀圖像
// 設置文檔和視圖的視頻源數據
doc->SetVideoSource(theApp.curVideo); // 設置Document數據
doc->RefreshView(); // 刷新顯示View
}
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
/************************************************************************/
/* 打開視頻文件AVI */
/************************************************************************/
void CMainFrame::OnFileOpenvideo()
{
AVIHandler *avi = NULL;
//添加一路視頻
//考慮的問題是,如何將參數傳遞,到框架
CString strFilter("Data Files (*.avi)|*.avi");
CFileDialog diag(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,strFilter);
//打開第一個文件
int nID = diag.DoModal();
if(nID == IDOK){
// 新建一個子窗口
POSITION pos=theApp.m_pDocManager->GetFirstDocTemplatePosition();
// 取得一個文檔模板,我取的是第一個,你可以去任何一個模板
CDocTemplate* pDocTempl=theApp.m_pDocManager->GetNextDocTemplate(pos);
// 通過打開文件的方式獲得一個新窗口,并得到CDocument對象
CVideoDemoDoc * doc = (CVideoDemoDoc *)pDocTempl->OpenDocumentFile(NULL);//theApp.m_pDocManager->OpenDocumentFile(NULL);
// 建立視頻數據源
avi = new AVIHandler(diag.GetFileName()); // 打開AVI文件,AVI RGB
if(!avi->isLoaded())
{
AfxMessageBox("打開文件錯誤!");
return;
}
if(avi->GetLPBM()->biBitCount != 24)
{
delete avi;
AfxMessageBox("AVI文件必須是24位非壓縮彩色視頻!");
return;
}
theApp.curVideo = new VideoData(); // 當前視頻數據源
theApp.curVideo->doc = doc;
theApp.curVideo->index = 0;
theApp.curVideo->ms = (MediaSource*)avi;
// 設置View的顯示緩沖
ImageData *id = new ImageData();
id->bytes = 3;
id->coreDoc = doc;
id->format = IMAGE_FORMAT_RGB24;
id->imgWidth = avi->GetFrameWidth();
id->imgHeight = avi->GetFrameHeight();
id->data = avi->GetSingleFrame(0); // 獲得第一幀圖像
doc->SetData(id); // 設置第一幀圖像
// 設置文檔和視圖的視頻源數據
doc->SetVideoSource(theApp.curVideo); // 設置Document數據
doc->RefreshView(); // 刷新顯示View
}
}
/************************************************************************/
/* 靜止背景目標檢測 */
/************************************************************************/
DWORD WINAPI StaticDetectT(LPVOID data){
CVideoDemoDoc *doc = (CVideoDemoDoc*)data;
int frameLength = theApp.curVideo->ms->GetFrameCount();
MediaSource *avi = theApp.curVideo->ms;
unsigned char *frame = avi->GetSingleFrame(0);
int frameWidth = avi->GetFrameWidth();
int frameHeight = avi->GetFrameHeight();
// 色彩變換
ColorTrans ct;
CStatsticDetect sd(frameWidth,frameHeight);
// 輸出緩沖
unsigned char * outBuffer = new unsigned char[frameHeight * frameWidth * 3];
for(int i = 0; i < frameLength - 1; i++)
{
// 獲得一幀圖像
frame = avi->GetSingleFrame(i);
// 轉換到灰度圖像
//ct.RGB2Gray8(frame,grayBuffer,frameWidth,frameHeight);
sd.ReceiveFrame(i,frame,D_STATISTIC);
// 添加一幀數據
ct.gray2RGB2(sd.m_pDiffImage,outBuffer,frameWidth,frameHeight);
doc->id->data = outBuffer;
doc->RefreshView();
}
delete[] outBuffer;
return 0;
}
/************************************************************************/
/* 靜止背景目標檢測 */
/************************************************************************/
void CMainFrame::OnMotionSd()
{
DWORD exitCode;
if(GetExitCodeThread(th,&exitCode)){
TerminateThread(th,exitCode);
}
DWORD pID;
//控制線程播放
int frameLength = theApp.curVideo->ms->GetFrameCount();
MediaSource *avi = theApp.curVideo->ms;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -