📄 main.c
字号:
MessageBox(0, "Cannot create window", szAppName, MB_OK);
return FALSE;
}
DrawButtons2(hwndCtl2, 0, TRUE);
//whether to display this window
if (gDebugWinFlag==TRUE)
ShowWindow(hwndCtl2,sw);
else
ShowWindow(hwndCtl2,SW_HIDE);
SetTimer(hwndCtl, TEST_TIMER, 1000, NULL); /* 2-second timer */
//initial display
ImageMaxX = iio_ImageMaxX();
ImageMaxY = iio_ImageMaxY();
gcImgCurrent = iio_GetInputImage();
giFrameInitial = iio_GetFrameNo();
//set window dimension and related parameters
AppSetDisplay();
//mean shift track image with half size
gcImgCurrentHalf = cvCreateImage(cvSize(ImageMaxX/2, ImageMaxY/2), 8, 3);
//mask image
gImgInitMaskHalf = cvCreateImage(cvSize(ImageMaxX/2, ImageMaxY/2), 8, 1);
gImgInitMask = cvCreateImage(cvSize(ImageMaxX, ImageMaxY), 8, 1);
//bitmap image
gImgBitMap = cvCreateImage(cvSize(ImageMaxX, ImageMaxY), 8, 1);
//get half image for processing
if (gcImgCurrent!=NULL){
cvResize(gcImgCurrent, gcImgCurrentHalf, CV_INTER_LINEAR);
}
gBatchFlag = FALSE;
switch(rstOpenFile) {
case 0:
//do nothing if error in open file
break;
case 2:
//initialize .trk file
giSeqType = 1; //trk
gbReplayFlag = TRUE;
giClickCount=4;
img_ProcessLClick_Poly();
dis_ShowImgCurrent();
if (DEBUG==1){
gbReplayFlag = FALSE;
}
//Functions[8].style = BS_PUSHBUTTON|WS_DISABLED; //disable log
Functions[9].style = BS_PUSHBUTTON; //enable playRpt
DrawButtons(hwndCtl, 0, TRUE);
break;
case 3:
//batch tracking
gBatchFlag = TRUE;
//based on .trk
giSeqType = 1;
//init batch parameters
Batch_Init();
break;
default:
//initialize image frame
giSeqType = 0;
//Functions[8].style = BS_PUSHBUTTON; //enable log
Functions[9].style = BS_PUSHBUTTON|WS_DISABLED; //disalbe playRpt
DrawButtons(hwndCtl, 0, TRUE);
dis_ShowImgCurrent();
}
return TRUE;
}
/*****************************************************************************
* Name: AppExit *
*****************************************************************************/
void AppExit(void)
{
//release display buffer
ReleaseBuffer();
if(hpalette)
DeleteObject(hpalette);
//release imageio buffer
iio_Exit();
//release cv images
cvReleaseImage(&gcImgCurrentHalf);
cvReleaseImage(&gImgBitMap);
cvReleaseImage(&gImgInitMaskHalf);
cvReleaseImage(&gImgInitMask);
//release tracker memory
switch(gTrackerIndex) {
case 1:
//tracker 1: HistogramShift - Enhanced meanshift by Foreground/Bkground
his_TrackCleanUp();
case 2:
//initial Meanshift Tracker
msw_TrackCleanUp();
break;
case 3:
//template matching Tracker with Correlation
temp_TrackCleanUp();
break;
case 4:
case 5:
case 6:
case 7:
//template matching Tracker with Correlation
feat_TrackCleanUp();
break;
case 8:
graph_TrackCleanUp();
break;
case 9:
particle_TrackCleanUp();
break;
}
}
/*****************************************************************************
* Name: AppIdle *
*****************************************************************************/
BOOL AppIdle(void)
{
// HDC hdc;
// HDC hdc2;
int waitFlag;
// if this app is and icon, return TRUE and wait for a message
if (IsIconic(hwndCtl))
return TRUE;
// if the user is leaning on the right mouse button let him have priority
if (GetKeyState(VK_RBUTTON) >= 0)
{
//wait
//for (int i=1;i<100;i++){
//wait();
//}
//get image
waitFlag = GetImage();
//print title
return waitFlag;
}
else
{
return TRUE; // background app; nothing to do.
}
}
/*****************************************************************************
* Name: AppPaint *
*****************************************************************************/
void AppPaint(HWND hwnd, HDC hdc)
{
if (hpalette&&(PIXEL_TYPE==PBITS_Y8))
{
SelectPalette(hdc, hpalette, TRUE);
RealizePalette(hdc);
}
SetDIBitsToDevice(
hdc,
0, ViewOffset, ImageMaxX, ImageMaxY,
0, 0, 0, ImageMaxY,
gpBits, (LPBITMAPINFO)&maphead, DIB_RGB_COLORS);
if (gbClickInitFlag==FALSE) return;
//draw rect
if (gbTrackMood==TRUE){
//draw obj box
dis_DrawRect(hwndCtl, gRectCurrent);
//display past tracked position
if (DEBUG==1 || (gPosCount>2 && gbAutoPredictFlag==TRUE))
{
dis_DrawTraceLine(hwndCtl, gPosPredict, gPosCount, PS_DASH, 2, RGB(255,0,0));
}
}
else{
dis_DrawRegion(hwnd, gRegionDisplay);
}
}
/*****************************************************************************
* Name: AppPaint2 *
*****************************************************************************/
void AppPaint2(HWND hwnd, HDC hdc)
{
if (hpalette&&(PIXEL_TYPE==PBITS_Y8))
//if (hpalette)
{
SelectPalette(hdc, hpalette, TRUE);
RealizePalette(hdc);
}
SetDIBitsToDevice(
hdc,
0, ViewOffset, ImageMaxX, ImageMaxY,
0, 0, 0, ImageMaxY,
gpBits2, (LPBITMAPINFO)&maphead, DIB_RGB_COLORS);
if (gTrackerIndex != 9) {//don't draw rect for particle filter
//draw rect
if (gbTrackMood==TRUE){
//draw obj box
dis_DrawRect(hwnd, gRectCurrentHalf);
}
else{
if (gbReplayFlag==FALSE)
dis_DrawRegion(hwnd, gRegionDisplayHalf);
}
}
//draw klt bg lines
if (gbKltFlag==TRUE && gDebugWinFlag == TRUE && gbClickInitFlag==TRUE && gbTrackMood==TRUE)
dis_DrawKltBgLines();
}
/*****************************************************************************
* Name: CtlProc *
* Description: Main window procedure. *
*****************************************************************************/
LONG WINAPI CtlProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//MINMAXINFO *lpmmi;
HDC hdc;
PAINTSTRUCT ps;
int rstOpenFile;
int clickX, clickY;
switch (message)
{
case WM_CREATE:
GetGlobals(hwnd, lParam);
SetWindowPos(hwnd, NULL, 0, 0, WindowX, WindowY, SWP_NOMOVE | SWP_SHOWWINDOW | SWP_DRAWFRAME);
return 0L;
case WM_SIZE:
//size two windows together
return 0L;
case WM_PAINT:
hdc = BeginPaint(hwnd,&ps);
if (hwnd==hwndCtl)
AppPaint(hwnd,hdc);
else if (hwnd==hwndCtl2)
AppPaint2(hwnd,hdc);
EndPaint(hwnd,&ps);
return 0L;
case WM_TIMER:
//if(fAcquire)
{
if(bTime == 0.0)
{
bTime = timeGetTime();
FrameCount = 0;
//ErrorCount = 0;
return 0L;
}
eTime = timeGetTime();
dTime = eTime - bTime;
iTime = dTime / CLOCKS_PER_SEC;
if(iTime > 0)
FPS = (int)fn_Round((double)FrameCount/iTime);
dis_PrintMessage();
bTime = timeGetTime();
FrameCount = 0;
}
return 0L;
case WM_LBUTTONDOWN:
if (hwnd == hwndCtl2) return 0L; //no response in debug window
clickX = LOWORD(lParam);
clickY = HIWORD(lParam);
if (clickX>=ImageMaxX || clickY<ButtonHeight || clickY>=ImageMaxY+ButtonHeight) return 0L; //x,y out of bound
//get the click point coordinate
gaClickPoint[giClickCount].x = LOWORD(lParam);
gaClickPoint[giClickCount].y = ImageMaxY-1+ButtonHeight-HIWORD(lParam); // flip the click point for bmp processing
giClickCount++;
gbClickInitFlag=FALSE;
gbTrackMood=FALSE;
if (giClickCount<4) return 0L;
//realease .trk mask and re-init
iio_RealeaseMaskImage();
img_ProcessLClick_Poly();
return 0L;
case WM_RBUTTONDOWN:
return 0L;
case WM_MOUSEMOVE:
if (hwnd!=hwndCtl || giClickCount==0 || giClickCount>3)
return 0L;
clickX = LOWORD(lParam);
clickY = HIWORD(lParam);
if (clickX>=ImageMaxX || clickY<ButtonHeight || clickY>=ImageMaxY+ButtonHeight) return 0L; //x,y out of bound
img_ProcessMouseMove(LOWORD(lParam), HIWORD(lParam));
return 0L;
case WM_COMMAND:
switch(wParam)
{
default:
//DrawButtons(hwndCtl, 0, TRUE);
break;
case ID_READ:
//no response in batch mood
if (gBatchFlag==TRUE) return 0;
giPlayFlag = 0;
//open image file by prompt dialog
rstOpenFile = iio_OpenFileByPrompt();
if (rstOpenFile==0){ //canceled
return 0;
}
if (rstOpenFile==3){
//batch tracking
gBatchFlag = TRUE;
Batch_Init();
return 0;
}
//if no new frame, return
if (gcImgCurrent==iio_GetInputImage() || iio_GetInputImage()==NULL){
return 0L;
}
gbClickInitFlag=FALSE;
gbTrackMood=FALSE;
//update image
gcImgCurrent = iio_GetInputImage();
ImageMaxX = iio_ImageMaxX();
ImageMaxY = iio_ImageMaxY();
giFrameInitial = iio_GetFrameNo();
//HalfSize track image
cvReleaseImage(&gcImgCurrentHalf);
gcImgCurrentHalf = cvCreateImage(cvSize(ImageMaxX/2, ImageMaxY/2), 8, 3);
if (gcImgCurrent!=NULL){
cvResize(gcImgCurrent, gcImgCurrentHalf, CV_INTER_LINEAR);
}
//mask image
cvReleaseImage(&gImgInitMaskHalf);
cvReleaseImage(&gImgInitMask);
gImgInitMaskHalf = cvCreateImage(cvSize(ImageMaxX/2, ImageMaxY/2), 8, 1);
gImgInitMask = cvCreateImage(cvSize(ImageMaxX, ImageMaxY), 8, 1);
//bitmap image
cvReleaseImage(&gImgBitMap);
gImgBitMap = cvCreateImage(cvSize(ImageMaxX, ImageMaxY), 8, 1);
//resize display window
AppSetDisplay();
//display current image
dis_ShowImgCurrent();
//reset predict
gbPredictFlag = FALSE;
gPosCount = 0;
//initilize track for different file type
switch(rstOpenFile) {
case 1:
//initialize image frame file
giSeqType =0;
gbReplayFlag = FALSE;
//Functions[8].style = BS_PUSHBUTTON; //enable Log
Functions[9].style = BS_PUSHBUTTON|WS_DISABLED; //disalbe playRpt
break;
case 2:
//create click region if opened a track file
giSeqType = 1; //trk
gbReplayFlag = TRUE;
if (DEBUG==1) gbReplayFlag = FALSE;
giClickCount=4;
img_ProcessLClick_Poly();
//Functions[8].style = BS_PUSHBUTTON|WS_DISABLED; //disable log
Functions[9].style = BS_PUSHBUTTON; //enable playRpt
break;
case 3:
//batch tracking
gBatchFlag = TRUE;
//based on .trk
giSeqType = 1;
Batch_Init();
break;
}
DrawButtons(hwndCtl, 0, TRUE);
return 0L;
case ID_ALGORITHM:
//no response in batch mood
if (gBatchFlag==TRUE) return 0;
giPlayFlag = 0;
//prompt option dlg and select tracker
dlg_Option();
//if selected tracker is differenct from current tracker, rewind video and re-initialize with selected tracker
if (gTrackerSelect!=gTrackerIndex || (gTrackerSelect==1 && gbBinChange==TRUE)){
//release tracker memory
switch(gTrackerIndex) {
case 1:
//tracker 1: HistogramShift - Enhanced meanshift by Foreground/Bkground
his_TrackCleanUp();
case 2:
//initial Meanshift Tracker
msw_TrackCleanUp();
break;
case 3:
//template matching Tracker with Correlation
temp_TrackCleanUp();
break;
case 4:
case 5:
case 6:
case 7:
feat_TrackCleanUp();
break;
case 8:
graph_TrackCleanUp();
break;
case 9:
particle_TrackCleanUp();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -