📄 seqprocessdlg.cpp
字号:
temp->next->red=imgPrev(current_point.y,current_point.x);
}
else
{
temp->next->red=imgPrev(current_point.y,current_point.x,0);
temp->next->green=imgPrev(current_point.y,current_point.x,1);
temp->next->blue=imgPrev(current_point.y,current_point.x,2);
}
temp=temp->next;
}
dc.SetPixel(scale*current_point.x+xPosWindow,scale*current_point.y+yPosWindow,RGB(0,255,0));
mat_saved(current_point.y,current_point.x,0)=0;
mat_saved(current_point.y,current_point.x,1)=255;
mat_saved(current_point.y,current_point.x,2)=0;
current_point=graph_array[0][current_point.y][current_point.x].parent->pixel;
}
temp->next=NULL;
}
else
{
free_point.x=m_posX;
free_point.y=m_posY;
temp=first;
while(temp!=NULL)
{
if(imgPrev.numbands==1)
{
dc.SetPixel(scale*temp->pixel.x+xPosWindow,scale*temp->pixel.y+yPosWindow,RGB(temp->red,temp->red,temp->red));
mat_saved(temp->pixel.y,temp->pixel.x,0)=temp->red;
mat_saved(temp->pixel.y,temp->pixel.x,1)=temp->red;
mat_saved(temp->pixel.y,temp->pixel.x,2)=temp->red;
}
else
{
dc.SetPixel(scale*temp->pixel.x+xPosWindow,scale*temp->pixel.y+yPosWindow,RGB(temp->red,temp->green,temp->blue));
mat_saved(temp->pixel.y,temp->pixel.x,0)=temp->red;
mat_saved(temp->pixel.y,temp->pixel.x,1)=temp->green;
mat_saved(temp->pixel.y,temp->pixel.x,2)=temp->blue;
}
temp1=temp;
temp=temp->next;
delete temp1;
}
new_elem=new Live_wire_elem;
first=new_elem;
first->pixel=free_point;
if(imgPrev.numbands==1)
{
first->red=imgPrev(free_point.y,free_point.x);
}
else
{
first->red=imgPrev(free_point.y,free_point.x,0);
first->green=imgPrev(free_point.y,free_point.x,1);
first->blue=imgPrev(free_point.y,free_point.x,2);
}
first->next=NULL;
current_point=free_point;
temp=first;
while(graph_array[0][current_point.y][current_point.x].parent!=NULL)
{
if(current_point!=free_point)
{
new_elem=new Live_wire_elem;
temp->next=new_elem;
temp->next->pixel=current_point;
if(imgPrev.numbands==1)
{
temp->next->red=imgPrev(current_point.y,current_point.x);
}
else
{
temp->next->red=imgPrev(current_point.y,current_point.x,0);
temp->next->green=imgPrev(current_point.y,current_point.x,1);
temp->next->blue=imgPrev(current_point.y,current_point.x,2);
}
temp=temp->next;
}
dc.SetPixel(scale*current_point.x+xPosWindow,scale*current_point.y+yPosWindow,RGB(0,255,0));
mat_saved(temp->pixel.y,temp->pixel.x,0)=0;
mat_saved(temp->pixel.y,temp->pixel.x,1)=255;
mat_saved(temp->pixel.y,temp->pixel.x,2)=0;
current_point=graph_array[0][current_point.y][current_point.x].parent->pixel;
}
temp->next=NULL;
}
}
}
UpdateData(FALSE);
CDialog::OnMouseMove(nFlags, point);
}
//-------------------------------------------------------------
void CSeqProcessDlg::OnDenemeProcessImage()
{
// TODO: Add your command handler code here
int n_kernel1,n_kernel2,i,j,k,fr,frame,boun_th;
double weight;
matrix imgPrev;
// Convert frame 1 from dib to matrix
boun_th=1500;
seed_point.x=-1;
seed_point.y=-1;
seed_point2.x=-1;
seed_point2.y=-1;
free_point.x=-1;
free_point.y=-1;
finish=false;
first=NULL;
for(i=0;i<20;i++)
{
seed_array[i].x=-1;
seed_array[i].y=-1;
}
ConvertDib2Mat( imgPrev, dibSeq[0]);
CString info, message = "";
matrix imgNext=matrix(imgPrev.ysize,imgPrev.xsize,1);
matrix Mag_cost1=matrix(imgPrev.ysize,imgPrev.xsize,1);
matrix Ix_1=matrix(imgPrev.ysize,imgPrev.xsize,1);
matrix Iy_1=matrix(imgPrev.ysize,imgPrev.xsize,1);
static matrix mat=matrix(imgPrev.ysize,imgPrev.xsize,1);
double **temporary,**temp2;
if(imgPrev.numbands==3) mat_saved=imgPrev;
else
{
mat_saved=matrix(imgPrev.ysize,imgPrev.xsize,3);
for(i=0;i<imgPrev.ysize;i++)
for(j=0;j<imgPrev.xsize;j++)
{
mat_saved(i,j,0)=imgPrev(i,j);
mat_saved(i,j,1)=imgPrev(i,j);
mat_saved(i,j,2)=imgPrev(i,j);
}
}
UpdateData(TRUE);
n_kernel1=m_listSize1.GetCurSel();
n_kernel2=m_listSize2.GetCurSel();
weight=m_editWeight1;
// go to the first frame, to start motion estimation
currentFrame = 0;
// Update the slider display
m_currentframe = m_startframe;
m_sliderframe.SetPos(m_currentframe);
UpdateData(FALSE);
GradientMagnitude=new matrix[m_endframe-m_startframe+1];
LaplacianMap=new matrix[m_endframe-m_startframe+1];
graph_array=new Graph_elem**[m_endframe-m_startframe+1];
for (frame = m_startframe; frame <= m_endframe; frame++)
{
//if (frame > m_startframe)
//OnPlayNext();
fr = frame - m_startframe;
GradientMagnitude[fr]=mat;
ConvertDib2Mat( imgPrev, dibSeq[fr]); // Convert frame 1 from dib to matrix
imgNext=weight*Laplacian(imgPrev,(5+2*n_kernel1));
imgNext+=(1-weight)*Laplacian(imgPrev,(5+2*n_kernel2));
LaplacianMap[fr]=255*imgNext;
//LaplacianMap[fr]= CleanEdgeMap( LaplacianMap[fr], 0, 0,LaplacianMap[fr].xsize,LaplacianMap[fr].ysize , boun_th);
//info.Format("frame%d",frame);
//DrawMatrix(LaplacianMap[fr], 0, 0, 1, info);
//SaveAsBmp(LaplacianMap[fr],"lap.bmp");
graph_array[fr]=new Graph_elem*[imgPrev.ysize];
for(i=0;i<imgPrev.ysize;i++)
{
graph_array[fr][i]=new Graph_elem[imgPrev.xsize];
for(j=0;j<imgPrev.xsize;j++)
{
graph_array[fr][i][j].expand=false;
graph_array[fr][i][j].cumul_cost=-1;
graph_array[fr][i][j].listElem=NULL;
graph_array[fr][i][j].parent=NULL;
graph_array[fr][i][j].redraw=0;
graph_array[fr][i][j].pixel.x=j;
graph_array[fr][i][j].pixel.y=i;
for(k=0;k<9;k++) graph_array[fr][i][j].local_cost[k]=m_editLap*imgNext(i,j);
}
}
temporary=Gradient_Mag(imgPrev,GradientMagnitude[fr],(5+2*n_kernel1));
for(i=0;i<(imgPrev.ysize*imgPrev.xsize);i++)
{
Mag_cost1.elem[i]=temporary[0][i];
Ix_1.elem[i]=temporary[1][i];
Iy_1.elem[i]=temporary[2][i];
}
temp2=Gradient_Mag(imgPrev,GradientMagnitude[fr],(5+2*n_kernel2));
for(i=0;i<(imgPrev.ysize*imgPrev.xsize);i++)
{
if(temp2[0][i]>Mag_cost1.elem[i])
{
temp2[0][i]=m_editGradMag*Mag_cost1.elem[i];
temp2[1][i]=Ix_1.elem[i];
temp2[2][i]=Iy_1.elem[i];
}
else
temp2[0][i]=m_editGradMag*temp2[0][i];
}
for(i=0;i<imgPrev.ysize;i++)
for(j=0;j<imgPrev.xsize;j++)
{
Gradient_Dir(graph_array[fr][i][j].pixel,imgPrev.xsize,imgPrev.ysize,temp2,graph_array[fr][i][j].local_cost,m_editGradDir);
}
}
message = "Now you can start segmentation.";
MessageBox(message);
for(i=0;i<Max_cost+1;i++) index_array[i]=NULL;
cost_calculated=TRUE;
//DrawMatrix(imgNext, 0, 0, 1, "First image");*/
}
//---------------------------------------------------
void CSeqProcessDlg::OnButtonDeneme()
{
// TODO: Add your control notification handler code here
}
/*
//---------------------------------------------------
void CSeqProcessDlg::DrawMotionVectors( )
//---------------------------------------------------
{
if (VelX.xsize == 0 || VelY.xsize == 0)
return;
int x, y;
// Draw the motion vectors
// Create a DC object
CClientDC dc(this);
//Create a new pen (solid, 1 pixels, green)
CPen NewPen( PS_SOLID, 1, RGB(0, 255, 0) );
//Select the pen
dc.SelectObject(&NewPen);
for ( y = 0; y < m_height; y += 4)
{
for ( x = 0; x < m_width; x += 4)
{
dc.MoveTo( scale*x + XWINDOWPOS, scale*y + YWINDOWPOS);
dc.LineTo((int) (scale*x + XWINDOWPOS + scale*VelX(y,x) ),
(int) (scale*y + YWINDOWPOS + scale*VelY(y,x) ) );
}
}
}
*/
void CSeqProcessDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int i,j,m,index,k=0;
int x = point.x;
int y = point.y;
long int temp_cost=0;
CString info, message = "";
CPoint point_to_expand,point_activelist;
CClientDC dc(this);
CPen NewPen( PS_SOLID, 10, RGB(0, 255, 0) );
dc.SelectObject(&NewPen);
if( ! IsWithinImageDisplay( x, y) )
{
return;
}
FindImageCoordinates( x, y);
// m_posX, m_posY (double) now contain the image point
// coordinates. They are updated every time the mouse moves.
if((seed_point.x==-1) && (cost_calculated==FALSE))
{
return;
}
if((seed_point.x==-1) && (cost_calculated==TRUE))
{
finish=false;
seed_point.x=(long)m_posX;
seed_point.y=(long)m_posY;
seed_array[seed_count].x=(long)m_posX;
seed_array[seed_count].y=(long)m_posY;
seed_count++;
// seed_point=CursorSnap(seed_point,GradientMagnitude);
dc.SetPixel(point.x,point.y,RGB(0,255,0));
mat_saved(m_posY,m_posX,0)=0;
mat_saved(m_posY,m_posX,1)=255;
mat_saved(m_posY,m_posX,2)=0;
graph_array[0][seed_point.y][seed_point.x].expand=true;
graph_array[0][seed_point.y][seed_point.x].cumul_cost=0;
point_to_expand=seed_point;
do
{
m=0;
for(i=(point_to_expand.y-1);i<(point_to_expand.y+2);i++)
for(j=(point_to_expand.x-1);j<(point_to_expand.x+2);j++)
{
if((i>=0) && (j>=0) && (i<=GradientMagnitude[0].ysize-1) && (j<=GradientMagnitude[0].xsize-1))
{
point_activelist.y=i;
point_activelist.x=j;
if(graph_array[0][i][j].expand==false)
{
temp_cost=graph_array[0][point_to_expand.y][point_to_expand.x].cumul_cost;
temp_cost+=graph_array[0][point_to_expand.y][point_to_expand.x].local_cost[m];
if(graph_array[0][i][j].parent==NULL)
{
graph_array[0][i][j].cumul_cost=temp_cost;
graph_array[0][i][j].parent=&graph_array[0][point_to_expand.y][point_to_expand.x];
index=temp_cost & Max_cost;
//message.Format("%d %d %d %d",index,k,i,j);
//MessageBox(message);
index_array[index]=Add_Active_List(index_array[index],point_activelist);
graph_array[0][i][j].listElem=index_array[index];
}
else
{
if(temp_cost<graph_array[0][i][j].cumul_cost)
{
index=graph_array[0][i][j].cumul_cost & Max_cost;
graph_array[0][i][j].cumul_cost=temp_cost;
graph_array[0][i][j].parent=&graph_array[0][point_to_expand.y][point_to_expand.x];
Remove(graph_array[0][i][j].listElem,&index_array[index]);
point_activelist=graph_array[0][i][j].listElem->pixel;
delete graph_array[0][point_activelist.y][point_activelist.x].listElem;
graph_array[0][point_activelist.y][point_activelist.x].listElem=graph_array[0][i][j].listElem;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -