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

📄 videodlg.cpp

📁 本程序是2005年参加中国机器人大赛的比赛程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			Their_LableCentreGravity[n][1]=0;
			Their_LableCentreGravity[n][0]=0;
		}
		//画我队队员重心
		for(n = 0; n < 5; n++)
		{
			point.x=My_CentreGravity[n][1];//第n个队标
			point.y=My_CentreGravity[n][0];										
			TempRect.left=point.x-m_pConfigDlg->m_ObjectDia/2;
			TempRect.right=point.x+m_pConfigDlg->m_ObjectDia/2;
			TempRect.top=point.y-m_pConfigDlg->m_ObjectDia/2;
			TempRect.bottom=point.y+m_pConfigDlg->m_ObjectDia/2;
			My_CentreGravity[n][1]=0;
			My_CentreGravity[n][0]=0;

			CDC *dc=GetDC();
			CString str;
			str.Format("%d",n+1);//显示机器人的位置,从1--5;
			dc->TextOut(TempRect.left+15,TempRect.top+15,str);
			ReleaseDC(dc);
			SetPixelDrawRect(TempRect);
		}	
		//画球的重心
		for(n = 0; n < BallRectNum; n++)		
		{
			point.x=Ball_CentreGravity[0][1];
			point.y=Ball_CentreGravity[0][0];
			TempRect.left=point.x-m_pConfigDlg->m_ObjectDia/2;
			TempRect.right=point.x+m_pConfigDlg->m_ObjectDia/2;
			TempRect.top=point.y-m_pConfigDlg->m_ObjectDia/2;
			TempRect.bottom=point.y+m_pConfigDlg->m_ObjectDia/2;
			Ball_CentreGravity[0][1]=0;
			Ball_CentreGravity[0][0]=0;
			
			CDC *dc=GetDC();
			dc->TextOut(TempRect.left+8,TempRect.top+8,"b");
			ReleaseDC(dc);
			SetPixelDrawRect(TempRect);	
		}	
	}
}

void CVideoDlg::OnButton3() 
{
	OnRead();
	CDC* pDC = GetDC();
	CRect DisplayRect;
	GetClientRect(&DisplayRect);
	byte tt[3];
	m_pConfigDlg->UpdateData(true);
	int num;
	switch(m_pConfigDlg->m_RadioSelectObject)
	{
	case 0://我队标志
		num=0;
		break;
	case 1://我队队员1
		num=1;		
		break;
	case 2://我队队员2
		num=2;
		break;
	case 3://我队队员3
		num=3;
		break;
	case 4://我队队员4		
		break;
	case 5://我队队员5		
		break;
	case 6://他队标志
		num=5;	
		break;
	case 7://他队队员1
		num=6;	
		break;
	case 8://他队队员2
		num=7;
		break;
	case 9://他队队员3
		
		break;
	case 10://他队队员4
	
		break;
	case 11://他队队员5
	
		break;
//	case 9://球
	case 12://球
		num=4;
		break;
	case 13://场地
//		case 10://场地
		num=8;	
		break;
	}	

	for(int j=m_FieldRect.top;j<m_FieldRect.bottom;j++)
	{
			for(int i=m_FieldRect.left;i<m_FieldRect.right;i++)
			{
			GetPixelColor(i, j, Get_RGB);
			RGB_TO_YUV(Get_RGB,Col_YUV);
			if(YUVClass[Col_YUV[2]][num][2]
			 &&YUVClass[Col_YUV[1]][num][1]
			 &&YUVClass[Col_YUV[0]][num][0])
			{
				GetPixelColor(i, j,tt);
			pDC->SetPixel(i,j,RGB(tt[2],tt[1],tt[0]));
			}
			else
			{
			pDC->SetPixel(i,j,RGB(0,0,0));
			//pDC->SetPixel(i,j,RGB(tt[2],tt[1],tt[0]));
			}
			}
	}
	
	ReleaseDC(pDC);// TODO: Add your control notification handler code here
}

void CVideoDlg::OnButton4() 
{
    CDC* pDC = GetDC();
	CRect rect;
	CBrush br(RGB(255,255,255));
	GetClientRect(&rect);
//	rect.right=rect.left+640;
	rect.bottom=rect.top+480;
	pDC->SelectObject(br);
    pDC->FillRect(rect,&br);
	// TODO: Add your control notification handler code here
	ReleaseDC(pDC);
}

