浙江工商大学计算机与信息工程学院
课程设计报告
课程名称: 面向对象程序设计
专
业: 计算机科学与技术
级: 计科 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 -