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

📄 grimsonbg.cpp

📁 人体运动跟踪 混合高斯模型+GRISON方法
💻 CPP
📖 第 1 页 / 共 5 页
字号:
								temp_left=0;
							}
						}
						else
						{
							temp_right=result[loop].right+2;
							temp_left=result[loop].left-2;
						}

						for (i=temp_left; i<temp_right; i++)
							for (j=-height/2; j<=height/2; j++)
							{
								if (labeled[i+(jj+j)*m_biWidth]==temp)
									if (jj < (position[whichone].bottom-position[whichone].top)/2+position[whichone].top)	
										total=total+2;
									else total++;


								else total--;
							}
						if (total>= previous_total) 
						{
							previous_total=total;
							result[loop].top=jj-height/2;
							result[loop].bottom=jj+height/2;
						}	

					}

				}

		}
		}
		*outputnumber=tt;
}


void	GrimsonBG::FindBestRectangleAll(CDC* pDC,BYTE *labeled, short *region_info, CRect *position,  byte *m_bOutputInformation, CRect *result)
{
	m_iTotalRectangle=0;
	memset(m_bOutputInformation, 0, sizeof(m_bOutputInfo));
//	memcpy(Bm_crRectangleAllBackup, result, sizeof(Bm_crRectangleAllBackup));
	for (int i=0; i<512; i++)
	{
		result[i].left=0;
		result[i].right=0;
		result[i].top=0;
		result[i].bottom=0;
	}

	



	int recnum=0;
	int outputnum;
	for (i=0; i<256; i++)
	{
		if (region_info[2*i+1]>=m_iMinObjectSize)
		{
			ComputeProjection(labeled, region_info, position, i, m_sXProject, m_sYProject);
			FindBestRectangle(labeled, region_info, position, m_sXProject, i, &outputnum, m_crRectangle);
			DrawRectangle(pDC,outputnum, m_crRectangle, 320, 240);//int Target_left, int Target_top, int left, int right, int top, int bottom, int r, int g, int b)	

			m_bOutputInformation[i]=outputnum;
			if (outputnum>0)
			{
				for (int loop=0; loop<outputnum; loop++)
				{
					result[recnum].left=m_crRectangle[loop].left;
					result[recnum].right=m_crRectangle[loop].right;
					result[recnum].top=m_crRectangle[loop].top;
					result[recnum].bottom=m_crRectangle[loop].bottom;
					recnum++;
				}
				m_iTotalRectangle=m_iTotalRectangle+outputnum;
			}
		}
		else	i=256;
	}
}


void GrimsonBG::DrawRectangle(CDC* pDC, int number, CRect *point, int upperx, int uppery)//int Target_left, int Target_top, int left, int right, int top, int bottom, int r, int g, int b)
{
	CPen pen, *oldpen;
	pen.CreatePen(PS_SOLID, 2, RGB(255,78,164));

	oldpen=pDC->SelectObject(&pen);

	for (int i=0; i<number; i++)
	{

		pDC->MoveTo(upperx+point[i].left, uppery+point[i].top);
		pDC->LineTo(upperx+point[i].right, uppery+point[i].top);
		pDC->LineTo(upperx+point[i].right, uppery+point[i].bottom);
		pDC->LineTo(upperx+point[i].left, uppery+point[i].bottom);
		pDC->LineTo(upperx+point[i].left, uppery+point[i].top);
	}

	pDC->SelectObject(oldpen);
	pen.DeleteObject();
}


void	GrimsonBG::ChangeColorModeltoYUV(byte *original, byte *output)
{
	IplImage *source, *destination;
	source = CreateIpl(m_biWidth, m_biHeight, original,  1);
	destination = CreateIpl(m_biWidth, m_biHeight, output, 3);

	iplRGB2YUV(source, destination);

	iplDeallocate(source, IPL_IMAGE_HEADER);
	iplDeallocate(destination, IPL_IMAGE_HEADER);
}

