www.pudn.com > Imagepro.rar > ImgProView.cpp


// ****************************************************************************** 
// *        图象处理算法库调用以及OPENGL图象操作示例 
// * ---------------------------------------------------------------------------- 
// ImgProView.cpp : implementation of the CImgProView class 
// 
 
#include "stdafx.h" 
#include "ImgPro.h" 
 
#include "ImgProDoc.h" 
#include "ImgProView.h" 
 
#include  
#include  
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CImgProView 
 
IMPLEMENT_DYNCREATE(CImgProView, CView) 
 
BEGIN_MESSAGE_MAP(CImgProView, CView) 
	//{{AFX_MSG_MAP(CImgProView) 
	ON_WM_CREATE() 
	ON_WM_DESTROY() 
	ON_WM_SIZE() 
	ON_COMMAND(ID_FILE_OPEN, OnImageFileOpen) 
	ON_COMMAND(ID_ZOOM_OUT, OnZoomOut) 
	ON_COMMAND(ID_ZOOM_IN, OnZoomIn) 
	ON_WM_KEYDOWN() 
	ON_COMMAND(ID_ZOOM_OUT_X, OnZoomOutX) 
	ON_COMMAND(ID_ZOOM_IN_X, OnZoomInX) 
	ON_COMMAND(ID_ZOOM_OUT_Y, OnZoomOutY) 
	ON_COMMAND(ID_ZOOM_IN_Y, OnZoomInY) 
	ON_COMMAND(ID_ZOOM_RESET, OnZoomReset) 
	ON_COMMAND(ID_SMOOTH_GAUSS, OnSmoothGauss) 
	ON_COMMAND(ID_HISTOGRAM_FLATTEN, OnHistogramFlatten) 
	ON_COMMAND(ID_THINNING, OnThinning) 
	ON_COMMAND(ID_THRESHOLD_SIMPLE, OnSimpleThresholding) 
	ON_COMMAND(ID_THRESHOLD_GLOBAL, OnGlobalThresholding) 
	ON_COMMAND(ID_EDGEDECTECTION_SOBEL, OnEdgedectectionSobel) 
	ON_COMMAND(ID_EDGEDECTECTION_CANNY, OnEdgedectectionCanny) 
	ON_COMMAND(ID_THRESHOLD_SIMPLE2, OnThresholdSimple2) 
	ON_COMMAND(ID_INVERT, OnImageInvert) 
	ON_COMMAND(ID_IMAGE_FLIP, OnImageFlipping) 
	ON_COMMAND(ID_HOUGH_ACCUM, OnHoughAccum) 
	ON_COMMAND(ID_HOUGH_LINEFITTING, OnHoughLinefitting) 
	ON_COMMAND(ID_HOUGH_SAMPLE1, OnHoughSample1) 
	ON_COMMAND(ID_HOUGH_SAMPLE2, OnHoughSample2) 
	ON_COMMAND(ID_EDIT_UNDO, OnEditUndo) 
	ON_COMMAND(ID_Morph_Dilation, OnMorphDilation) 
	ON_COMMAND(ID_Morph_Erosion, OnMorphErosion) 
	ON_COMMAND(ID_Morph_Open, OnMorphOpen) 
	ON_COMMAND(ID_Morph_Close, OnMorphClose) 
	ON_COMMAND(ID_Morph_TopHat, OnMorphTopHat) 
	ON_COMMAND(ID_ROADRECOGNITION_BDSCO, OnRoadrecognitionBdsco) 
	ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CImgProView construction/destruction 
 
CImgProView::CImgProView() 
{ 
	//分配图形处理类的内存 
	//img在头文件中说明,这是调用图象类首先要进行的步骤 
	img = new IMAGE2D; 
	bFlagOfOpenFile = FALSE; 
 
	//调用复位函数,赋予各种图象处理参数为原始值 
	ResetImg(); 
} 
CImgProView::~CImgProView() 
{ 
	//释放img内存空间 
	delete img; 
} 
void CImgProView::ResetImg() 
{ 
	//初始化图象缩放系数为原来大小 
	xZoomFactor = 1.0f; 
	yZoomFactor = 1.0f; 
 
	//图象缩放步长 
	dFactor = 0.05f; 
 
	//处理标志 
	bFlagOfThinning = FALSE; 
	bFlagOfHoughTran = FALSE; 
	bFlagOfThreshold = FALSE; 
	bFlagOfEdgeDect = FALSE; 
} 
 
BOOL CImgProView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	//////////////////////////////////////// 
	//设置OpenGL窗口类型 
 
	cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS; 
 
	//////////////////////////////////////// 
 
	return CView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CImgProView drawing 
 
