www.pudn.com > Palm.rar > PalmView.cpp


// PalmView.cpp : implementation of the CPalmView class 
// 
 
#include "stdafx.h" 
#include "Palm.h" 
#include "math.h" 
#include "PalmDoc.h" 
#include "PalmView.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CPalmView 
double * mbys(double * im,int imW,int imH,double *tp,int tpW,int tpH) 
{ 
	double * out=new double[imW*imH]; 
	memset(out, 0, imW*imH*sizeof(double)); 
	int i,j,m,n; 
	#define im(ROW,COL) im[imW*(ROW)+(COL)] 
	#define tp(ROW,COL) tp[tpW*(ROW)+(COL)] 
	#define out(ROW,COL) out[imW*(ROW)+(COL)] 
	double a; 
	for(i=0;iint(tpH/2) && iint(tpW/2) && jm_hDIB == NULL) 
		return ; 
	// TODO: add draw code for native data here 
	int i,j; 
    unsigned char *lpSrc; 
	LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->m_hDIB); 
	int cxDIB = (int) ::DIBWidth(lpDIB);         // Size of DIB - x 
	int cyDIB = (int) ::DIBHeight(lpDIB);        // Size of DIB - y 
	LPSTR lpDIBBits=::FindDIBBits (lpDIB); 
	// 计算图像每行的字节数 
	long lLineBytes = WIDTHBYTES(cxDIB * 8); 
	// 每行 
	for(i = 0; i < cyDIB; i++) 
	{ 
		// 每列 
		for(j = 0; j < cxDIB; j++) 
		{ 
			// 指向DIB第i行,第j个象素的指针 
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (cyDIB - 1 - i) + j; 
			// 计算新的灰度值 
			//*(lpSrc) = BYTE(255-*lpSrc); 
		} 
	} 
	::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
	CRect rect(0,0,cxDIB,cyDIB), rcDIB(0,0,cxDIB,cyDIB); 
	::PaintDIB(pDC->m_hDC, &rect, pDoc->m_hDIB, &rcDIB, pDoc->m_palDIB); 
 
	 
	 
	 
	 
		#define corner(ROW,COL) corner[cxDIB*(ROW)+(COL)] 
	 
	CPen* pPenRed = new CPen; 
	pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0)); 
 
	 
	pDC->SelectObject(pPenRed); 
	for(i = 0; i < cyDIB; i++) 
	{ 
		for(j = 0; j < cxDIB; j++) 
		{		if(pDoc->harris) 
				{ 
					if(pDoc->corner(i,j)) 
					{ 
					//在角点处划十字叉以标注 
					 
					pDC->MoveTo (j-5,i); 
					pDC->LineTo (j+6,i); 
					pDC->MoveTo (j,i-5); 
					pDC->LineTo (j,i+6); 
					pDC->MoveTo (j-5,i+1); 
					pDC->LineTo (j+6,i+1); 
					pDC->MoveTo (j+1,i-5); 
					pDC->LineTo (j+1,i+6); 
					} 
				} 
		} 
	} 
 
 
 
 
 
	// TODO: add draw code for native data here 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CPalmView printing 
 
BOOL CPalmView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CPalmView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CPalmView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CPalmView diagnostics 
 
#ifdef _DEBUG 
void CPalmView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CPalmView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CPalmDoc* CPalmView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPalmDoc))); 
	return (CPalmDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CPalmView message handlers 
 
void CPalmView::OnGaosi()  
{ 
	// TODO: Add your command handler code here 
	CPalmDoc* pDoc = GetDocument(); 
 
	//设定模板参数 
	double tem[9]={1,2,1, 
		           2,4,2, 
				   1,2,1}; 
 
    //设定模板系数 
    double  xishu = 0.0625;    
 
    //进行模板操作 
	pDoc->m_hDIB =::Template(pDoc->m_hDIB,tem ,3,3, xishu); 
 
	Invalidate(TRUE); 
} 
 
 
 
void CPalmView::OnWaveLet()  
{ 
	// TODO: Add your command handler code here 
	  int i,j; 
	int ii; 
	unsigned char *lpSrc; 
	CPalmDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	if(pDoc->m_hDIB == NULL) 
		return ; 
	double tmp; 
	//copy image into imagematrix and then recopy it from imagematrix  
	LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->m_hDIB); 
	LPSTR lpDIBBits=::FindDIBBits (lpDIB); 
	int cxDIB = (int) ::DIBWidth(lpDIB);         // Size of DIB - x 
	int cyDIB = (int) ::DIBHeight(lpDIB);        // Size of DIB - y 
	long lLineBytes = WIDTHBYTES(cxDIB * 8);     // 计算图像每行的字节数 
	double* imagematrix=new double[cyDIB*cxDIB]; 
	// 每行 
	for(i = 0; i < cyDIB; i++) 
	{ 
		// 每列 
		for(j = 0; j < cxDIB; j++) 
		{ 
			// 指向DIB第i行,第j个象素的指针 
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (cyDIB - 1 - i) + j; 
			 
			imagematrix[i+cxDIB*j]=*lpSrc; 
		} 
	} 
     
	//then we begin harr decompose in 1_D ,rowwisely//// 
	for(i=0;im_hDIB); 
			Invalidate(TRUE); 
} 
 
void CPalmView::OnReWaveLet()  
{ 
	// TODO: Add your command handler code here 
	 int i,j; 
    int ii; 
    unsigned char *lpSrc; 
    double tmp; 
	CPalmDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	if(pDoc->m_hDIB == NULL) 
		return ; 
	LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->m_hDIB); 
	LPSTR lpDIBBits=::FindDIBBits (lpDIB); 
	int cxDIB = (int) ::DIBWidth(lpDIB);         // Size of DIB - x 
	int cyDIB = (int) ::DIBHeight(lpDIB); 
	const int N=cxDIB*cyDIB; 
	long lLineBytes = WIDTHBYTES(cxDIB * 8);     // 计算图像每行的字节数 
	double* imagematrix=new double[cyDIB*cxDIB]; 
	//endowing values from lpSrc to Imagematrix 
	//the upperleft part of the image 
    for(i = 0; i < cyDIB/2; i++)//每行 
	{ 
		// 每列 
		for(j = 0; j < cxDIB/2; j++) 
		{ 
			// 指向DIB第i行,第j个象素的指针 
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (cyDIB - 1 - i) + j; 
			imagematrix[i+cxDIB*j]=*lpSrc; 
		} 
	} 
	 
	//the leftbottom part of the image 
	for(i=cxDIB/2;i255) 
							imagematrix[i+cxDIB*j]=255; 
				} 
				 
				//endowing values from imagematrix to lpSrc 
				for(i = 0; i < cyDIB; i++) 
					// 每列 
					for(j = 0; j < cxDIB; j++) 
					{ 
						// 指向DIB第i行,第j个象素的指针 
						lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (cyDIB - 1 - i) + j; 
						*lpSrc=int(imagematrix[i+cxDIB*j]); 
						 
					} 
					 
					::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
					Invalidate(TRUE); 
} 
 
void CPalmView::OnHarris()  
{ 
	// TODO: Add your command handler code here 
	CPalmDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	if(pDoc->m_hDIB == NULL) 
		return ; 
 
    pDoc->harris=true; 
 
	 
	int i,j,m,n,size,thresh,gausswidth; 
	double sigma; 
 
	//输入四个参数 
	 
	gausswidth =5; 
	sigma =0.8; 
	size =5; 
	thresh =700; 
	 
    unsigned char *lpSrc;//一个指向源、目的像素的移动指针 
	LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->m_hDIB); 
	int cxDIB = (int) ::DIBWidth(lpDIB);         // 图像宽度 
	int cyDIB = (int) ::DIBHeight(lpDIB);        // 图像高度 
	LPSTR lpDIBBits=::FindDIBBits (lpDIB); 
	long lLineBytes = WIDTHBYTES(cxDIB * 8);     // 计算灰度图像每行的字节数 
 
	//创建I、Ix、Ix2、Iy、Iy2、Ixy、cim、mx、corner数组 
	double *I=new double[cxDIB*cyDIB]; 
	double *Ix=new double[cxDIB*cyDIB]; 
	double *Ix2=new double[cxDIB*cyDIB]; 
	double *Iy=new double[cxDIB*cyDIB]; 
	double *Iy2=new double[cxDIB*cyDIB]; 
	double *Ixy=new double[cxDIB*cyDIB]; 
	double *cim=new double[cxDIB*cyDIB]; 
	double *mx=new double[cxDIB*cyDIB]; 
 
	pDoc->corner=new bool[cxDIB*cyDIB]; 
	memset(pDoc->corner, 0, cxDIB*cyDIB*sizeof(bool)); 
 
	//定义宏以方便访问元素 
	#define I(ROW,COL) I[cxDIB*(ROW)+(COL)] 
	#define Ix(ROW,COL) Ix[cxDIB*(ROW)+(COL)] 
	#define Ix2(ROW,COL) Ix2[cxDIB*(ROW)+(COL)] 
	#define Iy(ROW,COL) Iy[cxDIB*(ROW)+(COL)] 
	#define Iy2(ROW,COL) Iy2[cxDIB*(ROW)+(COL)] 
	#define Ixy(ROW,COL) Ixy[cxDIB*(ROW)+(COL)] 
	#define cim(ROW,COL) cim[cxDIB*(ROW)+(COL)] 
	#define mx(ROW,COL) mx[cxDIB*(ROW)+(COL)] 
	#define corner(ROW,COL) corner[cxDIB*(ROW)+(COL)] 
 
	//将图像灰度值复制到I中,这步很重要!想想为什么? 
	for(i = 0; i < cyDIB; i++) 
	{ 
		for(j = 0; j < cxDIB; j++) 
		{			 
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (cyDIB - 1 - i) + j; 
			//将256级灰度图像转化为double型 
			I(i,j)=double(*lpSrc); 
		} 
	} 
 
 
	//-------------------------------------------------------------------------- 
	//                     第一步:利用差分算子对图像进行滤波 
	//-------------------------------------------------------------------------- 
	 
	//定义水平方向差分算子并求Ix 
	double dx[9]={-1,0,1,-1,0,1,-1,0,1}; 
	Ix=mbys(I,cxDIB,cyDIB,dx,3,3); 
 
	//定义垂直方向差分算子并求Iy 
	double dy[9]={-1,-1,-1,0,0,0,1,1,1}; 
	Iy=mbys(I,cxDIB,cyDIB,dy,3,3); 
 
	 
	//将中间结果Ix写入到文本文件以便后续分析 
	/*FILE *fp; 
	fp=fopen("Ix.txt","w+"); 
	for(i = 0; i < cyDIB; i++) 
	{ 
		for(j = 0; j < cxDIB; j++) 
			fprintf(fp,"%f ",Ix(i,j)); 
		fprintf(fp,"\n"); 
	}*/ 
 
	//计算Ix2、Iy2、Ixy 
	for(i = 0; i < cyDIB; i++) 
	{ 
		for(j = 0; j < cxDIB; j++) 
		{	Ix2(i,j)=Ix(i,j)*Ix(i,j); 
			Iy2(i,j)=Iy(i,j)*Iy(i,j); 
			Ixy(i,j)=Ix(i,j)*Iy(i,j); 
		} 
	} 
 
 
	//-------------------------------------------------------------------------- 
	//                  第二步:对Ix2/Iy2/Ixy进行高斯平滑,以去除噪声 
	//-------------------------------------------------------------------------- 
	 
	//本例中使用5×5的高斯模板 
	//计算模板参数 
	double *g=new double[gausswidth*gausswidth]; 
	for(i=0;iint(size/2) && iint(size/2) && jmax) 
								max=cim(i+m-int(size/2),j+n-int(size/2)); 
						} 
				} 
			if(max>0) 
				mx(i,j)=max; 
			else 
				mx(i,j)=0; 
		} 
	} 
 
	//最终确定角点 
	//const double thresh=4500; 
	int temp_y=0,temp_x=0; 
	double temp; 
	 
	for(i = 0; i < cyDIB; i++)	 
	{ 
		for(j = 0; j < cxDIB; j++) 
	 
		{	 
			if(cim(i,j)==mx(i,j))  //首先取得局部极大值 
					if(mx(i,j)>thresh&&j>5)  //然后大于这个阈值 
					{	 
					 	temp=(j-temp_y)*(j-temp_y)+(i-temp_x)*(i-temp_x); 
					//	if(temp>2000) 
					//	{ 
						pDoc->corner(i,j)=1;   //满足上两个条件,才是角点! 
					//	temp_y=j; 
					//	temp_x=i; 
					//	} 
					} 
					} 
	} 
 
		 
 
 
 
 
 
 
 
 
	 
	::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 	 
   // UpdateAllViews(NULL, 0, NULL);	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	#define corner(ROW,COL) corner[cxDIB*(ROW)+(COL)] 
 
 
 
 
 
	 
	 
	 
	 
 
 
 
 
 
Invalidate(TRUE); 
} 
 
void CPalmView::OnImToBool()  
{ 
	// TODO: Add your command handler code here 
	int i,j; 
    unsigned char *lpSrc; 
	CPalmDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	if(pDoc->m_hDIB == NULL) 
		return ; 
	LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->m_hDIB); 
	LPSTR lpDIBBits=::FindDIBBits (lpDIB); 
	int cxDIB = (int) ::DIBWidth(lpDIB);         // Size of DIB - x 
	int cyDIB = (int) ::DIBHeight(lpDIB);        // Size of DIB - y 
	long lLineBytes = WIDTHBYTES(cxDIB * 8);     // 计算图像每行的字节数 
	const float c1=150,c2=2.5; 
	// 每行 
	for(i = 0; i < cyDIB; i++) 
	{ 
		// 每列 
		for(j = 0; j < cxDIB; j++) 
		{ 
			// 指向DIB第i行,第j个象素的指针 
			lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (cyDIB - 1 - i) + j; 
			 
			// 计算新的灰度值 
			if(*lpSrc<100) *lpSrc=BYTE(0); 
			else *lpSrc = BYTE(255); 
		} 
	} 
	::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
    Invalidate(TRUE); 
} 
 
void CPalmView::OnUp()  
{ 
	// TODO: Add your command handler code here 
		CPalmDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->m_hDIB); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平移,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持256色位图的平移!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
		 
		// 返回 
		return; 
	} 
	 
	LONG lXOffset; 
	LONG lYOffset; 
	 
		 
	// 平移量 
	lXOffset = -value; 
	lYOffset = 0; 
 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 调用TranslationDIB()函数平移DIB 
	if (TranslationDIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), lXOffset, lYOffset)) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
 
	// 恢复光标 
	EndWaitCursor(); 
} 
 
void CPalmView::Ondown()  
{ 
	// TODO: Add your command handler code here 
			CPalmDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->m_hDIB); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平移,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持256色位图的平移!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
		 
		// 返回 
		return; 
	} 
	 
	LONG lXOffset; 
	LONG lYOffset; 
	 
		 
	// 平移量 
	lXOffset = value; 
	lYOffset = 0; 
 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 调用TranslationDIB()函数平移DIB 
	if (TranslationDIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), lXOffset, lYOffset)) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
 
	// 恢复光标 
	EndWaitCursor(); 
} 
 
void CPalmView::Onleft()  
{ 
	// TODO: Add your command handler code here 
			CPalmDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->m_hDIB); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平移,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持256色位图的平移!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
		 
		// 返回 
		return; 
	} 
	 
	LONG lXOffset; 
	LONG lYOffset; 
	 
		 
	// 平移量 
	lXOffset = 0; 
	lYOffset = -value; 
 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 调用TranslationDIB()函数平移DIB 
	if (TranslationDIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), lXOffset, lYOffset)) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
 
	// 恢复光标 
	EndWaitCursor(); 
} 
 
void CPalmView::Onright()  
{ 
	// TODO: Add your command handler code here 
			CPalmDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR	lpDIB; 
 
	// 指向DIB象素指针 
	LPSTR   lpDIBBits; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->m_hDIB); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的平移,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持256色位图的平移!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
		 
		// 返回 
		return; 
	} 
	 
	LONG lXOffset; 
	LONG lYOffset; 
	 
		 
	// 平移量 
	lXOffset = 0; 
	lYOffset = value; 
 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
 
	// 找到DIB图像象素起始位置 
	lpDIBBits = ::FindDIBBits(lpDIB); 
	 
	// 调用TranslationDIB()函数平移DIB 
	if (TranslationDIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB), lXOffset, lYOffset)) 
	{ 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
 
	// 恢复光标 
	EndWaitCursor(); 
} 
 
void CPalmView::OnBig()  
{ 
	// TODO: Add your command handler code here 
		CPalmDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR lpDIB; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->m_hDIB); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的缩放,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持256色位图的缩放!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
		 
		// 返回 
		return; 
	} 
	 
	// 缩放比率 
	float fXZoomRatio; 
	float fYZoomRatio; 
 
	//缩放量 
	fXZoomRatio = 1.25; 
	fYZoomRatio = 1.25; 
 
	 
	// 创建新DIB 
	HDIB hNewDIB = NULL; 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
	 
	// 调用ZoomDIB()函数转置DIB 
	hNewDIB = (HDIB) ZoomDIB(lpDIB, fXZoomRatio, fYZoomRatio); 
	 
	// 判断缩放是否成功 
	if (hNewDIB != NULL) 
	{ 
		 
		// 替换DIB,同时释放旧DIB对象 
		pDoc->ReplaceHDIB(hNewDIB); 
 
		// 更新DIB大小和调色板 
		pDoc->InitDIBData(); 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
		 
		// 重新设置滚动视图大小 
//		SetScrollSizes(MM_TEXT, pDoc->GetDocSize()); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
 
	// 恢复光标 
	EndWaitCursor(); 
} 
void CPalmDoc::ReplaceHDIB(HDIB hDIB) 
{ 
	// 替换DIB,在功能粘贴中用到该函数 
	 
	// 判断DIB是否为空 
	if (m_hDIB != NULL) 
	{ 
		// 非空,则清除 
		::GlobalFree((HGLOBAL) m_hDIB); 
	} 
 
	// 替换成新的DIB对象 
	m_hDIB = hDIB; 
	 
} 
 
