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

📄 seqprocessdlg.cpp

📁 在人脸检测的基础之上,对嘴部的运动表情进行分析,进行语音模拟.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
							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 + -