void CImgProView::OnDraw(CDC* pDC) 
{ 
	CImgProDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
 
	//设置绘图上下文,使RC与当前DC相关联 
	wglMakeCurrent(pDC->m_hDC,m_hRC);	 
 
	//绘图前准备,清颜色缓冲区 
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 
	//设置彩色材质状态,只绘制正面 
	glColorMaterial(GL_FRONT,GL_DIFFUSE); 
	//打开彩色材质状态开关 
    glEnable(GL_COLOR_MATERIAL); 
 
	//设置OpenGL投影 
	OglSetProjection(); 
 
	//用OpenGL显示图象 
	OglDisplayImg(img->input_data, img->width, img->height);		   
 
	//强制完成绘图 
	glFinish(); 
 
	//切换双缓冲区,把RC中所绘传到当前的DC上,从而在屏幕上显示 
	SwapBuffers(pDC->m_hDC); 
	//释放RC,以便其他DC进行绘图 
	wglMakeCurrent(pDC->m_hDC,NULL); 
 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CImgProView diagnostics 
 
#ifdef _DEBUG 
void CImgProView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CImgProView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CImgProDoc* CImgProView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImgProDoc))); 
	return (CImgProDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CImgProView message handlers 
 
int CImgProView::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CView::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
	//////////////////////////////////////// 
	//设置OpenGL像素格式 
	 
	CClientDC clientDC(this); 
	 
	OglSetPixelFormat(clientDC.m_hDC); 
 
	//////////////////////////////////////// 
	 
	return 0; 
} 
 
///////////////////////////////////////// 
//功能:设置OpenGL像素格式 
//参数:hDC -- Device Context句柄 
void CImgProView::OglSetPixelFormat(HDC hDC) 
{ 
 
	//设置像素格式描述结构 
    PIXELFORMATDESCRIPTOR pfd = 
    { 
        sizeof(PIXELFORMATDESCRIPTOR), // Structure size. 
        1,                             // Structure version number 
        // Property flags. 
		PFD_DRAW_TO_WINDOW             //support window            
        |PFD_SUPPORT_OPENGL            //support OpenGL 
        |PFD_DOUBLEBUFFER,			   //double buffered,只有doublebuffer才能动画 
        PFD_TYPE_RGBA,                 //RGBA type 
        24,                            // 24-bit color 
        0, 0, 0, 0, 0, 0,              // color bits ignored 
        0,                             //no alpha buffer  
		0,                             //shift bit ignored 
		0,                              //no accumulation buffer 
		0, 0, 0, 0,                     // accum bits  
        32,                            // 32-bit depth buffer 
        0,                             //No stencil buffer 
		0,                          // No auxiliary buffer 
        PFD_MAIN_PLANE,                // Main layer type 
        0,                             // Reserved 
        0, 0, 0                        // Unsupported( layer masks ignored) 
    }; 
 
	//以下是设置像素格式的固定用法  
	//or  
	//  int pixelformat;  
	//  if((pixelformat = ChoosePixelFormat(m_pDC->m_hDC, &pfd)) = 0) 
	//  { 
	//     MessageBox("ChoosePixelFormat failed"); 
	//     return FALSE; 
	//  }  
	//  if(SetPixelFormat(m_pDC->m_hDC, pixelformat, &pfd) =FALSE) 
	//  { 
	//     MessageBox("SetPixelFormat failed"); 
	//     return FALSE; 
	//  }  
	//   return TRUE; 
 
    int pixelFormat = ChoosePixelFormat(hDC, &pfd); 
    BOOL success    = SetPixelFormat(hDC, pixelFormat, &pfd); 
    DescribePixelFormat(hDC, pixelFormat,sizeof(pfd), &pfd); 
 
	//创建逻辑调色板 
    if (pfd.dwFlags & PFD_NEED_PALETTE) 
        OglSetLogicalPalette(); 
	 
	//创建OpenGL上下文(context) 
    m_hRC = wglCreateContext(hDC); 
} 
///////////////////////////////////////// 
//功能:设置OpenGL调色板 
//参数:无 
void CImgProView::OglSetLogicalPalette(void) 
{ 
    struct 
    { 
        WORD Version; 
        WORD NumberOfEntries; 
        PALETTEENTRY aEntries[256]; 
    } logicalPalette = { 0x300, 256 }; 
 
	BYTE reds[] = {0, 36, 72, 109, 145, 182, 218, 255}; 
	BYTE greens[] = {0, 36, 72, 109, 145, 182, 218, 255}; 
	BYTE blues[] = {0, 85, 170, 255}; 
 
    for (int colorNum=0; colorNum<256; ++colorNum) 
    { 
        logicalPalette.aEntries[colorNum].peRed = 
            reds[colorNum & 0x07]; 
        logicalPalette.aEntries[colorNum].peGreen = 
            greens[(colorNum >> 0x03) & 0x07]; 
        logicalPalette.aEntries[colorNum].peBlue = 
            blues[(colorNum >> 0x06) & 0x03]; 
        logicalPalette.aEntries[colorNum].peFlags = 0; 
    } 
 
    m_hPalette = CreatePalette ((LOGPALETTE*)&logicalPalette); 
} 
 
///////////////////////////////////////// 
//功能:关闭View窗口时要进行的清理操作 
//参数:无 
void CImgProView::OnDestroy()  
{ 
	CView::OnDestroy();      //or { 
	                         //     wglMakeCurrent(m_pDC->m_hDC,NULL); //释放与m_hDC 对应的 RC 
	                         //     wglDeleteContext(m_hRC); //删除 RC  
	//////////////////////   //     if (m_pDC) 
	//清除OpenGL的context    //     delete m_pDC; //删除当前 View 拥有的 DC  
	OglDestroy();            //     CView::OnDestroy();  
	                         //    }若采用上述函数语句,则不需要void CImgProView::OglDestroy(void)此函数。 
} 
 
///////////////////////////////////////// 
//功能:删除OpenGL像素格式 
//参数:无 
void CImgProView::OglDestroy(void) 
{ 
	//删除OpenGL像素格式的context 
	wglDeleteContext(m_hRC); 
	if (m_hPalette) 
	    DeleteObject(m_hPalette); 
} 
 
///////////////////////////////////////// 
//功能:通过Windows消息获取Windows窗口尺寸 
//参数:cx -- 窗口宽度 
//      cy -- 窗口高度 
void CImgProView::OnSize(UINT nType, int cx, int cy)  
{ 
	CView::OnSize(nType, cx, cy); 
	 
	/////////////////////// 
	//传送视窗大小至OpenGL视口变量,保持OpenGL视口与Windows视窗匹配 
	Ogl_View_X=cx; 
	Ogl_View_Y=cy; 
	/////////////////////// 
	 
} 
 
///////////////////////////////////////// 
//功能:设置OpenGL投影 
//参数:无 
void CImgProView::OglSetProjection(void) 
{ 
	//设置OpenGL视口 
    glViewport(0, 0, Ogl_View_X, Ogl_View_Y); 
 
	//启用投影矩阵计算模式 
    glMatrixMode(GL_PROJECTION); 
 
	//清空为单位矩阵 
    glLoadIdentity(); 
 
	//使用正射投影 
	gluOrtho2D(0.0, 1.0, 0.0, 1.0); 
	//启用模型矩阵计算模式 
    glMatrixMode(GL_MODELVIEW); 
} 
 
////////////////////////////////////////// 
//功能:用OpenGL显示图象 
//参数:grayImage -- 256级灰度图象数据指针 
//      width     -- 图象宽度 
//      height    -- 图象高度 
void CImgProView::OglDisplayImg(unsigned char *grayImage, int width, int height) 
{ 
    // 清除颜色缓存 
	glClear (GL_COLOR_BUFFER_BIT); 
	 
	// 设置图象对齐参数 
	glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
		 
	// X,Y缩放因子控制 
	if(xZoomFactor < 0.00001f) xZoomFactor = 0.0f; 
	if(yZoomFactor < 0.00001f) yZoomFactor = 0.0f; 
 
	// 计算X偏移量使图象显示居中 
	float img_X = img->width*xZoomFactor; 
	float mx = max((float)Ogl_View_X, img_X); 
	float dx = max(0.f, ((float)Ogl_View_X - img_X)/(2*mx)); 
 
	// 计算Y偏移量使图象显示居中 
	float img_Y = img->height*yZoomFactor; 
	float my = max((float)Ogl_View_Y, img_Y); 
	float dy = max(0.f, ((float)Ogl_View_Y - img_Y)/(2*my)); 
 
	// OpenGL图象缩放 
	glPixelZoom(xZoomFactor, yZoomFactor); 
	 
	// OpenGL图象初始位置定位 
	glRasterPos2f(dx, dy); 
	 
	// OpenGL图象显示 
    glDrawPixels(width, height,	GL_LUMINANCE, GL_UNSIGNED_BYTE, grayImage); 
} 
 
////////////////////////////////////////////// 
//功能:对应于菜单的文件打开选项,读入图象文件 
//参数:无 
void CImgProView::OnImageFileOpen()  
{ 
	CString 	NeededFile,Cstr_FileExt; 
	char 		FileFilter[] = "BMP File(*.bmp)|*.bmp|(*.*)|*.*||"; 
	DWORD 		FileDialogFlag = OFN_HIDEREADONLY|OFN_CREATEPROMPT|OFN_NONETWORKBUTTON; 
	CFileDialog FileDialogBoxFile(TRUE, NULL, NULL, FileDialogFlag, FileFilter, this); 
	FileDialogBoxFile.m_ofn.lpstrTitle = "Select Image file"; 
	char		FileName[200]; 
 
	// 文件打开对话框 
	if( FileDialogBoxFile.DoModal() == IDOK ) 
	{	 
		// 获取选中的文件名称 
		NeededFile	= FileDialogBoxFile.GetPathName(); 
 
		//获取文件后缀 
		Cstr_FileExt= FileDialogBoxFile.GetFileExt(); 
 
		//根据文件后缀限制图象文件类型 
		sprintf(FileName, "%s", NeededFile); 
		if(strcmp("bmp",Cstr_FileExt)==0) 
		{ 
			///////////////////////////// 
			//调用图象库:读入BMP图象文件 
			if(!img->ReadBMP(FileName)) 
			{ 
				MessageBox("不能打开此文件","打开文件提示",MB_OK); 
				return; 
			} 
		} else  
			MessageBox("请打开BMP格式图象文件","图象文件格式提示",MB_OK); 
 
		// 图象控制初始参数设置 
		ResetImg(); 
 
//		if(tmp_data != NULL) delete tmp_data; 
		tmp_data = new unsigned char[img->width * img->height]; 
 
		// 刷新窗口 
		Invalidate(FALSE);	 
	}	 
} 
 
////////////////////////////////////// 
//功能:键盘控制 
//参数:Windows消息参数 
void CImgProView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)  
{ 
	switch(nChar) 
	{ 
		// 恢复图象原始尺寸 
		case 'R':	 
		case 'r':	 
					xZoomFactor = 1.f; 
					yZoomFactor = 1.f; 
					Invalidate(FALSE); 
					break; 
		// 整体放大 
		case VK_ADD:	 
					xZoomFactor += dFactor; 
					yZoomFactor += dFactor; 
					Invalidate(FALSE); 
					break; 
		// 整体缩小 
		case VK_SUBTRACT:	 
					xZoomFactor -= dFactor; 
					yZoomFactor -= dFactor; 
					Invalidate(FALSE); 
					break; 
		// 横向放大 
		case VK_RIGHT: 
					xZoomFactor += dFactor; 
					Invalidate(FALSE); 
					break; 
		// 横向缩小 
		case VK_LEFT: 
					xZoomFactor -= dFactor; 
					Invalidate(FALSE); 
					break; 
		// 纵向放大 
		case VK_UP: 
					yZoomFactor += dFactor; 
					Invalidate(FALSE); 
					break; 
		// 纵向缩小 
		case VK_DOWN: 
					yZoomFactor -= dFactor; 
					Invalidate(FALSE); 
					break; 
	} 
	 
	CView::OnKeyDown(nChar, nRepCnt, nFlags); 
} 
 
//////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////// 
//        对应于菜单的图象放大缩小处理函数 
 
////////////////////////////// 
//功能:整体放大 
//参数:无 
void CImgProView::OnZoomOut()  
{ 
	xZoomFactor += dFactor; 
	yZoomFactor += dFactor;	 
	Invalidate(FALSE);	 
} 
 
////////////////////////////// 
//功能:整体缩小 
//参数:无 
void CImgProView::OnZoomIn()  
{ 
	xZoomFactor -= dFactor; 
	yZoomFactor -= dFactor; 
	Invalidate(FALSE); 
} 
 
////////////////////////////// 
//功能:横向放大 
//参数:无 
void CImgProView::OnZoomOutX()  
{ 
	xZoomFactor += dFactor; 
	Invalidate(FALSE);	 
} 
 
////////////////////////////// 
//功能:横向缩小 
//参数:无 
void CImgProView::OnZoomInX()  
{ 
	xZoomFactor -= dFactor; 
	Invalidate(FALSE); 
} 
 
////////////////////////////// 
//功能:纵向放大 
//参数:无 
void CImgProView::OnZoomOutY()  
{ 
	yZoomFactor += dFactor; 
	Invalidate(FALSE); 
} 
 
////////////////////////////// 
//功能:纵向缩小 
//参数:无 
void CImgProView::OnZoomInY()  
{ 
	yZoomFactor -= dFactor; 
	Invalidate(FALSE); 
} 
 
////////////////////////////// 
//功能:恢复图象原始尺寸 
//参数:无 
void CImgProView::OnZoomReset()  
{ 
	//初始化图象缩放系数为原来大小 
	xZoomFactor = 1.0f; 
	yZoomFactor = 1.0f; 
	Invalidate(FALSE);	 
} 
//////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////// 
 