bool CVideoDlg::isInRect(int x, int y,CRect rect)
{
	if (x<rect.left) return false;
	if (x>rect.right) return false;
	if (y<rect.top)  return false;
	if (y>rect.bottom) return false;
	return true;
}

void CVideoDlg::OnRead() 
{
	CG400GetSnapToMemNumber(hcg400,&pNum);
	num=(int)(pNum)/2;
	if (num==0)  num=1;	
	lpSourceBuf=(char*)pLineAddr;
	CG400ReadFromMem(hcg400,lpSourceBuf,pPage*sum*4*1024,num-1,colour,0);
}

void CVideoDlg::setPlayer(int LableX, int LableY,int LM1,int LM2,int FX, int FY, int num)
{
	g_MyTeam[num+1].Set_vPos(Vector(LableX-m_FieldRect.left,m_FieldRect.bottom-LableY));
	double temp;
	temp=(Vector(LM1-m_FieldRect.left,m_FieldRect.bottom-LM2)-Vector(FX-m_FieldRect.left,m_FieldRect.bottom-FY)).GetAngle();
	g_MyTeam[num+1].Set_m_Angle(temp);
//	g_MyTeam[num+1].lable=Vector(FX-m_FieldRect.left,m_FieldRect.bottom-FY);
	isScanMyteam[num]=true;
}

void CVideoDlg::OnRButtonDown(UINT nFlags, CPoint point) 
{
	if((point.x<640)&&(point.y<480))
	{
		if(m_pConfigDlg->isSample)
			m_pConfigDlg->rbnsample();
	}

	CDialog::OnRButtonDown(nFlags, point);
}

void CVideoDlg::OnButton5() 
{
	CRect DisplayRect;
	int nBMBit=24;//15位以上都是这样
	CPalette* pScrnPalette;
	pScrnPalette = new CPalette;
	int nWaitStatus = 2;//这是帧方式下的
//////////////////////////////////
	CDC* pScrnDC = GetDC();
	GetClientRect(&DisplayRect);

	BITMAPINFO *BMIInfo;
	char bmiBuf[2048];
	BMIInfo = (BITMAPINFO *)bmiBuf;
	BMIInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	BMIInfo->bmiHeader.biWidth = 640;//DisplayRect.Width();
	BMIInfo->bmiHeader.biHeight = 480;//DisplayRect.Height();
	BMIInfo->bmiHeader.biPlanes = 1;
	BMIInfo->bmiHeader.biBitCount = nBMBit;
	BMIInfo->bmiHeader.biCompression = BI_RGB;
	BMIInfo->bmiHeader.biSizeImage = 0;
	BMIInfo->bmiHeader.biXPelsPerMeter = 0;
	BMIInfo->bmiHeader.biYPelsPerMeter = 0;
	BMIInfo->bmiHeader.biClrUsed = 0;
	BMIInfo->bmiHeader.biClrImportant = 0;
	for( int k = 0; k < 256; ++k){
		BMIInfo->bmiColors[k].rgbBlue = (BYTE)k;
		BMIInfo->bmiColors[k].rgbGreen = (BYTE)k;
		BMIInfo->bmiColors[k].rgbRed = (BYTE)k;
		BMIInfo->bmiColors[k].rgbReserved	= 0;
	}

	HGLOBAL hDIB;
	DWORD dwSize = 640*480/*(long)DisplayRect.Width()*(long)DisplayRect.Height()*/*
		(long)nBMBit/8;
	hDIB = GlobalAlloc(GHND, dwSize);
	if( hDIB )
	{
		char* lpvBits = (char *)GlobalLock(hDIB);
		DWORD dwPage;
		DWORD PhysMemAddr;
		DWORD MemHandle;
		DWORD LineAddr;
		int nRet = StaticMemAlloc(&dwPage, &PhysMemAddr, &MemHandle, &LineAddr);
		if(!nRet || !dwPage)
		{
			MessageBox("Memory allocates error!", NULL, MB_OK | MB_ICONEXCLAMATION);
			return;
		}
		char *lpSourceBuf1 = (char *)LineAddr;
		int nStatus;
		int nNum = 0;
		BOOL bComplete1 = 0;
		for(;;)
		{
			CG400GetSnappingStatus(hcg400, &nStatus);
			if(nStatus == nWaitStatus && bComplete1 == 0)
			{
				nNum = 1;//第一帧可以使用
				bComplete1 = 1;//第一帧取完了
			}

			if(nStatus == 0 && bComplete1 == 1)
			{
				//正在采集第一帧
				nNum = 2;//第二帧可以使用
				bComplete1 = 0;//第一帧不能取了
			}
			if( nNum )//“有”一帧,第一帧或者第二帧
			{
				CG400ReadFromMem(hcg400, lpSourceBuf1, dwPage*4*1024, nNum-1, lpvBits, 1);
				pScrnDC->SelectPalette(pScrnPalette, FALSE);
				pScrnDC->RealizePalette();
				pScrnDC->SetStretchBltMode(COLORONCOLOR);
				SetDIBitsToDevice( (HDC)*pScrnDC,
									DisplayRect.left, DisplayRect.top,
									//DisplayRect.Width(), DisplayRect.Height(),
									640,480,
									DisplayRect.left, DisplayRect.top,
									//0, DisplayRect.Height(), lpvBits,
									0,480,lpvBits,	
									BMIInfo, DIB_RGB_COLORS);
				nNum = 0;
				//这里新加入搜索
				OnButton1();
				SetPixDrawAllCap();
			}
			
			MSG	lpMsg;
		    PeekMessage(&lpMsg,NULL,0,0,PM_REMOVE);
			if((GetKeyState(VK_ESCAPE) &0x80) == 0x80)break; 
		}
		GlobalUnlock(hDIB);
		GlobalFree(hDIB);
	}
	ReleaseDC(pScrnDC);// TODO: Add your control notification handler code here
}