void	GrimsonBG::ComputeColorDistribution(byte *original, int bits,  byte *label)
{
	int i,j,jj, ii, loop;
	int recnum=0, segvalue;
	float	rm, gm, bm, rsd, gsd, bsd, totalnum;
	m_iCurrentTrack++;
	m_iCurrentTrack= m_iCurrentTrack % 10;
	int top=m_biHeight, bottom=0;

	memcpy(m_byMorpLabeled+m_iCurrentTrack*sizeof(m_bResultone), m_bResultone, sizeof(m_bResultone));

//	memcpy(Objectm_crResultPositionBack+(sizeof(m_crResultPosition))*m_iCurrentTrack, m_crResultPosition, sizeof(m_crResultPosition));


	for (i=0; i<256;i++ )
	{

//		CDebug::dprintf(" Current number %d in the computation routine \n", m_iCurrentTrack);

		if (m_sRegionInfo[2*i+1]>=m_iMinObjectSize)
		{
			segvalue=m_sRegionInfo[2*i+0];
			for (j=0; j<m_bOutputInfo[i]; j++)
			{
				rm=0.; gm=0.; bm=0.; rsd=0.; gsd=0.; bsd=0.; totalnum=0;
				for (ii=m_crRectangleAll[recnum].left; ii<=m_crRectangleAll[recnum].right; ii++)
				{
					for (jj=0; jj<m_biHeight; jj++)
					{
						if (label[ii+jj*m_biWidth]==segvalue)
						{
							totalnum++;
							rm= rm+ original[jj*m_biWidth*bits+ii*bits+2];	// v
							gm= gm+ original[jj*m_biWidth*bits+ii*bits+1];	// u
							bm= bm+ original[jj*m_biWidth*bits+ii*bits+0];	// y
						}
					}		
				}

				if (totalnum!=0)
				{
					rm = rm / totalnum;
					gm = gm / totalnum;
					bm = bm / totalnum;
					top=m_biHeight;
					bottom=0;

					for (ii=m_crRectangleAll[recnum].left; ii<=m_crRectangleAll[recnum].right; ii++)
					{
						for (jj=0; jj<m_biHeight; jj++)
						{
							if (label[ii+jj*m_biWidth]==segvalue)
							{
							//	totalnum++;
								if (jj <= top) top=jj;
								if (jj >=bottom) bottom=jj;
								rsd= rsd+ float((original[jj*m_biWidth*bits+ii*bits+2]-rm)*(original[jj*m_biWidth*bits+ii*bits+2]-rm));		// v
								gsd= gsd+ float((original[jj*m_biWidth*bits+ii*bits+1]-gm)*(original[jj*m_biWidth*bits+ii*bits+1]-gm));		// u
								bsd= bsd+ float((original[jj*m_biWidth*bits+ii*bits+0]-bm)*(original[jj*m_biWidth*bits+ii*bits+0]-bm));		// y
							}
						}		
					}
					rsd = (float)sqrt( rsd / totalnum);
					gsd = (float)sqrt( gsd / totalnum);
					bsd = (float)sqrt( bsd / totalnum);

//		CDebug::dprintf("\n \n** %d-th seg, %d-th rectangle, size: %f, mean R:%f, G:%f, B:%f, SD R:%f, G:%f, B:%f\n", i, j, totalnum, rm, gm, bm, rsd, gsd, bsd);
				m_fObjectInfo[m_iCurrentTrack*2000+0+recnum*20]= (float)segvalue ;  // segment number
				m_fObjectInfo[m_iCurrentTrack*2000+1+recnum*20]= (float)m_bOutputInfo[i] ;  // seperated object number
//				CDebug::dprintf(" %d the number of seperated objects : %d \n",i, m_bOutputInfo[i]);
				m_fObjectInfo[m_iCurrentTrack*2000+2+recnum*20]= totalnum; // size of an object
				m_fObjectInfo[m_iCurrentTrack*2000+3+recnum*20]= (float)recnum ; //a position of m_crRectangleAll
				m_fObjectInfo[m_iCurrentTrack*2000+4+recnum*20]= rm ;	// v
				m_fObjectInfo[m_iCurrentTrack*2000+5+recnum*20]= gm ;	// u	
				m_fObjectInfo[m_iCurrentTrack*2000+6+recnum*20]= bm ;	// y
				m_fObjectInfo[m_iCurrentTrack*2000+7+recnum*20]= rsd ;	// v
				m_fObjectInfo[m_iCurrentTrack*2000+8+recnum*20]= gsd ;	// u
				m_fObjectInfo[m_iCurrentTrack*2000+9+recnum*20]= bsd ;	// y
				m_fObjectInfo[m_iCurrentTrack*2000+10+recnum*20]= (float)((bottom+top)/2.) ;	 //y center
				m_fObjectInfo[m_iCurrentTrack*2000+11+recnum*20]= 255. ;	 // tracking information 0: is not tracked.
				m_fObjectInfo[m_iCurrentTrack*2000+12+recnum*20]= 1. ;

				for (int iii=0; iii<20; iii++)
					m_fObjectColor[m_iCurrentTrack*2000 + iii + recnum*20]=0.;

				m_crObjectPosition[m_iCurrentTrack*100+ recnum].left = m_crRectangleAll[recnum].left;
				m_crObjectPosition[m_iCurrentTrack*100+ recnum].right = m_crRectangleAll[recnum].right;
				m_crObjectPosition[m_iCurrentTrack*100+ recnum].top = top;// m_crRectangleAll[recnum].top;
				m_crObjectPosition[m_iCurrentTrack*100+ recnum].bottom = bottom;//m_crRectangleAll[recnum].bottom;


				}
		//		else CDebug::dprintf("*********************************88\n");
				recnum++;
			}
		}
		else 
		{
//			CDebug::dprintf("stop    delete after %i\n", recnum);
			i=256;
			for ( loop=recnum; loop<100; loop++) m_fObjectInfo[m_iCurrentTrack*2000+ 2+ loop*20]=0;
		}
	}
}


void	GrimsonBG::FindBestMatching2(CDC* pDC, int upperx, int uppery)
{
	int past = (m_iCurrentTrack +9)%10;
	COLORREF tempRGB;
	float	total=0, total1, total2, total3, total4, overlap, comsize, min, min_s=10, centxc, centxp, centyc, centyp;
	int	maxpos=0, tt;
	float min0, min1, min2, minpos0, minpos1, minpos2;
	float ResultScore[100*6]; 
	int ResultPos=10000;

	CPen pen, *oldpen;
	for (int p=0; p<100; p++)  // for past objects
	{
		//if ((m_fObjectInfo[m_iCurrentTrack*2000+2 + i*20] >0 ) && (m_iCurrentTrack>=0))
		
		if ((m_fObjectInfo[past*2000+2 + p*20] >0 ) && (m_iCurrentTrack>=0))
		{
			min= 100000;
			maxpos=100000;
			ResultPos=10000;
			for (int c=0; c<100; c++)  // for current objects
			{
				total=min;
			//	if (m_fObjectInfo[past*2000+2 + j*20]>0)
				if (m_fObjectInfo[m_iCurrentTrack*2000+2 + c*20]>0)
				{
				total=0.;
				total1=0.;
				total2=0.;
				overlap=0.;

					for ( int su=4; su<=5; su++)
						total1 = total1 + 10*(m_fObjectInfo[past*2000+su + p*20] - m_fObjectInfo[m_iCurrentTrack*2000+su+ c*20])*(m_fObjectInfo[past*2000+su + p*20] - m_fObjectInfo[m_iCurrentTrack*2000+su+ c*20]);	

					for ( su=7; su<=8; su++)
						total2 = total2 + 10*(m_fObjectInfo[past*2000+su + p*20] - m_fObjectInfo[m_iCurrentTrack*2000+su+ c*20])*(m_fObjectInfo[past*2000+su + p*20] - m_fObjectInfo[m_iCurrentTrack*2000+su+ c*20]);	

				//	total=total1+total2;
				//	total= total1;

					overlap = ComputeOverlappedRegion(c, p);
					total = 1- overlap;
				//	total = total + (1-overlap)*5;
				//	total = total *( 1 - overlap);
					if (m_fObjectInfo[m_iCurrentTrack*2000+2+ c*20] >= m_fObjectInfo[past*2000+2+ p*20]) comsize= m_fObjectInfo[m_iCurrentTrack*2000+2+ c*20]/m_fObjectInfo[past*2000+2+ p*20];
					else 
						comsize= m_fObjectInfo[past*2000+2+ p*20]/m_fObjectInfo[m_iCurrentTrack*2000+2+ c*20];


					centxp= (float)((m_crObjectPosition[past*100+ p].left+ m_crObjectPosition[past*100+ p].right)/2.);
					centxc= (float)((m_crObjectPosition[m_iCurrentTrack*100+ c].left+ m_crObjectPosition[m_iCurrentTrack*100+ c].right)/2.);
					centyp= (float)((m_crObjectPosition[past*100+ p].top+ m_crObjectPosition[past*100+ p].bottom)/2.);
					centyc= (float)((m_crObjectPosition[m_iCurrentTrack*100+ c].top+ m_crObjectPosition[m_iCurrentTrack*100+ c].bottom)/2.);

					ResultScore[ c*6 +0]=total1;
					ResultScore[ c*6 +1]=total2;
					ResultScore[ c*6 +2]=1 -overlap;
					ResultScore[ c*6 +3]=comsize;
					ResultScore[ c*6 +4]=(float)fabs(centxp-centxc);
					ResultScore[ c*6 +5]=(float)fabs(centyp-centyc);
					ResultPos=c;

				}
				else c=100;

				min1=min2=min0=1000000;
				minpos0=minpos1=minpos2= 1000;

			if (ResultPos != 10000)
			{
				for (int x =0; x<=ResultPos; x++)
				{
					if ( (ResultScore[x*6 +3] <3 ) && (ResultScore[x*6+4]<30) && (ResultScore[x*6+5]<50 ))
					{
							if ( ResultScore[x*6 + 0] <= min0 )
							{
								minpos0=x;
								min0= (int)ResultScore[x*6 + 0];
							}
							if ( ResultScore[x*6 + 1] <= min1 )
							{
								minpos1=x;
								min1= (int)ResultScore[x*6 + 1];
							}
							if ( ResultScore[x*6 + 2] <= min2 ) 
							{
								minpos2=x;
								min2= (int)ResultScore[x*6 + 2];
							}
					}
				}
				if (minpos0 == minpos1)
				{
					maxpos = minpos0;
					min = min0;
				}
				else if (minpos1 == minpos2)
				{
					maxpos = minpos1;
					min = min1;
				}
				else if (minpos0 == minpos2)
				{
					maxpos = minpos0;
					min = min0;
				}
				else // there is no matching which is satisified by two conditions.
				{
					//CDebug::dprintf(" Probably Error !");
				}
				//CDebug::dprintf(" Selected current object: %d th object \n", maxpos);
			}

			}

			if ( (min <= 100 ) )	// Draw Line from past object to current object
			{

		//		if ( (m_fObjectInfo[past * 2000 + 12 + p*20] >1.) && (m_fObjectInfo[m_iCurrentTrack*2000 + 1 + maxpos*20] >0))
		//		{
		//			AfxMessageBox("ddd");

		//		}
				
// below source is modified at 12/02/01

				tt = (int) m_fObjectInfo[past*2000+11+p*20];
				if (tt == 255) // if object first appeared, ignore the first appearance.
				{
					
					m_fObjectInfo[m_iCurrentTrack*2000+11+maxpos*20]= (float)m_iColorIndexV;
					m_fObjectInfo[past*2000+11+p*20]= (float)m_iColorIndexV;
					tempRGB = ColorIndexRGB(tt);
					pen.CreatePen(PS_SOLID, 2, tempRGB);
					DisplayBackgroundWithObject(pDC, tempRGB, maxpos);

					m_fObjectColor[m_iCurrentTrack*2000 + 0 + maxpos*20]= 1.;
					m_fObjectColor[m_iCurrentTrack*2000 + 2 + maxpos*20]= m_fObjectInfo[m_iCurrentTrack*2000 + 4 + maxpos*20];  // the mean of V
					m_fObjectColor[m_iCurrentTrack*2000 + 3 + maxpos*20]= m_fObjectInfo[m_iCurrentTrack*2000 + 5 + maxpos*20];	// the mean of U
					m_fObjectColor[m_iCurrentTrack*2000 + 4 + maxpos*20]= m_fObjectInfo[m_iCurrentTrack*2000 + 7 + maxpos*20];	// the Standard deviation of V
					m_fObjectColor[m_iCurrentTrack*2000 + 5 + maxpos*20]= m_fObjectInfo[m_iCurrentTrack*2000 + 8 + maxpos*20];	// the Standard deviation of U
				}

//					CDebug::dprintf(" inside if ColorIndex %d\n", m_iColorIndexV);

				else
				{
					if (m_fObjectInfo[m_iCurrentTrack*2000 + 11 + maxpos *20] == 255) 
					{
						if (m_fObjectInfo[past * 2000 + 12 + p*20] ==1.)
						{
							m_fObjectInfo[m_iCurrentTrack*2000+11+maxpos*20]= m_fObjectInfo[past*2000+11+p*20];
							tempRGB = ColorIndexRGB(tt);
							pen.CreatePen(PS_SOLID, 2, tempRGB);
							DisplayBackgroundWithObject(pDC, tempRGB, maxpos);
						//	CDebug::dprintf(" 12: %f, 13: %f, 14: %f, 15: %f \n", m_fObjectColor[m_iCurrentTrack*2000 + 12 + maxpos*20], m_fObjectColor[m_iCurrentTrack*2000 + 13 + maxpos*20], m_fObjectColor[m_iCurrentTrack*2000 + 14 + maxpos*20], m_fObjectColor[m_iCurrentTrack*2000 + 15 + maxpos*20]);
						//	CDebug::dprintf(" ****** %f \n", m_fObjectColor[past*2000 + 0 + p*20]);
							m_fObjectColor[m_iCurrentTrack*2000 + 0 + maxpos*20]= m_fObjectColor[past*2000 + 0 + p*20]+1.;
							m_fObjectColor[m_iCurrentTrack*2000 + 2 + maxpos*20]= 
								( m_fObjectInfo[past*2000 + 4 + p*20]* m_fObjectColor[past*2000 + 0 + p*20] + m_fObjectInfo[m_iCurrentTrack*2000 + 4 + maxpos*20])/m_fObjectColor[m_iCurrentTrack*2000 + 0 + maxpos*20];  // the mean of V
							m_fObjectColor[m_iCurrentTrack*2000 + 3 + maxpos*20]= 
								( m_fObjectInfo[past*2000 + 5 + p*20]* m_fObjectColor[past*2000 + 0 + p*20] + m_fObjectInfo[m_iCurrentTrack*2000 + 5 + maxpos*20])/m_fObjectColor[m_iCurrentTrack*2000 + 0 + maxpos*20];	// the mean of U
							m_fObjectColor[m_iCurrentTrack*2000 + 4 + maxpos*20]= 
								( m_fObjectInfo[past*2000 + 7 + p*20]* m_fObjectColor[past*2000 + 0 + p*20] + m_fObjectInfo[m_iCurrentTrack*2000 + 7 + maxpos*20])/m_fObjectColor[m_iCurrentTrack*2000 + 0 + maxpos*20];	// the Standard deviation of V
							m_fObjectColor[m_iCurrentTrack*2000 + 5 + maxpos*20]= 
								( m_fObjectInfo[past*2000 + 8 + p*20]* m_fObjectColor[past*2000 + 0 + p*20] + m_fObjectInfo[m_iCurrentTrack*2000 + 8 + maxpos*20])/m_fObjectColor[m_iCurrentTrack*2000 + 0 + maxpos*20];	// the Standard deviation of U
//							CDebug::dprintf(" ***** 2: %f, 3: %f, 4: %f, 5: %f \n", m_fObjectColor[m_iCurrentTrack*2000 + 2 + maxpos*20], m_fObjectColor[m_iCurrentTrack*2000 + 3 + maxpos*20], m_fObjectColor[m_iCurrentTrack*2000 + 4 + maxpos*20], m_fObjectColor[m_iCurrentTrack*2000 + 5 + maxpos*20]);
						}
						else 
						{
							if (m_fObjectInfo[m_iCurrentTrack*2000 + 1 + maxpos*20]==1)
							{
							//	AfxMessageBox("xxx");
								m_fObjectInfo[m_iCurrentTrack*2000 + 11 + maxpos*20] = m_fObjectInfo[past*2000 + 11 + p*20];
								m_fObjectInfo[m_iCurrentTrack*2000 + 12 + maxpos*20] = m_fObjectInfo[past*2000 + 12 + p*20];
								m_fObjectInfo[m_iCurrentTrack*2000 + 13 + maxpos*20] = m_fObjectInfo[past*2000 + 13 + p*20];
								tempRGB = ColorIndexRGB((int)m_fObjectInfo[past*2000 + 11 + p*20]);
								DisplayBackgroundWithObject(pDC, tempRGB, maxpos);
								tempRGB = ColorIndexRGB((int)m_fObjectInfo[past*2000 + 13 + p*20]);
								DisplayBackgroundWithObject(pDC, tempRGB, maxpos);
								pen.CreatePen(PS_SOLID, 2, tempRGB);
	
								// Copy data from previous data.
								m_fObjectColor[m_iCurrentTrack*2000 + 0 + maxpos*20]= m_fObjectColor[past*2000 + 0 + p*20];
								m_fObjectColor[m_iCurrentTrack*2000 + 2 + maxpos*20]= m_fObjectColor[past*2000 + 2 + p*20];
								m_fObjectColor[m_iCurrentTrack*2000 + 3 + maxpos*20]= m_fObjectColor[past*2000 + 3 + p*20];
								m_fObjectColor[m_iCurrentTrack*2000 + 4 + maxpos*20]= m_fObjectColor[past*2000 + 4 + p*20];
								m_fObjectColor[m_iCurrentTrack*2000 + 5 + maxpos*20]= m_fObjectColor[past*2000 + 5 + p*20];

								m_fObjectColor[m_iCurrentTrack*2000 + 10 + maxpos*20]= m_fObjectColor[past*2000 + 10 + p*20];
								m_fObjectColor[m_iCurrentTrack*2000 + 12 + maxpos*20]= m_fObjectColor[past*2000 + 12 + p*20];
								m_fObjectColor[m_iCurrentTrack*2000 + 13 + maxpos*20]= m_fObjectColor[past*2000 + 13 + p*20];
								m_fObjectColor[m_iCurrentTrack*2000 + 14 + maxpos*20]= m_fObjectColor[past*2000 + 14 + p*20];
								m_fObjectColor[m_iCurrentTrack*2000 + 15 + maxpos*20]= m_fObjectColor[past*2000 + 15 + p*20];
							}
							else // this occurs when the object is splitting.
							{	// Final case;

//								CDebug::dprintf(" 2: %f, 3: %f, 4: %f, 5: %f \n", m_fObjectColor[past*2000 + 2 + p*20], m_fObjectColor[past*2000 + 3 + p*20], m_fObjectColor[past*2000 + 4 + p*20], m_fObjectColor[past*2000 + 5 + p*20]);
//								CDebug::dprintf(" 12: %f, 13: %f, 14: %f, 15: %f \n", m_fObjectColor[past*2000 + 12 + p*20], m_fObjectColor[past*2000 + 13 + p*20], m_fObjectColor[past*2000 + 14 + p*20], m_fObjectColor[past*2000 + 15 + p*20]);

								for (int llll=0; llll<2; llll++)
								{

									for (int ccc=0; ccc<100; ccc++)  // for current objects
									{
									
										//	if (m_fObjectInfo[past*2000+2 + j*2

⌨️ 快捷键说明

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