//////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////// 
//        对应于菜单的图象处理算法函数 
 
///////////////////////////////// 
//功能:高斯平滑处理 
//参数:无 
void CImgProView::OnSmoothGauss()  
{ 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	// 从参数对话框中获得高斯平滑参数 
	myParDlg.eImgOpr = eSMOOTH; 
	if (myParDlg.DoModal() == IDOK)   
	{  
		// 调用图象库:高斯平滑处理 
		// 图象平滑结果放在output_data中 
		img->GaussSmooth(myParDlg.mv_sigma, myParDlg.mv_mask, img->input_data, img->output_data); 
		 
		// 拷贝图象处理结果用于显示(此系统中显示图象用的是input_data数据,用户可自行修改) 
		img->CopyImage(img->output_data, img->input_data); 
 
		// 刷新窗口显示处理结果 
		Invalidate(FALSE);			 
	} 
	else return; 
} 
 
///////////////////////////////// 
//功能:图象细化处理 
//参数:无 
void CImgProView::OnThinning()  
{ 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	// 必须先进行阈值处理(二值化)使bFlagOfThreshold为TRUE 
	if(bFlagOfThreshold) 
	{ 
		//调用图象库:细化处理 
		img->Thinning(img->input_data);   	 
 
		//设置细化处理标志 
		bFlagOfThinning = TRUE; 
 
		// 刷新窗口显示处理结果 
		Invalidate(FALSE);	 
	} 
	else 
		MessageBox("必须阈值化以后才能细化","细化提示",MB_OK); 
} 
 
////////////////////////////////////// 
//功能:直方图均衡化 
//参数:无 
void CImgProView::OnHistogramFlatten()  
{ 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	//调用图象库:直方图均衡化 
	img->FlattenHistogram(img->input_data); 
 
	// 拷贝图象处理结果用于显示(此系统中显示图象用的是input_data数据,用户可自行修改) 
	img->CopyImage(img->output_data, img->input_data); 
	 
	// 刷新窗口显示处理结果 
	Invalidate(FALSE);	 
} 
 
/////////////////////////////////////// 
//功能:单阈值处理 
//参数:无 
void CImgProView::OnSimpleThresholding()  
{ 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	// 从参数对话框中获得单阈值参数 
	myParDlg.eImgOpr = eSIMPLETHRESHOLD1; 
	if (myParDlg.DoModal() == IDOK)   
	{  
		//调用图象库:单阈值处理 
		img->simpleThresholding(myParDlg.mv_threshold1, img->input_data);  
 
		//设置阈值处理标志 
		bFlagOfThreshold = TRUE; 
 
		// 刷新窗口显示处理结果 
		Invalidate(FALSE);			 
	} 
	else return; 
} 
 
/////////////////////////////////////// 
//功能:双阈值处理 
//参数:无 
void CImgProView::OnThresholdSimple2()  
{ 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	// 从参数对话框中获得双阈值参数 
	myParDlg.eImgOpr = eSIMPLETHRESHOLD2; 
	if (myParDlg.DoModal() == IDOK)   
	{  
		//调用图象库:双阈值处理 
		img->simpleDoubleThresholding(img->input_data, myParDlg.mv_threshold1, myParDlg.mv_threshold2);  
 
		//设置阈值处理标志 
		bFlagOfThreshold = TRUE; 
 
		// 刷新窗口显示处理结果 
		Invalidate(FALSE);			 
	} 
	else return; 
} 
 
/////////////////////////////////////// 
//功能:全局阈值处理 
//参数:无 
void CImgProView::OnGlobalThresholding()  
{	 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	// 从参数对话框中获得全局阈值处理参数 
	myParDlg.eImgOpr = eGLOBALTHRESHOLD; 
	if (myParDlg.DoModal() == IDOK)   
	{  
		//调用图象库:全局阈值处理 
		img->GlobalThresholding(myParDlg.mv_percent, img->input_data);   
 
		//设置阈值处理标志 
		bFlagOfThreshold = TRUE; 
 
		// 刷新窗口显示处理结果 
		Invalidate(FALSE);		 
	} 
	else return; 
} 
 
/////////////////////////////////////// 
//功能:Sobel边缘检测 
//参数:无 
void CImgProView::OnEdgedectectionSobel()  
{ 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	//调用图象库:Sobel边缘检测 
	img->SobelEdgeDetector(img->input_data, img->output_data);	 
 
	// 拷贝图象处理结果用于显示(此系统中显示图象用的是input_data数据,用户可自行修改) 
	img->CopyImage(img->output_data, img->input_data);	 
	 
	//设置边缘检测处理标志 
	bFlagOfEdgeDect = TRUE; 
	 
	// 刷新窗口显示处理结果 
	Invalidate(FALSE);			 
} 
 