void CPalmView::OnSmall()  
{ 
	// TODO: Add your command handler code here 
		CPalmDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR lpDIB; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->m_hDIB); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的缩放,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持256色位图的缩放!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
		 
		// 返回 
		return; 
	} 
	 
	// 缩放比率 
	float fXZoomRatio; 
	float fYZoomRatio; 
 
	//缩放量 
	fXZoomRatio = 0.8; 
	fYZoomRatio = 0.8; 
 
	 
	// 创建新DIB 
	HDIB hNewDIB = NULL; 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
	 
	// 调用ZoomDIB()函数转置DIB 
	hNewDIB = (HDIB) ZoomDIB(lpDIB, fXZoomRatio, fYZoomRatio); 
	 
	// 判断缩放是否成功 
	if (hNewDIB != NULL) 
	{ 
		 
		// 替换DIB,同时释放旧DIB对象 
		pDoc->ReplaceHDIB(hNewDIB); 
 
		// 更新DIB大小和调色板 
		pDoc->InitDIBData(); 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
		 
		// 重新设置滚动视图大小 
//		SetScrollSizes(MM_TEXT, pDoc->GetDocSize()); 
 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
 
	// 恢复光标 
	EndWaitCursor(); 
} 
 
void CPalmView::OnFront()  
{ 
	// TODO: Add your command handler code here 
		CPalmDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR lpDIB; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->m_hDIB); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的旋转,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持256色位图的旋转!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL)  pDoc->m_hDIB); 
		 
		// 返回 
		return; 
	} 
	 
	// 旋转角度 
	int iRotateAngle; 
	 
	iRotateAngle=corn_v; 
	 
	// 创建新DIB 
	HDIB hNewDIB = NULL; 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
	 
	// 调用RotateDIB()函数旋转DIB 
	hNewDIB = (HDIB) RotateDIB(lpDIB, iRotateAngle); 
	 
	// 判断旋转是否成功 
	if (hNewDIB != NULL) 
	{ 
		 
		// 替换DIB,同时释放旧DIB对象 
		pDoc->ReplaceHDIB(hNewDIB); 
 
		// 更新DIB大小和调色板 
		pDoc->InitDIBData(); 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
		 
		// 重新设置滚动视图大小 
	//	SetScrollSizes(MM_TEXT, pDoc->GetDocSize()); 
		 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL)  pDoc->m_hDIB); 
 
	// 恢复光标 
	EndWaitCursor(); 
} 
 
void CPalmView::OnBack()  
{ 
	// TODO: Add your command handler code here 
		CPalmDoc* pDoc = GetDocument(); 
	 
	// 指向DIB的指针 
	LPSTR lpDIB; 
	 
	// 锁定DIB 
	lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) pDoc->m_hDIB); 
	 
	// 判断是否是8-bpp位图(这里为了方便,只处理8-bpp位图的旋转,其它的可以类推) 
	if (::DIBNumColors(lpDIB) != 256) 
	{ 
		// 提示用户 
		MessageBox("目前只支持256色位图的旋转!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
 
		// 解除锁定 
		::GlobalUnlock((HGLOBAL)pDoc->m_hDIB); 
		 
		// 返回 
		return; 
	} 
	 
	// 旋转角度 
	int iRotateAngle; 
	 
	iRotateAngle=-corn_v; 
	 
	// 创建新DIB 
	HDIB hNewDIB = NULL; 
	 
	// 更改光标形状 
	BeginWaitCursor(); 
	 
	// 调用RotateDIB()函数旋转DIB 
	hNewDIB = (HDIB) RotateDIB(lpDIB, iRotateAngle); 
	 
	// 判断旋转是否成功 
	if (hNewDIB != NULL) 
	{ 
		 
		// 替换DIB,同时释放旧DIB对象 
		pDoc->ReplaceHDIB(hNewDIB); 
 
		// 更新DIB大小和调色板 
		pDoc->InitDIBData(); 
		 
		// 设置脏标记 
		pDoc->SetModifiedFlag(TRUE); 
		 
		// 重新设置滚动视图大小 
	//	SetScrollSizes(MM_TEXT, pDoc->GetDocSize()); 
		 
		// 更新视图 
		pDoc->UpdateAllViews(NULL); 
	} 
	else 
	{ 
		// 提示用户 
		MessageBox("分配内存失败!", "系统提示" , MB_ICONINFORMATION | MB_OK); 
	} 
	 
	// 解除锁定 
	::GlobalUnlock((HGLOBAL) pDoc->m_hDIB); 
 
	// 恢复光标 
	EndWaitCursor(); 
} 
 
void CPalmView::OnAverage()  
{ 
	// TODO: Add your command handler code here 
	CPalmDoc* pDoc = GetDocument(); 
 
	//进行中值滤波 
	pDoc->m_hDIB =MidFilter(pDoc->m_hDIB,3,3); 
 
	Invalidate(TRUE); 
} 
 
void CPalmView::OnAlog()  
{ 
	// TODO: Add your command handler code here 
		CPalmDoc* pDoc = GetDocument(); 
 
	//设定模板参数 
	double tem[9]={1,1,1, 
		           1,1,1, 
				   1,1,1}; 
 
    //设定模板系数 
    double  xishu = 0.111;    
 
    //进行模板操作 
	pDoc->m_hDIB =::Template(pDoc->m_hDIB,tem ,3,3, xishu); 
 
	Invalidate(TRUE); 
} 
 
void CPalmView::OnSobelH()  
{ 
	// TODO: Add your command handler code here 
		CPalmDoc* pDoc = GetDocument(); 
 
	//设定模板参数 
	double tem[9]={-1.0f,-1.0f,-1.0f,0.0f,0.0f,0.0f,1.0f,1.0f,1.0f}; 
 
    //设定模板系数 
    double  xishu = 1;    
 
    //进行模板操作 
	pDoc->m_hDIB =::Template(pDoc->m_hDIB,tem ,3,3, xishu); 
 
	Invalidate(TRUE); 
} 
 
void CPalmView::OnSobelV()  
{ 
	// TODO: Add your command handler code here 
		//设定模板参数 
CPalmDoc* pDoc = GetDocument(); 
 
	//设定模板参数 
	double tem[9]={-1.0f,0.0f,1.0f,-2.0f,0.0f,2.0f,-1.0f,0.0f,1.0f}; 
 
    //设定模板系数 
    double  xishu = 1;    
 
    //进行模板操作 
	pDoc->m_hDIB =::Template(pDoc->m_hDIB,tem ,3,3, xishu); 
 
	Invalidate(TRUE); 
} 
 
void CPalmView::OnRobertH()  
{ 
	// TODO: Add your command handler code here 
	CPalmDoc* pDoc = GetDocument(); 
 
	//设定模板参数 
	double tem[4]={0,1,-1,0}; 
 
    //设定模板系数 
    double  xishu = 1;    
 
    //进行模板操作 
	pDoc->m_hDIB =::Template(pDoc->m_hDIB,tem ,2,2, xishu); 
 
	Invalidate(TRUE);	 
} 
 
void CPalmView::OnPrewiitH()  
{ 
	// TODO: Add your command handler code here 
	CPalmDoc* pDoc = GetDocument(); 
 
	//设定模板参数 
	double tem[9]={-1.0f,-1.0f,-1.0f,0,0.0f,0.0f,1.0f,1.0f,1.0f}; 
 
    //设定模板系数 
    double  xishu = 1;    
 
    //进行模板操作 
	pDoc->m_hDIB =::Template(pDoc->m_hDIB,tem ,3,3, xishu); 
 
	Invalidate(TRUE); 
} 
 
void CPalmView::OnIsotropicSobelH()  
{ 
	// TODO: Add your command handler code here 
	 
		CPalmDoc* pDoc = GetDocument(); 
 
	//设定模板参数 
	double tem[9]={-1.0f,-1.4142f,-1.0f,0.0f,0.0f,0.0f,1.0f,1.4142f,1.0f}; 
 
    //设定模板系数 
    double  xishu = 1;    
 
    //进行模板操作 
	pDoc->m_hDIB =::Template(pDoc->m_hDIB,tem ,3,3, xishu); 
 
	Invalidate(TRUE);	 
 
} 
 
void CPalmView::OnPalmCur()  
{ 
	// TODO: Add your command handler code here 
  //  this->OnGray(); 
	CPalmDoc* pDoc = GetDocument(); 
	pDoc->OnGray(); 
 
	this->OnGaosi(); 
	this->OnAverage(); 
	this->OnHarris(); 
} 
 
