visionview-1.cpp

来自「FIRA 3对3 机器人足球PC端控制程序。」· C++ 代码 · 共 2,053 行 · 第 1/5 页

CPP
2,053
字号
	DistanceBetweenBigTeamAndSmallID = (short)(sqrt(2)/2. * DEF_SIZE_X_ROBOT);
	for(i=0;i<6;i++){
		BallColor[i] = 0;
		TeamColor[i] = 0;
		IdColor[0][i] = 0;
		IdColor[1][i] = 0;
		IdColor[2][i] = 0;
		OpponentColor[i] = 0;
	}
	////////////////////////////////
	// initialization by defaults //
	////////////////////////////////
		
	// Serial port initialization
	m_bPort1=TRUE;
	m_pComm.SetComPort(1,19200,8,0,0);
	m_pComm.CreateCommInfo();
	m_pComm.OpenComPort();
	m_nGame = 5;
	m_nSetting = 5;
	m_nTest = FALSE;
	//by kui hong
	
	
	// Determine initial title of mainframe window
	GetParentFrame()->SetWindowText("Supervisor Program of Robot Soccer System");

	// Disable all command button except "Load VXD" button
	GetDlgItem(IDC_READY_BUTTON)->EnableWindow(FALSE);
	GetDlgItem(IDC_START_GAME_BUTTON)->EnableWindow(FALSE);
	GetDlgItem(IDC_STOP_GAME_BUTTON)->EnableWindow(FALSE);
	GetDlgItem(IDC_SET_BOUNDARY)->EnableWindow(FALSE);
	GetDlgItem(IDC_SET_COLOR)->EnableWindow(FALSE);
	GetDlgItem(IDC_SET_PIXEL_SIZE)->EnableWindow(FALSE);
	GetDlgItem(IDC_SET_ROBOT_SIZE)->EnableWindow(FALSE);
	GetDlgItem(IDC_CHANGE_COLOR)->EnableWindow(FALSE);
	GetDlgItem(IDC_LOAD_CONFIGURATION)->EnableWindow(FALSE);
	GetDlgItem(IDC_SAVE_CONFIGURATION)->EnableWindow(FALSE);
	GetDlgItem(IDC_CONTINUOUS_GRAB_BUTTON)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_BALL_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_HOME1_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_HOME2_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_HOME3_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_HOME4_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_HGOALIE_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_OPPO1_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_OPPO2_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_OPPO3_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_OPPO4_RADIO)->EnableWindow(FALSE);
	GetDlgItem(IDC_POS_OPPO5_RADIO)->EnableWindow(FALSE);

	// Get the position of client window on screen		
	GetWndPos();
	
	UpdateData(FALSE);
		
}

// 弊贰滚狼 叼胶敲饭捞 汲沥 力芭, 皋葛府 立辟 靛扼捞滚 摧扁
BOOL CVisionView::DestroyWindow() 
{
	// TODO: Add your specialized code here and/or call the base class

	// Halt continuous grab and remove MilDisplay
	RemoveFromDisplay();

	// Close TViCH32
	HW32 = CloseTVicHW32(HW32);

	return CFormView::DestroyWindow();
}

void CVisionView::RemoveFromDisplay()
{
   	// Halt grab if in process in THIS view
	MdigHalt(MilDigitizerId);
	// Deselect the buffer from it's display object and given window 
  	if (MilImageBufferId && MilDisplayId)
		MdispDeselect(MilDisplayId, MilImageBufferId);
	// Free the display
	if (MilDisplayId) 
		MdispFree(MilDisplayId);
	MilDisplayId = M_NULL;
}


// 漠扼 汲沥 劝己
void CVisionView::OnSetColor() 
{
	// TODO: Add your control notification handler code here
	if(bPlay)
		return;	

	//KillTimer(1);

	bSetColor = TRUE;
	bSetRobotSize = FALSE;
	

}

// 版扁厘 版拌 汲沥窍扁; SetBoundary 措拳芒 剁快扁
void CVisionView::OnSetBoundary() 
{
	// TODO: Add your control notification handler code here
	if(bPlay)
		return;	

	//KillTimer(1);

	ptrSetBoundary->rect.top = rectBoundary.top;
	ptrSetBoundary->rect.left = rectBoundary.left;
	ptrSetBoundary->rect.bottom = rectBoundary.bottom;
	ptrSetBoundary->rect.right = rectBoundary.right;
	ptrSetBoundary->DispSizeX = DispSizeX;
	ptrSetBoundary->DispSizeY = DispSizeY;
	ptrSetBoundary->MilDisplayId = MilDisplayId;
					
	if(ptrSetBoundary->DoModal() == IDOK){
		rectBoundary.top = ptrSetBoundary->rect.top;
		rectBoundary.left = ptrSetBoundary->rect.left;
		rectBoundary.bottom = ptrSetBoundary->rect.bottom;
		rectBoundary.right = ptrSetBoundary->rect.right;
	}
}

