第三章VC++9.0图像编程基础课件.ppt

上传人:小飞机 文档编号:3968407 上传时间:2023-03-29 格式:PPT 页数:43 大小:1.65MB
返回 下载 相关 举报
第三章VC++9.0图像编程基础课件.ppt_第1页
第1页 / 共43页
第三章VC++9.0图像编程基础课件.ppt_第2页
第2页 / 共43页
第三章VC++9.0图像编程基础课件.ppt_第3页
第3页 / 共43页
第三章VC++9.0图像编程基础课件.ppt_第4页
第4页 / 共43页
第三章VC++9.0图像编程基础课件.ppt_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《第三章VC++9.0图像编程基础课件.ppt》由会员分享,可在线阅读,更多相关《第三章VC++9.0图像编程基础课件.ppt(43页珍藏版)》请在三一办公上搜索。

1、第三章 VC图像编程基础,3.1 VC+可视化编程3.2 位图基础3.3 设计CImage类 3.4 使用CImage类 3.5 图像的显示3.6 CImage类应用实例,3.1 VC+可视化编程,3.1.1 概述 VC+是Microsoft公司推出的开发Win 32应用程序的面向对象的可视化集成工具。VC+提供了Microsoft基础类库(MFC),对Windows 所用的Win 32应用程序接口(API)进行了彻底的封装,从而可以使用面向对象的方法来进行Win 32应用程序的开发。优点:大大缩短了应用程序开发周期,降低了开发成本,也将程序员从大量的复杂劳动中解放出来。,VC+包含源代码文本

2、编辑器、设计用户界面(菜单、对话框、图标等)的资源编辑器、项目管理器、检查程序错误的集成调试器等工具。它还提供了功能强大的应用程序向导工具AppWizard和类向导工具ClassWizard。AppWizard用于生成各种不同类型的具有Windows界面风格的应用程序的基本框架;在生成应用程序框架后,使用ClassWizard便可轻松完成创建新类、定义消息处理函数、重载虚拟函数等操作。,3.1.2 用户界面,图3-1 VC+6.0用户界面,用VC+6.0开发应用程序主要涉及三大类型的文件:文件(Files)、项目(Projects)和工作区(Workspaces)。在VC+6.0中,通常意义下

3、开发一个Windows应用程序是指生成一个项目,该项目包含着一组相关的文件,如各种头文件(.h)、实现文件(.cpp)、资源文件(.rc)、图标文件(.ico)、位图文件(.bmp)等,而该项目必须在一个工作区打开。当第一次建立一个应用程序时,应选择新建一个项目,此时VC+6.0自动建立一个工作区,并把新建的项目在该工作区中打开,以后要对该项目进行修改、补充、增加等工作,只要打开对应的工作区即可。,VC+6.0以项目工作区(Project Workspace)的方式来组织文件、项目和项目配置,通过项目工作区窗口可以查看和访问项目中的所有元素。首次创建项目工作区时,要创建一个项目工作区目录、一个

4、项目工作区文件、一个项目文件和一个工作区选项文件。项目工作区文件用于描述工作区及其内容,扩展名为.dsw。项目文件用于记录项目中各种文件的名字和位置,扩展名为.dsp。工作区选项文件用于存储项目工作区设置,扩展名为.opt。,项目工作区窗口主要由三个面板构成,即FileView、ResouceView和ClassView,分别用于显示项目中定义的C+类、资源文件和包含在项目工作区中的文件。每个面板用于指定项目工作区中所有项目的不同视图,视图中每个文件夹可以包含其他文件夹或各种元素(如,子项目、文件、资源、类和标题等)。通过项目工作区窗口可以定位到项目中的任一位置,以对其进行相应的编辑(源程序、

5、资源等),文本编辑器的使用与Word非常类似,通过它可方便的进行程序源代码的输入、编辑和修改工作。在资源编辑器中可进行各种资源的编辑工作,如对话框、图标、菜单、位图等,从而直观地设计程序的用户界面。输出窗口用于显示项目建立过程中所产生的错误信息、调试过程中的输出信息等,用它可以方便地定位到工程中的错误位置,观察到程序调试过程中的输出结果。,3.1.3 框架和文档视结构 基于MFC的应用程序框架是VC+编程的骨架。运用MFC应用程序框架具有如下优点:(1)标准化的程序结构和用户接口:这对具有标准用户界面的Win 32程序来说,可以极大地减轻程序员的负担,使程序员不必过多地考虑界面,而把主要精力放

6、在程序设计上,以提高程序设计的效率。(2)框架产生的程序代码短,运行速度快,具有很大的灵活性。(3)MFC封装了Win 32 SDK中的几乎所有的函数,能够实现Win 32系统的任何功能。,MFC框架的核心是文档视结构(Document-View Architecture)。简单地说,文档视结构就是将数据和对数据的观察相分离,文档仅处理数据的读、写等操作,视则是显示和处理数据的窗口,视可以操作文档中的数据。MFC框架的基本结构包括应用程序对象、主框架窗口、文档、视等,框架通过命令和消息将它们结合在一起,共同对用户的操作做出响应。应用程序的对象类由CWinApp派生,一个应用程序有且仅有一个应用

7、程序对象,它负责应用程序实例的初始化和进程结束时的资源清除,以及创建和管理应用程序所支持的所有文档模板的工作。,主框架窗口是应用程序的主窗口。MFC框架定义了两种基本的主框架窗口类,即单文档接口SDI(Single Document Interface)主框架窗口类和多文档接口MDI(Multiple DocumentInterface)主框架窗口类。对于SDI,视是主框架窗口的子窗口;对于MDI,必须从CMDIChildWnd派生出主框架窗口的子窗口,视是该子窗口的子窗口。,文档类由CDocument类派生,文档是一个应用程序数据元素的集合,它构成应用程序所使用的数据单元,另外,它还提供了管

8、理和维护数据的手段。文档是一种数据源,数据源有很多种,最常见的是磁盘文件,但它不一定是一个磁盘文件,文档的数据源也可以来自串行口、网络或摄像机输入信号等。,视类从CView或其子类(CEditView、CFormView、CRecordView、CScrollView等)派生,是数据的用户窗口,为用户提供了文档可视的数据显示,它将文档的部分或全部内容显示在窗口中。视还给用户提供了一个与文档中的数据进行交互的界面,它把用户的输入转化为对文档中数据的操作。每个文档都会有一个或多个视显示,一个视既可以输出到屏幕窗口中,也可以输出到打印机上。,图3-2 MFC应用程序框架结构(a)SDI框架结构;(b

9、)MDI框架结构,文档视结构大大简化了多数应用程序的设计开发过程。它带来的好处主要有:(1)将数据操作和数据显示、用户界面分离。这是一种“分而治之”的思想,这种思想使得模块划分更加合理、模块独立性更强,同时也简化了数据操作和数据显示、用户界面设计工作。文档只负责数据管理,不涉及用户界面;视只负责数据输出与用户界面的交互,可以不考虑应用程序的数据是如何组织的,甚至当文档中的数据结构发生变化时也不必改动视的代码。,(2)MFC在文档视结构中提供了许多标准操作界面,包括新建文件、打开文件、保存文件、打印等,减轻了用户的工作量。用户不必再编写这些重复的代码,从而可以把更多的精力放到编写应用程序特定功能

10、的代码上(主要是从数据源中读取数据和显示)。,(3)支持打印和打印预览,用户无需编写代码或只需要编写很少的代码,就可以为应用程序提供打印和打印预览功能。同样的功能如果自己写的话,需要数千行代码。由于文档视结构功能强大,因此一般用VC+进行程序设计时都首先使用AppWizard生成基于文档视结构的单文档或多文档应用程序框架,然后在其中添加自己需要的代码,完成应用程序的特定功能。,3.1.4 编程基本流程 用VC+进行Win 32可视化编程的基本流程如下:(l)生成框架:运行AppWizard,并按需要指定生成应用程序的选项,指定框架中视类的基类(CView、CEditView、CFormView

11、、CScrollView、CTreeView等)。AppWizard将按指定的选项生成应用程序框架和相关的文件,包括项目(project)的工作空间(workspace)文件和源文件,主要是应用程序(application)、文档(document)、视(view)和主框窗口(main frame)的C+代码文件(*.cpp,*.h文件),以及缺省包含标准界面接口的资源文件(*.rc)。,(2)设计用户界面:利用VC+资源编辑器编辑资源文件,设计菜单、对话框、工具条、字符串、加速键、位图、图标、光标等项目资源。(3)联接界面和代码:利用ClassWizard把资源文件中定义的界面资源标识ID(

12、如菜单项、工具条和对话框中的控件等)在指定的源文件中映射成相应的函数模板。(4)编写、修改函数代码:利用ClassWizard可以方便地在源代码编辑器(source code editor)中跳转到指定的函数代码处。,(5)根据需要创建新类和编写代码:用ClassWizard创建新类,并生成相应的源文件。如新类是对话框类,可先用资源编辑器生成对话框模板,然后用ClassWizard创建对话框类代码,并与模板联接,编写新类相关的源代码。(6)实现文档类:在AppWizard生成的框架基础上设计文档数据的数据结构,在文档类中增加相应的成员变量和成员函数,实现对数据的操作和文档与数据的接口。,(7)

13、实现框架中标准的文件操作命令,即Open、Save和Save As命令:框架已完成标准的文件操作命令的所有接口,程序员要做的仅仅是编写文档类的串行化(Serialize())成员函数。(8)实现视类:框架已构造好了文档与视的关系,视能方便地访问文档中的public数据成员,可根据文档的需要构造一个或多个视类。通过ClassWizard把视的用户接口资源映射成函数模板,并编写函数代码。,(9)如需要,增加分割窗口(splitter window):在SDI的主框窗口类或MDI的子窗口类中添加一个CSplitterWnd对象,并在窗口类的OnCreateClient成员函数中对CSplitterW

14、nd对象进行创建和初始化。如果用户分割了一个窗口,框架将给文档创建并增加附加的视对象。(10)建立、调试、修改应用程序。如有问题,可根据需要重复步骤(2)(10)。(11)测试应用程序。如有问题,可根据需要重复步骤(2)(11)。(12)结束。,3.2 位图(bitmap)基础,Vc+中(Windows系统)把位图分为两类:设备相关位图和设备无关位图。3.2.1 与设备相关位图(DDB)与设备相关位图是一种内部位图格式,它显示的图像依计算机显示系统的设置不同而不同,因此一般不存储文件。结构BITMAP定义了DDB位图的类型、宽度、高度、颜色格式和像素位值。该结构在Windows.h中定义如下(

15、MSDN中可以查到):,Typedef struct tagBITMAP int bmType;/位图类型,必须为0 int bmWith;/宽度 int bmHeight;/高度 int bmWidthBytes;/每一扫描行字节数 BYTE bmPlanes;/颜色层数 BYTE bmBitsPixel;/每一像素所占的位数 LPVOID bmBits;/存放像素值内存块地址 BITMAP;,Windows SDK提供了标准的DDB位图操作数,MFC中定义了CBitmap类来说明DDB位图,CBitmap类封装的主要函数:LoadBitmap():从应用程序的资源中装入位图资源。Creat

16、eBitmap():用指定了宽、高和位图模式的内存位图来创建位图。CreateCompatibleBitmap():创建与指定设备兼容的位图。GetBitmap():从位图中获取信息 SetBitmapBits():用指定的图像位来设置位图的位值。,3.2.2 设备无关位图(DIB),设备无关位图(DIB)可以在不同的机器系统中显示位图所固有的颜色,属于一种外部的位图格式,与硬件无关,存储文件格式的后缀为.bmp;BMP文件组成(分别使用MSDN查看!)文件头结构BITMAPFILEHEADER位图信息头结构BITMAPINFOHEADER颜色信息表RGBQUAD图像像素数据,3.3 CIma

17、ge 类介绍,数字图像处理编程一般用VC+编程环境,VC+环境是一个非常优秀的编程环境,非常适合图像处理编程,它集成了C/C+,并且提供了很多实用的框架,能快速的进行工程开发。在VC+6.0及以下版本中没有专门的图像处理类,但有几个用于图像处理的API函数,使用起来不是很方便,需要用户自己封装专门的图像处理类。从VC+.NET开始的版本提供了一个跟图像有关的类CImage类,这个类封装了跟图像有关的很多操作。,CImage类的成员可分为连接与创建、输入与输出、位图类型与参数,以及图形绘制与位图块传送等4类。1.连接与创建Attach()将一个DIB(或DDB)位图与CImage对象相连接;De

18、tach()位图与CImage对象相分离;Create()创建一个DIB位图并将它与已有CImage对象相连接;Destroy()位图与CImage对象相分离并删除;,2.输入与输出GetImporterFilterString()返回系统支持的输入文件格式类型及其描述;GetExporterFilterString()返回系统支持的输出文件格式类型及其描述;Load()读入指定图像文件中的图像;LoadFromResource()读入指定资源文件中的图像;Save()按指定类型保存图像,文件名中不能省略后缀;IsNull()判别源图像文件是否已经读入;,3.位图类型与参数GetWidth()

19、返回当前图像的宽度(以像素为单位);GetHeight()返回当前图像的高度(以像素为单位);GetBPP()返回当前图像的每个像素的位数;GetBits()返回当前图像像素数据的指针 GetPitch()返回相邻两行像素首地址之间的间隔;,GetPixelAddress()返回指定像素数据存放位置的存储地址;GetMaxColorTableEntries()返回调色板单元数;IsDibSection()确定位图是否为DIB位图;IsIndexed()判别位图中是否有调色板;IsTransparencySupported()判别应用程序是否支持透明位图;AlphaBlend()是否支持透明或半