/////////////////////////////////////// 
//功能:Canny边缘检测 
//参数:无 
void CImgProView::OnEdgedectectionCanny()  
{ 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	// 从参数对话框中获得Canny边缘检测参数 
	myParDlg.eImgOpr = eCANNY; 
	if (myParDlg.DoModal() == IDOK)   
	{  
		//调用图象库:Canny边缘检测 
		img->CannyEdgeDetector(myParDlg.mv_mask, myParDlg.mv_sigma, img->input_data, img->output_data); // for test*.pgm, iupui1.pgm 
 
		// 拷贝图象处理结果用于显示(此系统中显示图象用的是input_data数据,用户可自行修改) 
		img->CopyImage(img->output_data, img->input_data); 
		 
		// 设置边缘检测处理标志 
		bFlagOfEdgeDect = TRUE; 
		 
		// 刷新窗口显示处理结果 
		Invalidate(FALSE); 
	} 
	else return; 
} 
 
/////////////////////////////////////// 
//功能:Hough变换 
//参数:无 
void CImgProView::OnHoughAccum()  
{ 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	// 从参数对话框中获得Hough变换参数 
	myParDlg.eImgOpr = eHOUGHTRANSFORM; 
 
	// 必须先进行阈值处理、细化和边缘检测,使这些标志都为TRUE 
	if(bFlagOfThinning & bFlagOfThreshold & bFlagOfEdgeDect) 
	{ 
		if (myParDlg.DoModal() == IDOK)   
		{  
			//调用图象库:Hough变换 
			img->HoughTransform(img->input_data, 1.f);  
 
			// 设置Hough变换处理标志 
			bFlagOfHoughTran = TRUE; 
 
			// 刷新窗口显示处理结果 
			Invalidate(FALSE); 
		} 
		else return; 
	} 
	else 
		MessageBox("必须首先按序完成“边缘检测”、“阈值处理”、“细化”!","HOUGH变换提示",MB_OK); 
} 
 
/////////////////////////////////////// 
//功能:线拟合(Line Fitting) 
//参数:无 
void CImgProView::OnHoughLinefitting()  
{ 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	// 从参数对话框中获得线拟合参数 
	myParDlg.eImgOpr = eLINEFITTING; 
 
	// 必须先进行阈值处理、细化、边缘检测和Hough变换,使这些标志都为TRUE 
	if(bFlagOfThinning & bFlagOfHoughTran  
		& bFlagOfThreshold & bFlagOfEdgeDect) 
	{ 
		if (myParDlg.DoModal() == IDOK)   
		{  
			//调用图象库:线拟合 
			img->LineFitting(img->input_data, myParDlg.mv_percent); 
 
			//调用图象库:图象叠加。使得检测到的线叠加到原始图象上 
			img->BlendImage(img->output_data, img->input_data); 
 
			// 刷新窗口显示处理结果 
			Invalidate(FALSE); 
		} 
		else return; 
	}	 
	else 
		MessageBox("必须首先按序完成“边缘检测”、“阈值处理”、“细化”、“HOUGH变换显示”!","线拟合提示",MB_OK); 
} 
 
/////////////////////////////////////// 
//功能:图象反相 
//参数:无 
void CImgProView::OnImageInvert()  
{ 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	//调用图象库:图象反相 
    img->NegativeImage(img->input_data); 
	// 刷新窗口显示处理结果 
	Invalidate(FALSE);					 
} 
 
/////////////////////////////////////// 
//功能:图象翻转 
//参数:无 
void CImgProView::OnImageFlipping()  
{ 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	//调用图象库:图象翻转 
    img->FlipImage(img->input_data); 
 
	// 刷新窗口显示处理结果 
	Invalidate(FALSE);					 
} 
 
 
/////////////////////////////////////// 
//功能:Hough变换及线拟合示例1 
//参数:无 
void CImgProView::OnHoughSample1()  
{ 
	// 示例1的各项参数设置 
	double sigma = 0.5; 
	int mask = 5, pixels = 2; 
	float bins = 1.f, t_percent = 5.f, l_percent = 0.05f; 
	 
	// 调用图象库:读入示例1的BMP图象 
	if(!img->ReadBMP("building2.bmp")) 
	{ 
		MessageBox("不能打开building2.bmp","打开文件提示",MB_OK); 
		return; 
	} 
 
	// 恢复图象初始参数设置 
	ResetImg(); 
 
	// 分配一个临时图象存储空间 
	unsigned char * tmpData = new unsigned char[img->width*img->height]; 
 
	//调用图象库:拷贝图象。临时创建原始图象的备份 
	img->CopyImage(img->input_data, tmpData);	 
	 
	//调用图象库:Canny边缘检测 
	img->CannyEdgeDetector(mask, sigma, img->input_data, img->output_data); // for test*.pgm, iupui1.pgm 
 
	// 拷贝图象处理结果用于显示(此系统中显示图象用的是input_data数据,用户可自行修改) 
	img->CopyImage(img->output_data, img->input_data);	 
 
	//调用图象库:全局阈值处理 
	img->GlobalThresholding( t_percent, img->input_data);  
 
	//调用图象库:细化处理 
	img->Thinning(img->input_data);    
 
	//调用图象库:Hough变换 
	img->HoughTransform(img->input_data, bins); 	 
 
	//调用图象库:线拟合 
	img->LineFitting(img->input_data, l_percent); 
 
	//调用图象库:图象叠加。使得检测到的线叠加到原始图象上 
	img->BlendImage(tmpData, img->input_data); 
 
	// 刷新窗口显示处理结果 
	Invalidate(FALSE);	 
 
	// 释放临时内存空间 
	delete tmpData; 
} 
 