void CVideoDlg::RGB_TO_YUV(byte Col_RGB[],byte Col_YUV[])
{
	Col_YUV[2]=YUV[Col_RGB[2]][Col_RGB[1]][Col_RGB[0]][2];
	Col_YUV[1]=YUV[Col_RGB[2]][Col_RGB[1]][Col_RGB[0]][1];
	Col_YUV[0]=YUV[Col_RGB[2]][Col_RGB[1]][Col_RGB[0]][0];
}

bool CVideoDlg::isBall(int tempCentreGravity[])
{
   CRect ballRect;
   int t=0;
   ballRect.left=tempCentreGravity[0]-m_pConfigDlg->m_ObjectDia/2;
   ballRect.right=tempCentreGravity[0]+m_pConfigDlg->m_ObjectDia/2;
   ballRect.top=tempCentreGravity[1]-m_pConfigDlg->m_ObjectDia/2;
   ballRect.bottom=tempCentreGravity[1]+m_pConfigDlg->m_ObjectDia/2;
   for (int i=ballRect.left;i<=ballRect.right;i++)
   {
	   GetPixelColor(i, ballRect.top, Get_RGB);
	   RGB_TO_YUV(Get_RGB,Col_YUV);
		if(IsMeetRestrict(Col_YUV, m_pConfigDlg->m_upper_Field, m_pConfigDlg->m_lower_Field))
			{//去掉场地
				t++;
				if (t==8)
					return true;
			}
	   GetPixelColor(i, ballRect.bottom,Get_RGB);
	   RGB_TO_YUV(Get_RGB,Col_YUV);
		if(IsMeetRestrict(Col_YUV, m_pConfigDlg->m_upper_Field, m_pConfigDlg->m_lower_Field))
			{//去掉场地
				t++;
				if (t==8)
					return true;
			}
   }

   for (int j=ballRect.top;i<=ballRect.bottom;i++)
   {
	   GetPixelColor(ballRect.left, j, Get_RGB);
	   RGB_TO_YUV(Get_RGB,Col_YUV);
		if(IsMeetRestrict(Col_YUV, m_pConfigDlg->m_upper_Field, m_pConfigDlg->m_lower_Field))
			{//去掉场地
				t++;
				if (t==8)
					return true;
			}
	   GetPixelColor(ballRect.right, j,Get_RGB);
	   RGB_TO_YUV(Get_RGB,Col_YUV);
		if(IsMeetRestrict(Col_YUV, m_pConfigDlg->m_upper_Field, m_pConfigDlg->m_lower_Field))
			{//去掉场地
				t++;
				if (t==8)
					return true;
			}
   }
   return false;
}

