当前位置:文档之家› C++课程设计报告--图像浏览器的设计与实现

C++课程设计报告--图像浏览器的设计与实现

浙江工商大学计算机与信息工程学院课程设计报告课程名称:面向对象程序设计专业:计算机科学与技术班级:计科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 WIN32virtual 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 );#endifprotected: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,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 channels.cvCreateImage can only create interleaved images */int origin; /* 0 - top-left origin,1 - bottom-left origin (Windows bitmaps style) */int align; /* Alignment of image rows (4 or 8).OpenCV ignores it and uses widthStep instead */int width; /* image width in pixels */int height; /* image height in pixels */struct _IplROI *roi;/* image ROI. if NULL, the whole image is selected */struct _IplImage *maskROI; /* must be NULL */void *imageId; /* ditto */struct _IplTileInfo *tileInfo; /* ditto */int imageSize; /* image data size in bytes(==image->height*image->widthStepin case of interleaved data)*/char *imageData; /* pointer to aligned image data */int widthStep; /* size of aligned image row in bytes */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之间信息的拷贝。

相关主题