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