bool CVideoDlg::rectSearch(CRect rect, byte upper[], byte low[], CPoint *point,int colnum)
{
	CRect ScanRect;
   for(l=rect.top;l<rect.bottom;l++)
		for(m=rect.left;m<rect.right;m+=2)							
		{
			GetPixelColor(m, l, Get_RGB);
			RGB_TO_YUV(Get_RGB,Col_YUV);
//			if(IsMeetRestrict(Col_YUV,upper,low))
			if(YUVClass[Col_YUV[2]][colnum][2]
			 &&YUVClass[Col_YUV[1]][colnum][1]
			 &&YUVClass[Col_YUV[0]][colnum][0])
			{
				GetPixelColor(m+1, l, Get_RGB);
				RGB_TO_YUV(Get_RGB,Col_YUV);
//			if(IsMeetRestrict(Col_YUV,upper,low))
				if(YUVClass[Col_YUV[2]][colnum][2]
				 &&YUVClass[Col_YUV[1]][colnum][1]
				 &&YUVClass[Col_YUV[0]][colnum][0])
				{
				int tempCentreGravity2[2];
				ScanRect2.left = m - m_pConfigDlg->m_ObjectDia;
				ScanRect2.top = l-2;
				ScanRect2.right = m + m_pConfigDlg->m_ObjectDia;
				ScanRect2.bottom = l + m_pConfigDlg->m_ObjectDia;
				if( ScanNearRect(ScanRect2, 											
								 m_pConfigDlg->m_ObjectPercent,
								 upper,
								 low,
								 tempCentreGravity2,
								 colnum) )
					{																		
					(*point).x = tempCentreGravity2[1];
					(*point).y = tempCentreGravity2[0];				
					return true;
					}
				}
			}			
		}
		return false;
}

bool CVideoDlg::pointExist(byte upper[], byte low[], CPoint *point,int colnum)
{
	CRect Rect;
	int num;
	num=0;
	Rect.left=(*point).x-m_pConfigDlg->m_ObjectDia;						
	Rect.top = (*point).y-m_pConfigDlg->m_ObjectDia;
	Rect.right =(*point).x+m_pConfigDlg->m_ObjectDia;
	Rect.bottom =(*point).y+m_pConfigDlg->m_ObjectDia;
	 for(l=Rect.top;l<Rect.bottom;l++)
		for(m=Rect.left;m<Rect.right;m+=2)
		{
			GetPixelColor(m, l, Get_RGB);
			RGB_TO_YUV(Get_RGB,Col_YUV);
//			if(IsMeetRestrict(Col_YUV,upper,low))
			if(YUVClass[Col_YUV[2]][colnum][2]
			 &&YUVClass[Col_YUV[1]][colnum][1]
			 &&YUVClass[Col_YUV[0]][colnum][0])
			{
				num++;
				if(num==3)
					return true;
			}
		}
		return false;
}

bool CVideoDlg::rectExist(byte upper[], byte low[],CRect Rect,int colnum)
{
	int num;
	num=0;
	for(l=Rect.top;l<Rect.bottom;l+=2)
		for(m=Rect.left;m<Rect.right;m+=2)
		{
			GetPixelColor(m, l, Get_RGB);
			RGB_TO_YUV(Get_RGB,Col_YUV);
//			if(IsMeetRestrict(Col_YUV,upper,low))
			if(YUVClass[Col_YUV[2]][colnum][2]
			 &&YUVClass[Col_YUV[1]][colnum][1]
			 &&YUVClass[Col_YUV[0]][colnum][0])
			{
				num++;
				if(num==3)				
					return true;			
			}	
		
		}
		return false;
}

void CVideoDlg::initYuv()
{
 int R,G,B;
 for (R=0;R<256;R++)
	 for (G=0;G<256;G++)
		 for (B=0;B<256;B++)
		 {
			 YUV[R][G][B][2]=(char)(0.299*R+0.587*G+0.144*B);
	     	 YUV[R][G][B][1]=(char) ((-0.167)*R+(-0.331)*G+0.500*B+127);

⌨️ 快捷键说明

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