// cfg 颇老肺 何磐 祸裹困, 拱眉 茫扁 咯何, 版扁厘 康开 蔼 佬扁 
void CVisionView::OnLoadConfiguration() 
{
	// TODO: Add your control notification handler code here
	if(bPlay)
		return;	

	//KillTimer(1);

	MdigHalt(MilDigitizerId);
	

	FILE *fp; 
	long	i;
	
	CFileDialog FileDlg(TRUE, "cfg", "default", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		"CFG files(*.cfg)|*.cfg|All files(*.*)|*.*||", this);
	
	if(FileDlg.DoModal() == IDOK)
	{                                 
		if((fp = fopen((const char *)FileDlg.GetPathName(), "r")) == NULL)
			MessageBox("File Open Error");
		else {

			MgraColor(M_DEFAULT, M_RGB888(0, 0, 0));
			MgraClear(M_DEFAULT, MilImageBufferId);
			MgraFont(M_DEFAULT, M_FONT_DEFAULT_LARGE);
			MgraColor(M_DEFAULT, M_RGB888(255, 0, 255));
			MgraText(M_DEFAULT, MilImageBufferId, DispSizeX/2-200, DispSizeY/2-45, "Loading New Configuration ...");
			MgraFont(M_DEFAULT, M_FONT_DEFAULT);
			MgraText(M_DEFAULT, MilImageBufferId, DispSizeX/2-200, DispSizeY/2+10, "Wait a moment.");
	
        	fscanf(fp, "%d", &rectBoundary.top);
			fscanf(fp, "%d", &rectBoundary.left);
			fscanf(fp, "%d", &rectBoundary.bottom);
			fscanf(fp, "%d", &rectBoundary.right);   

			fscanf(fp, "%d",&LowerBoundOfBallSize);
			fscanf(fp, "%d",&UpperBoundOfBallSize);
			fscanf(fp, "%d",&LowerBoundOfBigTeamSize);
			fscanf(fp, "%d",&UpperBoundOfBigTeamSize);
			fscanf(fp, "%d",&LowerBoundOfSmallIDSize);
			fscanf(fp, "%d",&UpperBoundOfSmallIDSize);
			fscanf(fp, "%d",&LowerBoundOfOpponentSize);
			fscanf(fp, "%d",&UpperBoundOfOpponentSize);
			fscanf(fp, "%d",&DistanceBetweenBigTeamAndSmallID);
		        
			for(i = 0;i < 6;i++)
				fscanf(fp, "%d", &BallColor[i]);			
			for(i = 0;i < 6;i++)
				fscanf(fp, "%d", &TeamColor[i]);			
			for(i = 0;i < 6;i++)
				fscanf(fp, "%d", &IdColor[0][i]);			
//			for(i = 0;i < 6;i++)
//				fscanf(fp, "%d", &IdColor[1][i]);			
//			for(i = 0;i < 6;i++)
//				fscanf(fp, "%d", &IdColor[2][i]);			
			for(i = 0;i < 6;i++)
				fscanf(fp, "%d", &OpponentColor[i]);			
		
			fscanf(fp, "%d", &m_bFlagFindBall);     
			fscanf(fp, "%d", &m_bFlagFindHome1);     
			fscanf(fp, "%d", &m_bFlagFindHome2);     
//			fscanf(fp, "%d", &m_bFlagFindHome3);     
//			fscanf(fp, "%d", &m_bFlagFindHome4);     
			fscanf(fp, "%d", &m_bFlagFindHgoalie);     
			fscanf(fp, "%d", &m_bFlagFindOpponent1);     
			fscanf(fp, "%d", &m_bFlagFindOpponent2);     
			fscanf(fp, "%d", &m_bFlagFindOpponent3);     
//			fscanf(fp, "%d", &m_bFlagFindOpponent4);     
//			fscanf(fp, "%d", &m_bFlagFindOpponent5);     
		 
			bFlagFindBall = m_bFlagFindBall;
			bFlagFindHomeRobot[HOME1] = m_bFlagFindHome1;
			bFlagFindHomeRobot[HOME2] = m_bFlagFindHome2;
//			bFlagFindHomeRobot[HOME3] = m_bFlagFindHome3;
//			bFlagFindHomeRobot[HOME4] = m_bFlagFindHome4;
			bFlagFindHomeRobot[HGOALIE] = m_bFlagFindHgoalie;
			bFlagFindOpponent[OPP1] = m_bFlagFindOpponent1;
			bFlagFindOpponent[OPP2] = m_bFlagFindOpponent2;
			bFlagFindOpponent[OPP3] = m_bFlagFindOpponent3;
//			bFlagFindOpponent[OPP4] = m_bFlagFindOpponent4;
//			bFlagFindOpponent[OPP5] = m_bFlagFindOpponent5;

			UpdateLUTAllColor();

			fscanf(fp, "%d", &bFlagIsOurHomeLeft);
			
		}
		fclose(fp);	
	}
	

	UpdateData(FALSE);     

	MdigGrabContinuous(MilDigitizerId, MilImageBufferId);

	Invalidate();
		
}

