⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 headtrackerdlg.cpp

📁 人头跟踪算法
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		{			if (headtrackerDlg->m_input_mode == LIVE_VIDEO)  {//				left = 0; top = 0;				if (Digitizer_FillBuffer(0,&Image,&timestamp)) {					Image.Display(my_hdc,LEFT_MARGIN,TOP_MARGIN);				}				if (headtrackerDlg->m_tracking)  {					TrackAndDisplay();				}				if (recording_sequence)  {					int filenum_rel = headtrackerDlg->m_filenum - headtrackerDlg->m_first_filenum;					int *ptres = ellipse_states+filenum_rel*3;					memcpy(recorded_images+(filenum_rel)*BYTES_PER_PIXEL_IN_SEQUENCE*ISIZEX*ISIZEY,						Image.GetImagePtr(), BYTES_PER_PIXEL_IN_SEQUENCE*ISIZEX*ISIZEY);//						sprintf(msg, "fn %3d state %3d %3d %3d       ", filenum_rel, curr_state.x, curr_state.y, curr_state.sz);//						my_cdc->TextOut(5,220,msg);					*ptres++ = curr_state.x;					*ptres++ = curr_state.y;					*ptres++ = curr_state.sz;					sprintf(msg, "%4d", headtrackerDlg->m_filenum);					headtrackerDlg->GetDlgItem(IDC_FRAME_NUMBER)->SetWindowText(msg);					headtrackerDlg->m_filenum++;//					sprintf(msg, "m_filenum %d < %d relative %d            ", m_filenum, headtrackerDlg->m_last_filenum,//						m_filenum-headtrackerDlg->m_first_filenum);//					my_cdc->TextOut(5,220,msg);					if (headtrackerDlg->m_filenum > headtrackerDlg->m_last_filenum) {//							Digitizer_Shutdown(0);						int i, i_rel;						recording_sequence = FALSE;//						sprintf(msg, "                           ", m_filenum, headtrackerDlg->m_last_filenum);//						my_cdc->TextOut(5,220,msg);						sprintf(fname, fname_ellipse_states);						FILE *fp = fopen(fname, "w");						if (fp==NULL) {							sprintf(msg, "Couldn't open file '%s' for writing!!", fname);							AfxMessageBox(msg, MB_OK|MB_ICONSTOP, 0);							Digitizer_Shutdown(0);						}						fprintf(fp, "frame x   y sz\n");						for (i=headtrackerDlg->m_first_filenum ; i<=headtrackerDlg->m_last_filenum ; i++) {							i_rel = i - headtrackerDlg->m_first_filenum;							sprintf(fname, headtrackerDlg->m_basename, i_rel);							if (BYTES_PER_PIXEL_IN_SEQUENCE==1) {								memcpy(img_tmp8.GetImagePtr(), 									recorded_images+i_rel*BYTES_PER_PIXEL_IN_SEQUENCE*ISIZEX*ISIZEY, BYTES_PER_PIXEL_IN_SEQUENCE*ISIZEX*ISIZEY);								img_tmp8.Write8BitBMP(fname);							} else if (BYTES_PER_PIXEL_IN_SEQUENCE==3) {								memcpy(img_tmp24.GetImagePtr(), 									recorded_images+i_rel*BYTES_PER_PIXEL_IN_SEQUENCE*ISIZEX*ISIZEY, BYTES_PER_PIXEL_IN_SEQUENCE*ISIZEX*ISIZEY);								img_tmp24.Write24BitBMP(fname);							}							fprintf(fp, "%3d %3d %3d %2d\n", i, 								*(ellipse_states+3*i_rel), *(ellipse_states+3*i_rel+1), *(ellipse_states+3*i_rel+2));						}						fclose(fp);//						fp=fopen("tmp.dat", "wb");//						sprintf(msg, "file %d   ", fp);//						my_cdc->TextOut(5,220,msg);//						fwrite(ellipse_states, sizeof(int), 51, fp);//						fclose(fp);						free(recorded_images);						free(ellipse_states);						headtrackerDlg->m_use_camera = FALSE;						StopCamera();						((CButton *) headtrackerDlg->GetDlgItem(IDC_CAMERA_OFF))->SetCheck(1);						((CComboBox *) headtrackerDlg->GetDlgItem(IDC_INPUT_MODE))->SetCurSel(IMAGE_SEQUENCE);						headtrackerDlg->m_input_mode = IMAGE_SEQUENCE;						headtrackerDlg->EnableDisableWindows();						img_blankdot.Display(my_hdc,RECORDING_DOT_X, RECORDING_DOT_Y);					}				}			}		}		else 			;//?	}		return 0;}void StartVideoThread(void){	static DWORD threadIdentifier;	VideoThread = CreateThread( NULL,	// use default security		 						0,		// use default stack size						  		(LPTHREAD_START_ROUTINE) &VideoLoop,						  		0,		// thread parameter value						  		CREATE_SUSPENDED,						  		&threadIdentifier );	SetThreadPriority ( VideoThread, 						THREAD_PRIORITY_TIME_CRITICAL );			ResumeThread ( VideoThread );}/////////////////////////////////////////////////////////////////////////////// CHeadtrackerDlg message handlersBOOL CHeadtrackerDlg::OnInitDialog(){	m_input_mode = LIVE_VIDEO;//	m_input_mode = IMAGE_SEQUENCE;	m_use_camera = FALSE;//	m_basename = "../../seq1/img%03d.bmp";	m_basename = "../../seq_stans_head/img%03d.bmp";//	m_basename = "../../seq_ptz_complex2/img%03d.bmp";//	m_basename = "../../seq_head1/img%03d.bmp";//	m_basename = "../../seq_untex/untex_%04d.bmp";//	m_basename = "../../seq_untexb_largehead/untexb_%04d.bmp";	m_first_filenum = 0;	m_last_filenum = 500;	m_filenum = m_first_filenum;	m_enable_recording = FALSE;	m_tracking = FALSE;//	m_tracking = TRUE;	use_gradient = TRUE;	use_color = TRUE;	zoom_control = FALSE;	adapt_histogram = FALSE;	sum_gradient_magnitude = FALSE;	show_details = FALSE;	m_input_file_bw_instead_of_color = FALSE;	display_speed = display_speeds[INITIAL_DISPLAY_SPEED];	ReadModel(filename_model);	CDialog::OnInitDialog();	{		CScrollBar *pSB = (CScrollBar *) GetDlgItem(IDC_SCROLLBAR_SPEED);		pSB->SetScrollRange(0, N_DISPLAY_SPEEDS-1);		pSB->SetScrollPos(INITIAL_DISPLAY_SPEED, TRUE);	}	((CButton *) GetDlgItem(IDC_USE_GRADIENT))->SetCheck(use_gradient);	((CButton *) GetDlgItem(IDC_USE_COLOR))->SetCheck(use_color);	((CButton *) GetDlgItem(IDC_ZOOM))->SetCheck(zoom_control);	((CButton *) GetDlgItem(IDC_ADAPT_HISTOGRAM))->SetCheck(adapt_histogram);	((CButton *) GetDlgItem(IDC_GRADIENT_MAG))->SetCheck(sum_gradient_magnitude);	((CButton *) GetDlgItem(IDC_GRADIENT_DOT))->SetCheck(1-sum_gradient_magnitude);	((CButton *) GetDlgItem(IDC_SHOW_DETAILS))->SetCheck(show_details);	my_cdc = GetDC();	my_hdc = GetDC()->m_hDC;	EnableDisableWindows();	headtrackerDlg = (CHeadtrackerDlg *) (AfxGetApp()->m_pMainWnd);	TRACE("here %d\n", headtrackerDlg);	///// ->	// Add "About..." menu item to system menu.	// IDM_ABOUTBOX must be in the system command range.	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);	ASSERT(IDM_ABOUTBOX < 0xF000);	CMenu* pSysMenu = GetSystemMenu(FALSE);	CString strAboutMenu;	strAboutMenu.LoadString(IDS_ABOUTBOX);	if (!strAboutMenu.IsEmpty())	{		pSysMenu->AppendMenu(MF_SEPARATOR);		pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);	}	// Set the icon for this dialog.  The framework does this automatically	//  when the application's main window is not a dialog	SetIcon(m_hIcon, TRUE);			// Set big icon	SetIcon(m_hIcon, FALSE);		// Set small icon	///// <-	//	CMyCheckListBox mychecklist;	// To change from SVIDEO to NTSC, manually edit the file C:\PROGRAM FILES\WINNOV VIDEUM\VIDEUM.INI: Change 2001 to 4001 for FmtFlagsLo	// dparams.NTSC = TRUE;			// Note this is ignored in VFWs case	// dparams.SVIDEO = 0;			// Note this is ignored in VFWs case		dparams.HALFRES = TRUE;	dparams.sizex = ISIZEX;	dparams.sizey = ISIZEY;	dparams.EveryNthFrame = 1;	dparams.TotalSize = ISIZEX*ISIZEY;	dparams.ImageFormatDesired = APTOS_BGR24PACKED;// YUV_24;	dparams.CaptureFormatDesired = APTOS_BGR24PACKED;	dparams.app_win = this->m_hWnd;	dparams.Device_Number = DIG_WINNOV; // 0 -> Buster, 1 - > Winnov	imageready=CreateEvent(NULL,FALSE,FALSE,NULL);	dparams.event = imageready;	if (!OpenCamera(2)) {		AfxMessageBox("Failed to Open Camera", MB_OK|MB_ICONSTOP, 0);	}	InitTracker(&curr_state);	if (Digitizer_Init(0,dparams) == TRUE) {		StartVideoThread();	} else		AfxMessageBox("Failed to Connect To Digitizer",MB_OK|MB_ICONSTOP,0);	blankimg = DIALOG_BACKGROUND_COLOR;	img_reddot.Set(0,0,255);	img_blankdot = DIALOG_BACKGROUND_COLOR;	if (SetTimer(TIMER_ID, 1000/display_speeds[INITIAL_DISPLAY_SPEED], NULL) == 0)		AfxMessageBox("Failed to Set Timer",MB_OK|MB_ICONSTOP,0);	my_cdc->SetBkColor(0x00C0C0C0);	PrintEditNumber4D(IDC_FRAME_NUMBER, m_filenum);	return TRUE;  // return TRUE  unless you set the focus to a control}// Without the OnOK function, pressing the RETURN key inside an edit box// causes the dialog to exit.void CHeadtrackerDlg::OnOK() {	int edit_box_id = GetFocus()->GetDlgCtrlID();	UpdateData(TRUE);	switch (edit_box_id) {	case IDC_FRAME_NUMBER: 		if (m_filenum < m_first_filenum || m_filenum > m_last_filenum) m_filenum = m_first_filenum;		PrintEditNumber4D(IDC_FRAME_NUMBER, m_filenum);		break;	case IDC_BASENAME:		PrintEditString(IDC_BASENAME, (char *) ((LPCTSTR) m_basename));		break;	case IDC_FIRST:		PrintEditNumber4D(IDC_FIRST, m_first_filenum);		if (m_filenum < m_first_filenum) m_filenum = m_first_filenum;		break;	case IDC_LAST:		PrintEditNumber4D(IDC_LAST, m_last_filenum);		if (m_filenum > m_last_filenum) m_filenum = m_last_filenum;		break;	default:		break;	}}void CHeadtrackerDlg::OnSysCommand(UINT nID, LPARAM lParam){	if ((nID & 0xFFF0) == IDM_ABOUTBOX)	{		CAboutDlg dlgAbout;		dlgAbout.DoModal();	}	else	{		CDialog::OnSysCommand(nID, lParam);	}}// If you add a minimize button to your dialog, you will need the code below//  to draw the icon.  For MFC applications using the document/view model,//  this is automatically done for you by the framework.void CHeadtrackerDlg::OnPaint() {	if (IsIconic())	{		CPaintDC dc(this); // device context for painting		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);		// Center icon in client rectangle		int cxIcon = GetSystemMetrics(SM_CXICON);		int cyIcon = GetSystemMetrics(SM_CYICON);		CRect rect;		GetClientRect(&rect);		int x = (rect.Width() - cxIcon + 1) / 2;		int y = (rect.Height() - cyIcon + 1) / 2;		// Draw the icon		dc.DrawIcon(x, y, m_hIcon);	}	else	{		CDialog::OnPaint();		if (m_input_mode == IMAGE_SEQUENCE) PrintDisplaySpeed(display_speed);	}}// The system calls this to obtain the cursor to display while the user drags//  the minimized window.HCURSOR CHeadtrackerDlg::OnQueryDragIcon(){	return (HCURSOR) m_hIcon;}void CHeadtrackerDlg::OnDestroy() {	CDialog::OnDestroy();		// TODO: Add your message handler code here	Sleep(2000);//	Digitizer_Stop(0);	Digitizer_Shutdown(0);	StopCamera();	CloseCamera();}/////////////////////////////////////////////////////////////////////////////// General functionsvoid NegateBoolean(BOOL *b) { *b = 1 - *b; }/////////////////////////////////////////////////////////////////////////////// Input Mode (Live vs. Image Sequence) functionsvoid CHeadtrackerDlg::OnSelchangeInputMode() {	UpdateData(TRUE);	TRACE("input mode: %d\n", m_input_mode);	EnableDisableWindows();}/////////////////////////////////////////////////////////////////////////////// Tracking functionsvoid CHeadtrackerDlg::OnUseGradient() { 	if (use_color) {		NegateBoolean(&use_gradient); 		EnableDisableMagDot(use_gradient);	}	else ((CButton *) GetDlgItem(IDC_USE_GRADIENT))->SetCheck(use_gradient);}void CHeadtrackerDlg::OnUseColor() { 	if (use_gradient) NegateBoolean(&use_color); 	else ((CButton *) GetDlgItem(IDC_USE_COLOR))->SetCheck(use_color);}void CHeadtrackerDlg::OnGradientMag() {	sum_gradient_magnitude = TRUE; }void CHeadtrackerDlg::OnGradientDot() {	sum_gradient_magnitude = FALSE; }void CHeadtrackerDlg::OnSaveModel() { WriteModel(filename_model); }void CHeadtrackerDlg::OnCheckTracking() {	if (!m_tracking) {	// start tracking	//	InitTracker(&curr_state);  // redundant now	} else {			// stop tracking	//	if (!Image.Write24BitBMP("image.bmp")) {	//		AfxMessageBox("Error writing BMP file",MB_OK|MB_ICONSTOP,0);	//	}	}	m_tracking = 1 - m_tracking;}void CHeadtrackerDlg::OnAdaptHistogram() {	NegateBoolean(&adapt_histogram);	if (!adapt_histogram) CopyModelHistogramToRef();}void CHeadtrackerDlg::OnBuildingModel() {	UpdateData(TRUE);	building_model = m_building_model;	if (building_model) {		InitBuildingOfModel();	} else {		StopBuildingOfModel();	}}void CHeadtrackerDlg::OnShowDetails() {	int left = 0, top = 0;	NegateBoolean(&show_details);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -