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;i 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-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;i lpBuf_copy+i*xsize+j); } } avg_gray_whole=avg_gray_whole/(xsize*ysize); for (i=0;i lpBuf_copy+i*ysize+j)-avg_gray_whole)*(*(pDoc->lpBuf_copy+i*ysize+j)-avg_gray_whole); } } Std=sqrt(Std/(xsize*ysize)); for (i=0;i lpBuf_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;i lpBuf+(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_curvature threshold_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;i 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_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]