// 漂沥 祸狼 RGB甫 YUV肺 函券窍咯 lookup table 盎脚窍扁 
void CVisionView::UpdateLUTcolor(short *ptrNewColor, const int Color) 
{
	int r, g, b, y, u, v, Ly, Uy, Lu, Uu, Lv, Uv;
			
	Ly = *ptrNewColor;
	Uy = *(ptrNewColor+1);
	Lu = *(ptrNewColor+2);
	Uu = *(ptrNewColor+3);
	Lv = *(ptrNewColor+4);
	Uv = *(ptrNewColor+5);

	for(r=0;r<256;r++)
		for(g=0;g<256;g++)
			for(b=0;b<256;b++) {
				index_lut = ((r<<16) + (g<<8) + b);
				if(LUTcolor[index_lut] == Color)
					LUTcolor[index_lut] = NONE_COLOR;

				y = (int)(299*r + 587*g + 114*b);
				y = min(255000,max(y,0));
				u = (int)(565*(1000*b-y) + 128000000)/1000000;
				u = min(255,max(u,0));
				v = (int)(713*(1000*r-y) + 128000000)/1000000;
				v = min(255,max(v,0));
				y /= 1000;
				
				if(y >= Ly && y <= Uy && u >= Lu && u <= Uu && v >= Lv && v <= Uv) 
					LUTcolor[index_lut] = Color;
			}
}

// 葛电 祸狼 RGB甫 YUV肺 函券窍咯 lookup table 盎脚窍扁 
void CVisionView::UpdateLUTAllColor() 
{
	int r, g, b, y, u, v;
		
	for(r=0;r<256;r++)
		for(g=0;g<256;g++)
			for(b=0;b<256;b++) {
				index_lut = ((r<<16) + (g<<8) + b);
			
				y = (int)(299*r + 587*g + 114*b);
				y = min(255000,max(y,0));
				u = (int)(565*(1000*b-y) + 128000000)/1000000;
				u = min(255,max(u,0));
				v = (int)(713*(1000*r-y) + 128000000)/1000000;
				v = min(255,max(v,0));
				y /= 1000;
										
				if(y >= BallColor[0] && y <= BallColor[1] && u >= BallColor[2] && u <= BallColor[3] && v >= BallColor[4] && v <= BallColor[5]) 					
					LUTcolor[index_lut] = BALL_COLOR;
				else if(y >= TeamColor[0] && y <= TeamColor[1] && u >= TeamColor[2] && u <= TeamColor[3] && v >= TeamColor[4] && v <= TeamColor[5]) 					 
					LUTcolor[index_lut] = TEAM_COLOR;
				else if(y >= IdColor[0][0] && y <= IdColor[0][1] && u >= IdColor[0][2] && u <= IdColor[0][3] && v >= IdColor[0][4] && v <= IdColor[0][5]) 					 
					LUTcolor[index_lut] = ID1_COLOR;
//				else if(y >= IdColor[1][0] && y <= IdColor[1][1] && u >= IdColor[1][2] && u <= IdColor[1][3] && v >= IdColor[1][4] && v <= IdColor[1][5]) 					 
//					LUTcolor[index_lut] = ID2_COLOR;
//				else if(y >= IdColor[2][0] && y <= IdColor[2][1] && u >= IdColor[2][2] && u <= IdColor[2][3] && v >= IdColor[2][4] && v <= IdColor[2][5]) 					 
//					LUTcolor[index_lut] = ID3_COLOR;
				else if( (bFlagFindOpponent[OPP1] || bFlagFindOpponent[OPP2] || bFlagFindOpponent[OPP3]) // || bFlagFindOpponent[OPP4] || bFlagFindOpponent[OPP5])  
						&& y >= OpponentColor[0] && y <= OpponentColor[1] && u >= OpponentColor[2] && u <= OpponentColor[3] && v >= OpponentColor[4] && v <= OpponentColor[5]) 					 
					LUTcolor[index_lut] = OPPONENT_COLOR;
				else
					LUTcolor[index_lut] = NONE_COLOR;
		}

}