void CPalmView::OnPalmROI()  
{ 
	// TODO: Add your command handler code here 
		CPalmDoc* pDoc = GetDocument(); 
	 
		 
		unsigned char *lpSrc;//一个指向源、目的像素的移动指针 
		LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->m_hDIB); 
		int cxDIB = (int) ::DIBWidth(lpDIB);         // 图像宽度 
		int cyDIB = (int) ::DIBHeight(lpDIB);        // 图像高度 
		int i,j,k=0; 
		CPoint temp[10];	 
		 
		CPen* pPenRed = new CPen; 
		pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0)); 
		CDC *pDC=this->GetDC(); 
		pDC->SelectObject(pPenRed); 
		 
		for(i=0;icorner(i,j)) 
			   { 
				temp[k].x=j; 
				temp[k].y=i; 
				k++; 
			   }			 
			 
			} 
		pDC->MoveTo(temp[1]); 
	pDC->LineTo(temp[2]); 
		 
		double splot_x[10],splot_y[10]; 
		double k1,b1,k2,b2,a,b,c,O,k3,b3,k4,b4; 
		splot_x[0]= temp[0].x; 
		splot_x[1]= temp[1].x;//top 
		splot_x[2]= temp[2].x; 
		splot_y[0]= temp[0].y; 
		splot_y[1]= temp[1].y; 
		splot_y[2]= temp[2].y; 
		 
		k1=(splot_y[1]-splot_y[2])/(splot_x[1]-splot_x[2]); 
		 
		 
		temp[1].x=(temp[1].x+temp[2].x)/2; 
		temp[1].y=(temp[1].y+temp[2].y)/2; 
 
		splot_x[3]=temp[1].x; 
		splot_y[3]=temp[1].y;//middle splot 
 
		pDC->MoveTo(temp[0]); 
		pDC->LineTo(temp[1]); 
 
 
        k2=(splot_y[3]-splot_y[0])/(splot_x[3]-splot_x[0]); 
		b2=splot_y[3]-k2*splot_x[3]; 
		 
		 
		temp[2].y=cyDIB; 
		temp[2].x=(temp[2].y-b2)/k2; 
	//		pDC->MoveTo(temp[1]); 
   //	pDC->LineTo(temp[2]); 
		 
		O=((splot_x[1]-splot_x[2])*(splot_x[1]-splot_x[2])+(splot_y[1]-splot_y[2])*(splot_y[1]-splot_y[2])); 
 
 
		a=1+k2*k2; 
		b=2*k2*(b2-splot_y[3])-2*splot_x[3]; 
		c=splot_x[3]*splot_x[3]+(b2-splot_y[3])*(b2-splot_y[3])-O/2; 
 
 
 
 
 
		 
		double delta; 
		delta=b*b-4*a*c; 
		double x1; 
		double x2; 
		if(delta==0) 
		 { 
		 x1=-b/(2*a); 
		// cout<<"x1=x2="<0) 
		{ 
		x1=-b/(2*a)+sqrt(b*b-4*a*c)/(2*a); 
		x2=-b/(2*a)-sqrt(b*b-4*a*c)/(2*a); 
		} 
 
		temp[2].x=int (x2); 
		temp[2].y=k2*temp[2].x+b2; 
		pDC->MoveTo(temp[0]); 
		pDC->LineTo(temp[2]); 
 
//做平行与连线的直线。 
 
		k1=0.000001; 
			b1=temp[2].y-k1*temp[2].x; 
		temp[1].x=temp[2].x-90; 
		temp[1].y=k1*temp[1].x+b1; 
		temp[3].x=temp[2].x+90; 
		temp[3].y=k1*temp[3].x+b1; 
		pDC->MoveTo(temp[3]); 
		pDC->LineTo(temp[1]); 
 
		k3=-1/k1; 
		b3=temp[1].y-k3*temp[1].x; 
		 
		k4=-1/k1; 
		b4=temp[3].y-k4*temp[3].x; 
		 
		temp[5].y=temp[1].y+180; 
		temp[5].x=(temp[5].y-b3)/k3; 
		pDC->MoveTo(temp[1]); 
		pDC->LineTo(temp[5]); 
 
 
		temp[7].y=temp[3].y+180; 
		temp[7].x=(temp[7].y-b4)/k4; 
		pDC->MoveTo(temp[3]); 
		pDC->LineTo(temp[7]); 
 
		pDC->MoveTo(temp[5]); 
		pDC->LineTo(temp[7]); 
		this->squrt_b1=temp[1].x; 
		this->squrt_b2=b3; 
		this->squrt_k1=temp[1].y; 
		this->squrt_k2=k3; 
		this->squrt[0]=temp[1]; 
		this->squrt[1]=temp[3]; 
		this->squrt[2]=temp[5]; 
		this->squrt[3]=temp[7]; 
 
	 
 
 
 
 
 
 
 
 
 
 
		::GlobalUnlock((HGLOBAL) pDoc->m_hDIB);  
 
 
 
 
} 
 
