C++课程设计报告--图像浏览器的设计与实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浙江工商大学计算机与信息工程学院课程设计报告
课程名称:面向对象程序设计
专业:计算机科学与技术
班级:计科0902 ______
学号: 0912300219 _
姓名:徐雪琳
题目:图像浏览器的设计与实现
指导教师:刘春晓
2011年1月
计算机与信息工程学院2009级《面向对象程序设计》课程设计任务书
设计说明书
一、问题描述
图像浏览器的设计与实现:
设计一个能实现图像浏览与编辑功能的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)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 Create( int width, int height, int bits_per_pixel, int image_origin = 0 );
/* Load image from specified file */
virtual bool Load( const char* filename, int desired_color = 1 );
/* Load rectangle from the file */
virtual bool LoadRect( const char* filename,
int desired_color, CvRect r );
#ifdef WIN32
virtual bool LoadRect( const char* filename,
int desired_color, RECT r )
{
return LoadRect( filename, desired_color,
cvRect( r.left, r.top, r.right - r.left, r.bottom - r.top ));
}
#endif
/* Save entire image to specified file. */
virtual bool Save( const char* filename );
/* 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() { return !m_img ? 0 : !m_img->roi ? m_img->width : m_img->roi->width; };
int Height() { return !m_img ? 0 : !m_img->roi ? m_img->height : m_img->roi->height;};
int Bpp() { return m_img ? (m_img->depth & 255)*m_img->nChannels : 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
{
int nSize; /* sizeof(IplImage) */
int ID; /* version (=0)*/
int nChannels; /* Most of OpenCV functions support 1,2,3 or 4 channels */
int alphaChannel; /* ignored by OpenCV */
int depth; /* pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,