/////////////////////////////////////// 
//功能:Hough变换及线拟合示例2 
//参数:无 
void CImgProView::OnHoughSample2()  
{ 
	// 示例2的各项参数设置 
	int mask = 5, pixels = 2, threshold = 50; 
	float sigma = 0.5, bins = 1.f, l_percent = 0.02f; 
 
	// 调用图象库:读入示例2的BMP图象 
	if(!img->ReadBMP("building1.bmp")) 
	{	 
		MessageBox("不能打开building1.bmp","打开文件提示",MB_OK); 
		return; 
	} 
 
	// 恢复图象初始参数设置 
	ResetImg(); 
 
	// 分配一个临时图象存储空间 
	unsigned char * tmpData = new unsigned char[img->width*img->height]; 
 
	//调用图象库:拷贝图象。临时创建原始图象的备份 
	img->CopyImage(img->input_data, tmpData);	 
 
	//调用图象库:Canny边缘检测 
	img->CannyEdgeDetector(mask, sigma, img->input_data, img->output_data);	 
 
	// 拷贝图象处理结果用于显示(此系统中显示图象用的是input_data数据,用户可自行修改) 
	img->CopyImage(img->output_data, img->input_data);	 
 
	//调用图象库:单阈值处理 
	img->simpleThresholding(threshold, img->input_data);  
 
	//调用图象库:细化处理 
	img->Thinning(img->input_data);    
 
	//调用图象库:Hough变换 
	img->HoughTransform(img->input_data, bins); 	 
 
	//调用图象库:线拟合 
	img->LineFitting(img->input_data, l_percent); 
 
	//调用图象库:图象叠加。使得检测到的线叠加到原始图象上 
	img->BlendImage(tmpData, img->input_data); 
 
	// 刷新窗口显示处理结果 
	Invalidate(FALSE);	 
 
	// 释放临时内存空间 
	delete tmpData;	 
} 
 
void CImgProView::OnEditUndo()  
{ 
	img->CopyImage(tmp_data, img->input_data); 
	Invalidate(FALSE);	 
} 
 
void CImgProView::OnMorphDilation()  
{ 
	// TODO: Add your command handler code here 
 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	// 从参数对话框中获得结构元素的灰度值 
	dlgMorph.eImgOperation = eDilationGrayImage; 
	if (dlgMorph.DoModal() == IDOK)  
	{ 
		//调用结构元素 
		dlgMorph.ImgOperationCase(); 
		// 调用图象库:膨胀处理 
	    // 图象处理结果放在output_data中 
	    img->DilationGrayImage(img->input_data, img->output_data,dlgMorph.structure); 
		 
	    // 拷贝图象处理结果用于显示(此系统中显示图象用的是input_data数据,用户可自行修改) 
	    img->CopyImage(img->output_data, img->input_data); 
 
	    // 刷新窗口显示处理结果 
	    Invalidate(FALSE);	   
	} 
	else return;			 
} 
 
void CImgProView::OnMorphErosion()  
{ 
	// TODO: Add your command handler code here 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	// 从参数对话框中获得结构元素的灰度值 
	dlgMorph.eImgOperation = eErosionGrayImage; 
	if (dlgMorph.DoModal() == IDOK)  
	{ 
		//调用结构元素 
		dlgMorph.ImgOperationCase(); 
		// 调用图象库:膨胀处理 
	    // 图象处理结果放在output_data中 
	    img->ErosionGrayImage(img->input_data, img->output_data,dlgMorph.structure); 
		 
	    // 拷贝图象处理结果用于显示(此系统中显示图象用的是input_data数据,用户可自行修改) 
	    img->CopyImage(img->output_data, img->input_data); 
 
	    // 刷新窗口显示处理结果 
	    Invalidate(FALSE); 
	} 
	else return; 
		 
} 
 