void CPalmView::OnPalmBig()  
{ 
	// TODO: Add your command handler code here 
	CPalmDoc* pDoc = GetDocument();	 
	  unsigned char *lpSrc;//一个指向源、目的像素的移动指针 
	LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)pDoc->m_hDIB); 
	int cxDIB = (int) ::DIBWidth(lpDIB);         // 图像宽度 
	int cyDIB = (int) ::DIBHeight(lpDIB);        // 图像高度 
	int i,j; 
	int corn_x[50],corn_y[50],k=0; 
	long min_R,min_L,temp; 
		for(i = 0; i < cyDIB; i++)	 
	{ 
		for(j = 0; j < cxDIB; j++) 
	 
		{	 
			if(pDoc->corner(i,j)) 
			{ 
				corn_x[k]=j; 
				corn_y[k]=i; 
				k++; 
				pDoc->corner(i,j)=false; 
			 
			} 
		}	 
	}	 
		min_L=1000; 
		min_R=1000; 
		for(i=1;icorner(corn_y[i],corn_x[i])=true; 
			 
			CDC *pDC=this->GetDC(); 
			Invalidate(TRUE); 
		//	pDC->MoveTo(corn_x[0],corn_y[0]); 
		//	pDC->LineTo(273,245); 
			 
} 
			 
			 
 
void CPalmView::OnRoiPro()  
{ 
	// TODO: Add your command handler code here 
	 
	CPalmDoc* pDoc = GetDocument(); 
	int h=180,w=180,dw; 
	int i,j,old_x,old_y,v_x; 
	double sum; 
 
    //指向图像起始位置的指针 
    BYTE *lpDIB=(BYTE*)::GlobalLock((HGLOBAL)pDoc->m_hDIB); 
 
	//指向象素起始位置的指针 
	BYTE *pScrBuff =(BYTE*)::FindDIBBits((char*)lpDIB); 
    
   //将指向图像象素起始位置的指针,赋值给指针变量 
    BYTE* oldbuf = pScrBuff; 
	int width = (int) ::DIBWidth((char *)lpDIB); 
    int height = (int) ::DIBHeight((char *)lpDIB); 
     
	 
//	arraylink.push_back (::FillDibToArray(pDoc->m_hDIB)); 
 
 
 
 
 
 
 
	//建立一个和原图像大小相同的25色灰度位图 
    HDIB newhDIB=NewDIB(w,h,8);   
     
	//指向新的位图的指针 
	BYTE *newlpDIB=(BYTE*)::GlobalLock((HGLOBAL) newhDIB); 
 
	//指向新的位图的象素起始位置的指针  
    BYTE *destBuf = (BYTE*)FindDIBBits((char *)newlpDIB); 
     
   //将指向新图像象素起始位置的指针,赋值给指针变量 
    BYTE *newbuf=destBuf;  
	 
	//对图像进行扫描 
    
	//行 '' 
	pDoc->harris=false; 
 
	cur_x=width; 
	cur_y=0; 
	CDC *pDC=this->GetDC(); 
    for(i=0;im_hDIB); 
    pDoc->m_hDIB=newhDIB; 
 
	 
 
	 
 
 
 
 
//	::PaintDIB(newlpDIB, &rect, newhDIB, &rcDIB, pDoc->m_palDIB); 
	Invalidate(TRUE);	 
 
	//返回新的位图的句柄 
     
 
 
} 
 
void CPalmView::OnROISave()  
{ 
	// TODO: Add your command handler code here 
	 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
} 
 
void CPalmView::OnTotal()  
{ 
	// TODO: Add your command handler code here 
			CPalmDoc* pDoc = GetDocument(); 
 
	//设定模板参数 
	double tem[36]={//-1.0f,-1.0f,-1.0f,0.0f,0.0f,0.0f,1.0f,1.0f,1.0f 
					-1,-2,-1,0,0,0,1,2,1, 
					-1,0,1,-2,0,2,-1,0,1, 
					2,1,0,1,0,-1,0,-1,-2, 
					0,1,2,-1,0,1,-2,-1,0 
					 
	 
					}; 
					 
    //设定模板系数 
    double  xishu = 1;    
 
    //进行模板操作 
	pDoc->m_hDIB =::MaxTemplate(pDoc->m_hDIB,tem ,3,3, xishu,4); 
 
	Invalidate(TRUE);		 
} 
 
void CPalmView::OnThin()  
{ 
	// TODO: Add your command handler code here 
		CPalmDoc* pDoc = GetDocument(); 
	Thinning(pDoc->m_hDIB);	 
	Invalidate(TRUE); 
}