logo资料库

C++课程设计——图像浏览器的设计与实现.doc

第1页 / 共29页
第2页 / 共29页
第3页 / 共29页
第4页 / 共29页
第5页 / 共29页
第6页 / 共29页
第7页 / 共29页
第8页 / 共29页
资料共29页,剩余部分请下载后查看
浙江工商大学计算机与信息工程学院 课程设计报告 课程名称: 面向对象程序设计 专 业: 计算机科学与技术 级: 计科 0902 ______ 班 学 号: 0912300219 _ 名: 徐雪琳 姓 题 目:图像浏览器的设计与实现 指导教师: 刘春晓 2011 年 1 月
课程设计报告——徐雪琳 计算机与信息工程学院 2009 级《面向对象程序设计》课程设计任务书 班级 计科 0902 姓名 徐雪琳 学号 0912300219 题目 图像浏览器的设计与实现 时间 2011 年 1 月 10 日——2011 年 1 月 14 日 《面向对象程序设计》是一门实践性很强的计算机专业基础课程,课 程设计是学习完该课程后进行的一次较全面的综合练习。其目的在于通过实 践加深对面向对象程序设计的理论、方法和基础知识的理解,掌握使用 C++ 语言进行面向对象设计的基本方法,提高运用面向对象方法分析实际问题、 解决实际问题的能力。 图像浏览器的设计与实现: 设计一个能实现图像浏览与编辑功能的 Java/C++程序,包括如下功能: 1)从已有的图像文件列表中选择某一个,即可显示该图像,并可做旋 转等变换。 2)在画布区域上可以进行各种规则图形的绘制(如:线段、矩形、多 边形、圆等),还可通过鼠标的拖动自由绘图。 3)可以连续播放所选文件夹下的所有图像。 目 的 内 容 和 要 求 成 绩 指导教师(签名): - 1 -
课程设计报告——徐雪琳 设计说明书 一、问题描述 图像浏览器的设计与实现: 设计一个能实现图像浏览与编辑功能的 Java/C++程序,包括如下功能: 1)从已有的图像文件列表中选择某一个,即可显示该图像,并可做旋转等 变换。 2)在画布区域上可以进行各种规则图形的绘制(如:线段、矩形、多边形、 圆等),还可通过鼠标的拖动自由绘图。 3)可以连续播放所选文件夹下的所有图像。 二、需求分析 随着数字产品渐进人们的生活,网络通信技术、图像处理技术以及多媒 体技术的发展,越来越多的用户希望能够对已有的数字图片进行查看并能够实 现简单的操作。此图片游览器以 C++ Windows 编程及 OpenCV 为基础,在 MFC 的单文档上实现,面向对象的设计及其简洁明了易操作的特点实现图片查看的 基本功能,从而也就满足了用户对图片查看的基本要求。 (1)MFC:MFC 是用来编写 Windows 应用程序的 C++类集,该类集以层次 结构组织起来,其中封装了大部分 Windows 控件,它所包含的功能涉及到整个 Windows 操作系统。MFC 不仅为用户提供了 Windows 图形环境下应用程序的框 架,而且还提供了创建应用程序的组件。应用 MFC 类库和 Visual C++提供的高 度可视的应用程序开发工具,可使应用程序开发变得更简单,开发周期极大地 缩短,提高代码的可靠性和可重用性。 创建一个名为 ImageViewer 的 MFC 单文档程序,步骤为首先在新建工程框 中选择 MFC AppWizard(exe),工程名为 ImageViewer,点下一步后选择基于单个 文档的程序,其余的基本选择默认,除了最后选择基类是不是默认的 CView 而 选择 CScrollView 类,因为在显示图片时可能会出现图片大小比视窗大小还要 大,这是就要用到滚动条,所以选择了这个基类。创建好后会自动产生 5 个类: CAboutDlg 、 CImageViewerApp 、 CImageViewerDoc 、 CImageViewerView 、 CMainFrame。 - 2 -
课程设计报告——徐雪琳 (2)OpenCV 里提供了大量图像处理和计算机视觉库,所以在 opencv 中显 示一个图像简单,但是想在 MFC 的单文档框架中可不是件容易的事。所以我在 MFC 单文档的基础上应用了 OpenCV 类。在 imageViewer 程序中添加库文件: cv.lib、cxcore.lib、highgui.lib。 经过上面两步后,就可以在此基础上开始添加功能。 该程序重要功能: 1、 旋转图像:顺时针旋转 90°,逆时针旋转 90°,旋转 180°。 2、 图像缩放:放大,缩小和显示原图。 3、 图像标记:规则图形(线段,椭圆,矩形),鼠标自由画图,鼠标 恢复自由。 4、 画笔颜色选择(无,白,黑),画刷颜色选择(无,白,黑,灰)。 5、 连续显示同一文件夹下的图片,并且提示已经到第一张和最后一 张。 6、 图形文件的打开,保存。 其中用到的主要的类 CvvImage(CImage)定义为:(定义在 highgui.h 头文 件中) #define CImage CvvImage /* CvvImage class definition */ class CV_EXPORTS CvvImage { public: CvvImage(); virtual ~CvvImage(); /* Create image (BGR or grayscale) */ virtual bool int width, Create( image_origin = 0 ); int height, int bits_per_pixel, int /* Load image from specified file */ virtual bool /* Load rectangle from the file */ virtual bool LoadRect( const char* filename, Load( const char* filename, int desired_color = 1 ); int desired_color, CvRect r ); LoadRect( const char* filename, int desired_color, RECT r ) #ifdef WIN32 virtual bool { return LoadRect( filename, desired_color, - 3 -
课程设计报告——徐雪琳 r.top )); } #endif cvRect( r.left, r.top, r.right - r.left, r.bottom - Save( const char* filename ); /* Save entire image to specified file. */ virtual bool /* Get copy of input image ROI */ virtual void CopyOf( CvvImage& image, int desired_color = -1 ); virtual void CopyOf( IplImage* img, int desired_color = -1 ); IplImage* GetImage() { return m_img; }; virtual void Destroy(void); /* width and height of ROI */ int Width() m_img->roi->width; }; { return !m_img ? 0 : !m_img->roi ? m_img->width : int Height() { return !m_img ? 0 : !m_img->roi ? m_img->height : int Bpp() { return m_img ? (m_img->depth & 255)*m_img->nChannels : m_img->roi->height;}; 0; }; virtual void Fill( int color ); /* draw to highgui window */ virtual void Show( const char* window ); #ifdef WIN32 /* draw part of image to the specified DC */ virtual void Show( HDC dc, int x, int y, int width, int height, int from_x = 0, int from_y = 0 ); /* draw the current image ROI to the specified rectangle of the destination DC */ virtual void DrawToHDC( HDC hDCDst, RECT* pDstRect ); #endif protected: }; IplImage* m_img; 而在 OpenCV 里图像信息保存在 IplImage 结构里,定义如下: typedef struct _IplImage { /* sizeof(IplImage) */ /* version (=0)*/ /* Most of OpenCV functions support 1,2,3 or 4 alphaChannel; /* ignored by OpenCV */ /* pixel depth in bits: ID; nChannels; int nSize; int int channels */ int int depth; IPL_DEPTH_8S, IPL_DEPTH_16S, IPL_DEPTH_8U, - 4 -
IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported */ char colorModel[4]; /* ignored by OpenCV */ char channelSeq[4]; /* ditto */ int dataOrder; /* 0 - interleaved color channels, 1 - separate color cvCreateImage can only create interleaved /* 0 - top-left origin, 1 - bottom-left origin (Windows bitmaps style) /* Alignment of image rows (4 or 8). OpenCV ignores it and uses widthStep 课程设计报告——徐雪琳 channels. images */ */ instead */ int origin; int align; /* image width in pixels */ /* image height in pixels */ int width; int height; struct _IplROI *roi;/* image ROI. if NULL, the whole image is selected */ struct _IplImage *maskROI; /* must be NULL */ void *imageId; struct _IplTileInfo *tileInfo; /* ditto */ int /* image data size in bytes imageSize; /* ditto */ (==image->height*image->widthStep in case of interleaved data)*/ /* pointer to aligned image data */ /* size of aligned image row in bytes */ char *imageData; int widthStep; int BorderMode[4]; /* ignored by OpenCV */ int BorderConst[4]; /* ditto */ char *imageDataOrigin; /* pointer to very origin of image data (not necessarily aligned) - needed for correct deallocation */ } IplImage; 所以从文件读取中得到一个图像文件,记录为 CImage 类,其中的图像信息 保存在 CImage 的保护成员中,所以要得到 IplImage 的数据,必须使用 CImage 的成员函数 GetImage();修改好 IplImage 的数据后,要把 IplImage 放回到 CImage 类中,则要使用 CImage 的成员函数 CopyOf(IplImage* img, int desired_color = -1); 在此程序的功能函数如图像放大,缩小,还有图像旋转都要用到 CImage 和 IplImage 之间信息的拷贝。所以了解清楚 CImage 类和 IplImage 结构的定义很 重要。 - 5 -
课程设计报告——徐雪琳 三、概要设计 1、类的继承关系图: 由 MFC 产生的 5 个类,CAboutDlg,CImageViewerApp,CImageViewerDoc, CImageViewerView,CMainFrame,归根结底都继承自 CObject 类。其中关系图 为: CObject CCmdTarget CWnd CWinThread CDocument CDialog CFrameWnd CView CWinApp CScrollView CAboutDlg CImageViewerApp CMainFrame CImageViewerView CImageViewerDoc - 6 -
课程设计报告——徐雪琳 2、类的 UML 图: CAboutDlg 类: CImageViewerApp 类: CImageViewerDoc 类: - 7 -
分享到:
收藏