20、透明显示的状态;,4.图形绘制与位图块传送GetDC()返回当前位图的设备描述表;ReleaseDC()释放设备描述表;GetPixel()返回指定位置像素的颜色;SetPixel()设置指定位置像素的颜色;SetPixelIndexed()设置指定位置像素颜色的索引值;SetPixelRGB()设置指定位置像素的红绿蓝分量;GetColorTable()获取调色板颜色分量(红、绿、蓝)值;SetColorTable()设置调色板颜色分量(红、绿、蓝)值;,SetTransparentColor()设置透明颜色的索引值,只能有一种颜色可为透明;Draw()从源矩形复制到目标矩形,支持伸缩、融合

21、与透明;BitBlt()从位图的一个矩行区域复制到另一位图上的指定区域;MaskBlt()位图块传送时须与指定的模板图像做逻辑操作;PlgBlt()从位图的矩形区域到另一位图上平行四边形间的位块传输;StretchBlt()从源矩形复制到目标矩形,支持伸缩;TransparentBlt()位图块传送时复制到透明色的位图;,3.6 CImage类应用实例:实验一,3.6.1 建立应用程序框架(见实验指导书),图像处理软件包-OpenCV,什么是OpenCVOpenCV是Intel公司开发的开源计算机视觉库。它由一系列 C 函数和少量 C+类构成,实现了图像处理和计算机视觉方面的很多通用算法。重要

22、特性OpenCV 拥有包括 300 多个C函数的跨平台的中、高层 API。它不依赖于其它的外部库尽管也可以使用某些外部库。OpenCV 对非商业应用和商业应用都是免费(FREE)的。(细节参考 license)。OpenCV 为Intel Integrated Performance Primitives(IPP)提供了透明接口。这意味着如果有为特定处理器优化的的 IPP 库,OpenCV 将在运行时自动加载这些库。更多关于 IPP 的信息请参考:http:/,谁创建了它作者列表可以在文件AUTHORS中找到。此外,还有很多人给出了建议、补丁、BUG 报告等等。一个不太完整的列表在文件THAN

23、KS中。很多“雷锋”式的热心人的奉献还在继续完善之中常用的版本OpenCV2.3.1,大量C+类函数目前最新版本:OpenCV2.4,OpenCV2.3.1介绍,Mat类简介在2001年刚刚出现的时候,OpenCV基于 C 语言接口而建。为了在内存(memory)中存放图像,当时采用名为 IplImage 的C语言结构体,时至今日这仍出现在大多数的旧版教程和教学材料。但这种方法必须接受C语言所有的不足,这其中最大的不足要数手动内存管理,其依据是用户要为开辟和销毁内存负责。虽然对于小型的程序来说手动管理内存不是问题,但一旦代码开始变得越来越庞大,你需要越来越多地纠缠于这个问题,而不是着力解决你的

24、开发目标。,OpenCV在2.0版本中引入了一个新的C+接口,利用自动内存管理给出了解决问题的新方法。Mat最大的优势跟STL很相似,使用这个方法,你不需要纠结在管理内存上,而且你的代码会变得简洁(少写多得)。但C+接口唯一的不足是当前许多嵌入式开发系统只支持C语言。所以,当目标不是这种开发平台时,没有必要使用旧方法。同时Mat结构可以方便的进行矩阵的运算。关于 Mat,首先要知道的是(1)不必再手动地为其开辟空间(2)不必在不需要时立即将空间释放。但手动地做还是可以的。,基本上讲 Mat 是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的

25、矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。(注:当在程序中传递图像并创建拷贝时,大的开销是由矩阵造成的,而不是信息头。)OpenCV是一个图像处理库,囊括了大量的图像处理函数,为了解决问题通常要使用库中的多个函数。同时不要忘了我们正在讨论的是计算量很大的图像处理算法,因此,除非万不得已,我们不应该拷贝大 的图像,因为这会降低程序速度。,为了搞定这个问题,OpenCV使用引用计数机制。其思路是让每个 Mat 对象有自己的信息头,但共享同一个矩阵。这通过让矩阵指针指向同一地址而实现。而拷贝构

26、造函数则 只拷贝信息头和矩阵指针,而不拷贝矩阵。如果一定要拷贝图像数据本身的话,可以使用Mat类的clone()或者 copyTo()方法。总结两点:(1)赋值运算符和拷贝构造函数(ctor)只拷贝信息头。(2)使用函数 clone()或者 copyTo()来拷贝一副图像的矩阵本身。),详细内容参考“opencv_tutorials.pdf”文档,人有了知识,就会具备各种分析能力,明辨是非的能力。所以我们要勤恳读书,广泛阅读,古人说“书中自有黄金屋。”通过阅读科技书籍,我们能丰富知识,培养逻辑思维能力;通过阅读文学作品,我们能提高文学鉴赏水平,培养文学情趣;通过阅读报刊,我们能增长见识,扩大自己的知识面。有许多书籍还能培养我们的道德情操,给我们巨大的精神力量,鼓舞我们前进。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号