www.pudn.com > MySee_Snake.rar > MySeeView.cpp


// MySeeView.cpp : implementation of the CMySeeView class 
// 
 
#include "stdafx.h" 
 
#include 	//Luo added 2006.11.15 
 
#include "MySee.h" 
 
#include "MySeeDoc.h" 
#include "MySeeView.h" 
#include "math.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CMySeeView 
 
IMPLEMENT_DYNCREATE(CMySeeView, CView) 
 
BEGIN_MESSAGE_MAP(CMySeeView, CView) 
	//{{AFX_MSG_MAP(CMySeeView) 
	ON_WM_PAINT() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_MOUSEMOVE() 
	ON_WM_LBUTTONUP() 
	ON_COMMAND(ID_SNAKE, OnSnake) 
	//}}AFX_MSG_MAP 
	// Standard printing commands 
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CMySeeView construction/destruction 
 
CMySeeView::CMySeeView() 
{ 
	m_ptOrigin=0; 
	m_bDraw=FALSE; 
	// TODO: add construction code here 
} 
 
CMySeeView::~CMySeeView() 
{ 
} 
 
BOOL CMySeeView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMySeeView drawing 
 
void CMySeeView::OnDraw(CDC* pDC) 
{ 
	CMySeeDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	// TODO: add draw code for native data here 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMySeeView printing 
 
BOOL CMySeeView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
//DEL void CMySeeView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
//DEL { 
//DEL 	// TODO: add extra initialization before printing 
//DEL } 
 
void CMySeeView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CMySeeView diagnostics 
 
#ifdef _DEBUG 
void CMySeeView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CMySeeView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CMySeeDoc* CMySeeView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMySeeDoc))); 
	return (CMySeeDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CMySeeView message handlers 
 
void CMySeeView::OnPaint() 
{ 
	CPaintDC dc(this); 
	//得到文档指针 
	CMySeeDoc*pDoc=GetDocument(); 
	ASSERT_VALID(pDoc); 
	//是否已打开一个BMP文件 
	if (pDoc->flag==1) 
	{ 
         
	//	CPoint GetCurrenPosition(); 
 
		SetDIBitsToDevice(dc.m_hDC,//DIB将要输出的设备描述表 
			0,						//描述表中的位图输出起始X坐标 
			0,						//。。。。。。。。。。。Y。。 
			pDoc->bi.biWidth,	//DIB宽度 
			pDoc->bi.biHeight,	//。。高度 
			0,							//DIB开始读取输出的像素的数据的X位置 
			0,							//。。。。。。。。。。。。。。Y。。。 
			0,							//DIB中像素的水平行号,对应lpBits内存缓冲区的第一行数据 
			pDoc->bi.biHeight,	//DIB行数 
			pDoc->lpBuf,	//包含像素数据的内存缓冲区的指针 
			pDoc->pbi,					//指向初始化了的BITMAPINFO数据结构的指针 
										//描述位图大小和色彩数据 
			DIB_RGB_COLORS);			//指定显示的颜色 
		 
	} 
	Invalidate(FALSE);	 
	 
} 
void CMySeeView::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
//    MessageBox("dfd"); 
	m_ptOrigin=point; 
	m_bDraw=TRUE; 
 
	CView::OnLButtonDown(nFlags, point); 
} 
 
 
 
void CMySeeView::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	// TODO: Add your command handler code here 
	//得到文档指针 
	CMySeeDoc*pDoc=GetDocument(); 
	ASSERT_VALID(pDoc); 
	// 
 
//	CPoint p[2000]; 
	CClientDC dc(this); 
	CPen pen(PS_SOLID,1,RGB(0,255,0)); 
	CPen *poldPen=dc.SelectObject(&pen); 
	static int i=0; 
//	int j; 
    if(m_bDraw==TRUE) 
	{ 
		dc.MoveTo(m_ptOrigin); 
		dc.LineTo(point); 
		m_ptOrigin=point; 
		Snake_points[i] = dc.GetCurrentPosition(); 
		Gray[i]=*(pDoc->lpBuf+(pDoc->bi.biHeight-Snake_points[i].y)*pDoc->bi.biWidth+Snake_points[i].x); 
		*(pDoc->lpBuf+(pDoc->bi.biHeight-Snake_points[i].y)*pDoc->bi.biWidth+Snake_points[i].x)=255; 
		i++; 
	} 
	no_of_snake_points=i; 
	dc.SelectObject(poldPen); 
	CView::OnMouseMove(nFlags, point); 
 
	/////////////////////////////////////////// 
 
	/////////////////////////////////////////// 
	 
 
} 
 
void CMySeeView::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	m_bDraw=FALSE; 
	CView::OnLButtonUp(nFlags, point); 
} 
 
void CMySeeView::OnSnake()  
{ 
	// TODO: Add your command handler code here 
	//得到文档指针 
	CMySeeDoc*pDoc=GetDocument(); 
	ASSERT_VALID(pDoc); 
	// 
	int xsize=pDoc->bi.biWidth,ysize=pDoc->bi.biHeight; 
 
	m_Rows = ysize;	//Luo added 2006.11.15 
	m_Cols = xsize;	//Luo added 2006.11.15 
 
	bool flag_change; 
	int movement,i,j,iteration=0;  //初始化迭代次数 
	int Max_Iterations=300; 
	double avg_distance=0.0, max_curvature;//平均距离为0,最大曲率 
	CPoint temp; 
	double *curvature;	//曲率 
	double avg_gray_whole=0;//整图平均灰度 
	double Std=0;//方差 
	alpha=new double[no_of_snake_points]; 
	beta=new double[no_of_snake_points]; 
	gamma=new double[no_of_snake_points]; 
	curvature=new double[no_of_snake_points]; 
	termination_point=false; 
	threshold_curvature=0.9;  
	threshold_movement=1000000; 
 
	avg_gray=new double[no_of_snake_points];//每个SNAKE点的邻域平均灰度 
 
	//sobel	 
	grad_mag = new int*[ysize]; 
	for (i=0;ilpBuf_copy+(i+1)*xsize+(j-1))+2*(*(pDoc->lpBuf_copy+(i+1)*xsize+j))+*(pDoc->lpBuf_copy+(i+1)*xsize+(j+1))) 
					-(*(pDoc->lpBuf_copy+(i-1)*xsize+(j-1))+2*(*(pDoc->lpBuf_copy+(i-1)*xsize+j))+*(pDoc->lpBuf_copy+(i-1)*xsize+(j+1)))) 
					+(((*(pDoc->lpBuf_copy+(i-1)*xsize+(j+1))+2*(*(pDoc->lpBuf_copy+i*xsize+(j+1)))+*(pDoc->lpBuf_copy+(i+1)*xsize+(j+1)))) 
					-((*(pDoc->lpBuf_copy+(i-1)*xsize+(j-1))+2*(*(pDoc->lpBuf_copy+i*xsize+(j-1)))+*(pDoc->lpBuf_copy+(i+1)*xsize+(j-1))))); 
			} 
		 
 
	for(i=0;ilpBuf_copy+i*xsize+j); 
			} 
		} 
		avg_gray_whole=avg_gray_whole/(xsize*ysize); 
 
		for (i=0;ilpBuf_copy+i*ysize+j)-avg_gray_whole)*(*(pDoc->lpBuf_copy+i*ysize+j)-avg_gray_whole); 
			} 
		} 
		Std=sqrt(Std/(xsize*ysize)); 
	 
		for (i=0;ilpBuf_copy+(ysize-Snake_points[i].y)*xsize+Snake_points[i].x)+ 
						*(pDoc->lpBuf_copy+((ysize-Snake_points[i].y)-1)*xsize+(Snake_points[i].x-1))+ 
						*(pDoc->lpBuf_copy+((ysize-Snake_points[i].y)-1)*xsize+Snake_points[i].x)+ 
						*(pDoc->lpBuf_copy+((ysize-Snake_points[i].y)-1)*xsize+(Snake_points[i].x+1))+ 
						*(pDoc->lpBuf_copy+((ysize-Snake_points[i].y))*xsize+(Snake_points[i].x-1))+ 
						*(pDoc->lpBuf_copy+((ysize-Snake_points[i].y))*xsize+(Snake_points[i].x+1))+ 
						*(pDoc->lpBuf_copy+((ysize-Snake_points[i].y)+1)*xsize+(Snake_points[i].x-1))+ 
						*(pDoc->lpBuf_copy+((ysize-Snake_points[i].y)+1)*xsize+(Snake_points[i].x))+ 
						*(pDoc->lpBuf_copy+((ysize-Snake_points[i].y)+1)*xsize+(Snake_points[i].x+1)))/9; 
		} 
		for(i=0;ilpBuf+(ysize-Snake_points[i].y)*xsize+Snake_points[i].x)=Gray[i]; 
				Snake_points[i]=temp;//原来的 
				Gray[i]=*(pDoc->lpBuf+Snake_points[i].y*xsize+Snake_points[i].x); 
 				*(pDoc->lpBuf+(pDoc->bi.biHeight-Snake_points[i].y)*xsize+Snake_points[i].x)=255; 
				movement++;//原来的 
				////////////////////////////////////////////// 
			} 
			 
			curvature[i]=find_curvature(i, Snake_points[i]); 
			if(max_curvaturethreshold_curvature&&curvature[i]>curvature[(i+1)%no_of_snake_points]&&curvature[i]>curvature[(i-1+no_of_snake_points)%no_of_snake_points]) 
				*(beta+i)=0; 
		} 
		iteration++; 
		if(iteration>Max_Iterations) 
			termination_point=true; 
	} 
	delete alpha; 
	delete beta; 
	delete gamma; 
	delete curvature; 
	delete avg_gray; 
	 
} 
 