// cfg 历厘窍扁 
void CVisionView::OnSaveConfiguration() 
{
	// TODO: Add your control notification handler code here
	if(bPlay)
		return;	

	//KillTimer(1);
	MdigHalt(MilDigitizerId);
		
	FILE *fp; 
	short i;

	UpdateData(TRUE);

	CFileDialog FileDlg(FALSE, "cfg", "default", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		"CFG files(*.cfg)|*.cfg|All files(*.*)|*.*||", this);

	if(FileDlg.DoModal() == IDOK)
	{                                 
		if((fp = fopen((const char *)FileDlg.GetPathName(), "w")) == NULL)
			MessageBox("File Open Error");
		else {
			fprintf(fp, "%d ", rectBoundary.top);
			fprintf(fp, "%d ", rectBoundary.left);
			fprintf(fp, "%d ", rectBoundary.bottom);
			fprintf(fp, "%d ", rectBoundary.right);   
			fprintf(fp,"\n");

			fprintf(fp, "%d ",LowerBoundOfBallSize);
			fprintf(fp, "%d ",UpperBoundOfBallSize);
			fprintf(fp, "%d ",LowerBoundOfBigTeamSize);
			fprintf(fp, "%d ",UpperBoundOfBigTeamSize);
			fprintf(fp, "%d ",LowerBoundOfSmallIDSize);
			fprintf(fp, "%d ",UpperBoundOfSmallIDSize);
			fprintf(fp, "%d ",LowerBoundOfOpponentSize);
			fprintf(fp, "%d\n",UpperBoundOfOpponentSize);
			fprintf(fp, "%d\n",DistanceBetweenBigTeamAndSmallID);

			for(i = 0;i < 6;i++)
				fprintf(fp, "%d ", BallColor[i]);			
			fprintf(fp,"\n"); 
			for(i = 0;i < 6;i++)
				fprintf(fp, "%d ", TeamColor[i]);			
			fprintf(fp,"\n");
			for(i = 0;i < 6;i++)
				fprintf(fp, "%d ", IdColor[0][i]);			
			fprintf(fp,"\n");
//			for(i = 0;i < 6;i++)
//				fprintf(fp, "%d ", IdColor[1][i]);			
//			fprintf(fp,"\n");
//			for(i = 0;i < 6;i++)
//				fprintf(fp, "%d ", IdColor[2][i]);			
//			fprintf(fp,"\n");
			for(i = 0;i < 6;i++)
				fprintf(fp, "%d ", OpponentColor[i]);			
			fprintf(fp,"\n");

			fprintf(fp, "%d ", m_bFlagFindBall);     
			fprintf(fp, "%d ", m_bFlagFindHome1);     
			fprintf(fp, "%d ", m_bFlagFindHome2);     
//			fprintf(fp, "%d ", m_bFlagFindHome3);     
//			fprintf(fp, "%d ", m_bFlagFindHome4);     
			fprintf(fp, "%d ", m_bFlagFindHgoalie);     
			fprintf(fp, "%d ", m_bFlagFindOpponent1);     
			fprintf(fp, "%d ", m_bFlagFindOpponent2);     
			fprintf(fp, "%d ", m_bFlagFindOpponent3);     
//			fprintf(fp, "%d ", m_bFlagFindOpponent4);     
//			fprintf(fp, "%d ", m_bFlagFindOpponent5);     

			fprintf(fp,"\n");
			fprintf(fp, "%d ", bFlagIsOurHomeLeft);
		}
		
		fclose(fp);	
	}

	MdigGrabContinuous(MilDigitizerId, MilImageBufferId);

	Invalidate();
}

// 祸 裹困 犁炼沥窍扁 
void CVisionView::OnChangeColor() 
{
	// TODO: Add your control notification handler code here
	if(bPlay)
		return;	

	//KillTimer(1);
	
	// Initialize values of SetColor Dialog
	ptrSetColor->bSetColor = FALSE;
	InitSetColorDlg();
	
	if(ptrSetColor->DoModal() == IDOK)
		SetColorUpdate();
}

// Initialize values of SetColor Dialog
// 祸 裹困 炼沥 困茄 措拳芒 檬扁拳
void CVisionView::InitSetColorDlg()
{
	short i;

	ptrSetColor->m_nSelectedColor = 0;
	ptrSetColor->MilDisplayId = MilDisplayId;
	ptrSetColor->MilDigitizerId = MilDigitizerId;
	ptrSetColor->MilImageBufferId = MilImageBufferId;
	ptrSetColor->DispSizeX = DispSizeX;
	ptrSetColor->DispSizeY = DispSizeY;
	ptrSetColor->pImageBuffer = ImageBuffer;
	ptrSetColor->m_bBlackBackground = TRUE;

	//khs MdispControl(MilDisplayId, M_WINDOW_COLOR, M_ENABLE);

⌨️ 快捷键说明

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