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); }