double CMySeeView::find_distance(int no, CPoint point) 
{ 
	int x=no_of_snake_points; 
	point-=Snake_points[(no-1+x)%x]; 
	return(sqrt(point.x*point.x+point.y*point.y)); 
} 
 
double CMySeeView::find_curvature(int no, CPoint point) 
{ 
	int x=no_of_snake_points; 
	point=Snake_points[(no-1+x)%x]-point-point+Snake_points[(no+1)%x]; 
	return(point.x*point.x+point.y*point.y); 
} 
 
double CMySeeView::find_continuity(int no, CPoint point, double avg_distance) 
{ 
	return(pow(avg_distance-find_distance(no,point),2)); 
} 
 
double CMySeeView::find_ext_energy(int no, CPoint point) 
{ 
	int i; 
	CPoint mid_point_of_snake; 
	mid_point_of_snake.x=0,mid_point_of_snake.y=0; 
	for (i=0;ibi.biWidth,ysize=pDoc->bi.biHeight; 
	m_Rows = ysize;	 
	m_Cols = xsize;	 
 
	CPoint p, min_point; 
	double max_curvature, max_continuity, max_internal, min_internal, min_energy, energy,max_energy1,min_energy1; 
	double curvatures[5][5]; 
	double continuities[5][5]; 
	double energy1[5][5]; //add 
	double internal_energies[5][5]; 
	int i,j, limit=1; 
	max_curvature=max_continuity=max_internal=max_energy1=-1000000000000.0; 
	min_internal=min_energy1=1000000000000.0; 
	if(!neighbor3by3) 
		limit++; 
	for(i=-limit;i<=limit;i++) 
	{ 
		p.y=point.y+i; 
		if(p.y<0) 
			p.y=0; 
		if(p.y>=m_Rows) 
			p.y=m_Rows-1; 
		for(j=-limit;j<=limit;j++) 
		{ 
			p.x=point.x+j; 
			if(p.x<0) 
				p.x=0; 
			if(p.x>=m_Cols) 
				p.x=m_Cols-1; 
			curvatures[i+limit][j+limit]=find_curvature(no, p); //This code can cause problem near 
			continuities[i+limit][j+limit]=find_continuity(no,p,avg_distance);	//border of image 
			 
			energy1[i+limit][j+limit]=find_ext_energy(no,p);//add 
			 
			internal_energies[i+limit][j+limit]=(double)grad_mag[p.y][p.x]; 
			if(curvatures[i+limit][j+limit]>max_curvature) 
				max_curvature=curvatures[i+limit][j+limit]; 
			if(continuities[i+limit][j+limit]>max_continuity) 
				max_continuity=continuities[i+limit][j+limit]; 
 
 
            if(energy1[i+limit][j+limit]>max_energy1)  //add 
				max_energy1=energy1[i+limit][j+limit];//add 
            if(energy1[i+limit][j+limit]max_internal) 
				max_internal=internal_energies[i+limit][j+limit]; 
			if(internal_energies[i+limit][j+limit]bi.biWidth,ysize=pDoc->bi.biHeight; 
	m_Rows = ysize;	 
	m_Cols = xsize;	 
 
	CPoint p, min_point; 
	double max_curvature, max_continuity, max_internal, min_internal, min_energy, energy/*,max_energy*/; 
	double curvatures[5][5]; 
	double continuities[5][5]; 
	double internal_energies[5][5]; 
	int i,j, limit=1; 
	max_curvature=max_continuity=max_internal=/*max_energy=*/-1000000000000.0; 
	min_internal=1000000000000.0; 
	if(!neighbor3by3) 
		limit++; 
	for(i=-limit;i<=limit;i++) 
	{ 
		p.y=point.y+i; 
		if(p.y<0) 
			p.y=0; 
		if(p.y>=m_Rows) 
			p.y=m_Rows-1; 
		for(j=-limit;j<=limit;j++) 
		{ 
			p.x=point.x+j; 
			if(p.x<0) 
				p.x=0; 
			if(p.x>=m_Cols) 
				p.x=m_Cols-1; 
			curvatures[i+limit][j+limit]=find_curvature(no, p); //This code can cause problem near 
			continuities[i+limit][j+limit]=find_continuity(no,p,avg_distance);	//border of image 
        	internal_energies[i+limit][j+limit]=(double)grad_mag[p.y][p.x]; 
			if(curvatures[i+limit][j+limit]>max_curvature) 
				max_curvature=curvatures[i+limit][j+limit]; 
			if(continuities[i+limit][j+limit]>max_continuity) 
				max_continuity=continuities[i+limit][j+limit]; 
            if(internal_energies[i+limit][j+limit]>max_internal) 
				max_internal=internal_energies[i+limit][j+limit]; 
			if(internal_energies[i+limit][j+limit]