void CImgProView::OnMorphOpen()  
{ 
	// TODO: Add your command handler code here 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	// 从参数对话框中获得结构元素的灰度值 
	dlgMorph.eImgOperation = eOpenGrayImage; 
	if (dlgMorph.DoModal() == IDOK)  
	{ 
		//调用结构元素 
		dlgMorph.ImgOperationCase(); 
		// 调用图象库:膨胀处理 
	    // 图象处理结果放在output_data中 
	    img->OpenGrayImage(img->input_data, img->output_data,dlgMorph.structure); 
		 
     	// 拷贝图象处理结果用于显示(此系统中显示图象用的是input_data数据,用户可自行修改) 
    	img->CopyImage(img->output_data, img->input_data); 
 
	    // 刷新窗口显示处理结果 
    	Invalidate(FALSE);	 
	} 
	else return; 
	 
} 
void CImgProView::OnMorphClose()  
{ 
	// TODO: Add your command handler code here 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	// 从参数对话框中获得结构元素的灰度值 
	dlgMorph.eImgOperation = eCloseGrayImage; 
   	if (dlgMorph.DoModal() == IDOK)  
	{ 
		//调用结构元素 
		dlgMorph.ImgOperationCase(); 
		// 调用图象库:膨胀处理 
    	// 图象处理结果放在output_data中 
    	img->CloseGrayImage(img->input_data, img->output_data,dlgMorph.structure); 
		 
	    // 拷贝图象处理结果用于显示(此系统中显示图象用的是input_data数据,用户可自行修改) 
    	img->CopyImage(img->output_data, img->input_data); 
 
     	// 刷新窗口显示处理结果 
     	Invalidate(FALSE);	 
	} 
	else return;	 
} 
 
void CImgProView::OnMorphTopHat()  
{ 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	// 从参数对话框中获得结构元素的灰度值 
	dlgMorph.eImgOperation = eTopHatGrayImage; 
 
	if (dlgMorph.DoModal() == IDOK)  
	{ 
		// 调用图象库:膨胀处理 
	    // 图象处理结果放在output_data中 
	    img->TophatGrayImage(img->input_data, img->output_data,dlgMorph.structure); 
		 
	    // 拷贝图象处理结果用于显示(此系统中显示图象用的是input_data数据,用户可自行修改) 
	    img->CopyImage(img->output_data, img->input_data); 
 
	    // 刷新窗口显示处理结果 
	    Invalidate(FALSE);	 
	} 
	else return; 
} 
void CImgProView::OnRoadrecognitionBdsco()  
{ 
	//备份前一次图象用于UNDO 
	img->CopyImage(img->input_data, tmp_data); 
 
	// 从参数对话框中获得道路基元尺寸 
	dlgSlpWin.eImgOperation = eBDScout; 
 
	if (dlgSlpWin.DoModal() == IDOK)  
	{ 
		// 调用图象库:基元搜索 
 
	    // 图象处理结果放在output_data中 
	    img->BasicDollarScout(img->input_data,dlgSlpWin.BasDollar); 
		 
	    // 拷贝图象处理结果用于显示(此系统中显示图象用的是input_data数据,用户可自行修改) 
	    img->CopyImage(img->output_data, img->input_data); 
 
	    // 刷新窗口显示处理结果 
	    Invalidate(FALSE);	 
	} 
	else return;	 
} 
 
void CImgProView::OnFileSaveAs()  
{ 
	CString strSaveFileType = "位图文件 (*.bmp;*.dib)|*.bmp; *.dib|All Files (*.*)|*.*||"; 
	CFileDialog FileDlg(FALSE, "*.bmp", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, strSaveFileType); 
     
	CFile fileOpen ; 
	if( FileDlg.DoModal() == IDOK )  
	{ 
		if(!fileOpen.Open( FileDlg.GetPathName() , CFile::modeCreate|CFile::modeWrite )) 
		{ 
			AfxMessageBox("cannot create the file to save"); 
	  		return; 
		} 
	} 
	if(strcmp("bmp",strSaveFileType)==0) 
	{ 
		//调用图像库:写BMP入内存 
	} 
	if(!img->Write(&fileOpen)) 
	{ 
		MessageBox("不能保存此文件","保存文件提示",MB_OK); 
		return; 
	} 
	else 
	{ 
		MessageBox("保存为:","图像文件格式提示",MB_OK); 
	} 
	fileOpen.Close(); 
	//刷新窗口 
    Invalidate(FALSE); 
}