📄 videodlg.cpp
字号:
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 + -