基于vc的图像特效显示研究_毕业设计(编辑修改稿)内容摘要:
Microsoft Visual C++ 环境 Visual C++ ,简称 VC 或者 , 是 微软 推出的一款 C++编译器 ,将“高级语言”翻译为“ 机器语言 (低级语言)”的程序。 Visual C++是一个功能强大的可视化 软件开发工具。 自 1993 年 Microsoft 公司推出 Visual C++ 后,随着其新版本的不断问世, Visual C++已成为专业 程序员 进行 软件 开发的首选工具。 虽然微软公司推出了 Visual 基于 VC++的图像特效显示研究 7 C++.NET(Visual C++),但它的应用有很大的局限性,只适用于Windows 20xx、 Windows XP 和 Windows。 所以实际中,更多的是以 Visual C++ 为平台。 MFC 简介 微软 基础类 (Microsoft Foundation Classes),同 VCL 类似,是一种应用程序框架,随微软 Visual C++开发工具发布。 目前最新版本为 (截止 20xx 年 3 月),并且发布了中文版。 该类库提供一组通用的可重用的类库供开发人员使用,大部分类均从 CObject 直接或间接 派生 ,只有少部分类例外。 MFC 实际上是微软提供的,用于在 C++环境下编写应用程序的一个框架和 引擎。 VC++是 Windows 下开发人员使用的专业 C++ SDK(SDK,Standard SoftWare Develop Kit,专业 软件 开发平台 ), MFC 就是挂在它之上的一个辅助软件开发包。 MFC 作为与VC++血肉相连的部分 (注意 C++和 VC++的区别: C++是一种 程序设计语言 ,是一种大家都承认的软件编制的通用规范;而 VC++只是一个 编译器 ,或者说是一种编译器 +源程序 编辑器 的 IDE( IDE 的英文全称为“ Integrated Development Environment”,即“集成开发环境”。 ), WSPlatForm,这跟 Pascal 和 Delphi 的关系一个道理。 Pascal是 Delphi 的语言基础, Delphi 使用 Pascal 规 范来进行 Win 下应用程序的开发和编译,却不同于 Basic 语言和 VB 的关系。 Basic 语言在 VB 开发出来被应用的年代已经成了 Basic 语言的新规范, VB 新加的 Basic 语言要素,如 面向对象程序设计 的要素,是一种性质上的飞跃,使 VB 既是一个 IDE,又成长成一个新的程序设计语言 )。 MFC 同 VC++集成的 VCL 一样是一个非外挂式的 软件包 类库,只不过 MFC 类是微软为 VC++专配的。 图形设备接口 、 GDI 对象 以往许多 MSDOS 程序采用直接向视频存储区或打印机端口输送数据,这种做法不利之处是需要各种显示卡 (低分辨率彩色图形显示卡、加强图形显示卡、图像图形阵列以及 VGA)或打印机驱动程序,支持所有这些设备意味着要用大量的编程来包含这些驱动程序 (为每一 基于 VC++的图像特效显示研究 8 个设备编定不同的代码 )。 为了减轻开发程序的难度, Windows 提供了一个抽象的接口,图形 设备接口 Graphics Device Interface(GDI)。 另外Windows 还提供了各种显示卡及打印机的驱动程序,这样在写程序时就可以不必关心显示卡和打印机的类型,简化了程序开发的难度。 GDI 是个抽象的概念, GDI 接口是微软公司提供的一组绘图函数,通常称之为 GDI 函数,使用这些函数可以绘制各种图形。 MFC 类库对 GDI函数进行封装,将其封装为不同的 GDI 对象,采用 GDI 对象进一步简化了图形、图像处理程序的开发难度。 常用到的 GDI 对象有: : 笔是一种用来画线及绘制有形边框的工 具,可以指定它的颜色及厚度,并且可以指定它画实线、点线或虚线; : 刷子定义了一种位图形式的像素,利用它可对区域内部填充颜色; : 位图是一种位矩阵,每一个显示像素都对应于其中的一个或多个位。 可以利用位图来表示图像,也可以利用它来创建刷子; : 区域是由多边形、椭圆或二者组合形成的一种范围,可以利用它来填充、裁剪以及鼠标点中测试; : 字体是一种具有某种风格和尺寸的所有字符的完整集合,它常常被当作资源存于磁盘中,其中有一些还 依赖于某种设备; : 调色板是一种颜色映射接口,它允许应用程序在不干扰其他应用程序的前提下,充分利用输出设备的颜色描绘能力。 OpenCV 的简介 OpenCV 概述 penCV 于 1999 年由 Intel 建立,如今由 Willow Garage 提供支持。 OpenCV 是一个基于(开源)发行的跨平台计算机视觉库,可以运行在 Linux、 Windows 和 Mac OS 操作系统上。 它轻量级而且高效 ——由一系列 C 函数和少量 C++ 类构成,同时提供了 Python、 Ruby、MATLAB 等语言的接口,实现了 图像处理 和计算机视觉方面的很多 基于 VC++的图像特效显示研究 9 通用算法。 OpenCV 拥有包括 300 多个 C 函数的跨平台的中、高层 API。 它不依赖于其它的外部库 —— 尽管也可以使用某些外部库。 OpenCV 为 Intel Integrated Performance Primitives (IPP) 提供了透明接口。 这意味着如果有为特定处理器优化的的 IPP 库, OpenCV 将在运行时自动加载这些库。 OpenCV 的特点 计算机视觉市场巨大而且持续增长,且这方面没有标准 API,如今的计算机视觉 软件 大概有以下三种: (慢,不稳定,独立并与其他库不兼容) (比如 Halcon, MATLAB+Simulink) (比如 视频监控 ,制造 控制系统 ,医疗设备 ) ,这是如今的现状。 而 标准的 API 将简化计算机视觉程序和解决方案的开发。 OpenCV 致力于成为这样的标准 API。 OpenCV 致力于真实世界的实时应用,通过优化的 C 代码的编写对其执行速度带来了可观的提升,并且可以通过购买 Intel 的 IPP 高性能多媒体函数库 (Integrated Performance Primitives)得到更快的处理速度。 右图为 OpenCV 与当前其他主流视觉函数库的性能比较。 基于 VC++的图像特效显示研究 10 3 常见的图像特效显示 本章主要研究了目前比较流行的图像特效显示中的 栅条显示、 马赛克显示、移动显示特效和百叶 窗显示特效的效果,分析其实用性并对相关算法进行优化改进。 显示特效方法理论概述 特效显示基础 扫描显示图像是最基本的特效显示方法,可以分为上下左右四个方向的扫描显示,对于向下的显示它表现为图像一行一行的从最顶端开始显示图像直到整个图像显示出来,效果有点像拉幕布的感觉。 图像显示特效主要包括显示和擦出两大部分。 显示特效就是利用特效将图像显示在屏幕上的过程,而擦出是显示的逆过程 —— 利用特效将图像还原为背景色。 特效实现的原理是图像分块显示,简单说来,就是将图像分成不同的小块,按照一定的方向、顺序 先后显示在屏幕上。 显示特效过程 其实现方法为:取图像最上面一行像素点显示出来,再加上时间延迟,再取剩下的图像部分中的最上面一行,如此循环,直至整个加载入设备内存中的图像显示完成。 显示特效的整个过程如图 : 基于 VC++的图像特效显示研究 11 图 显示特效的过程 显示特效类 其关键实现代码如下: int SleepTime=20。 int temp=10。 for(UINT y=0。 y。 y+=1) { thisStretchBlt(IncX, IncY+y, //显示在设备上的起点 x,y坐标 ,temp, //显示在设备上的宽度和高度 amp。 dc, //源位图设备情境对象 0, y, //提取源位图中显示区起点 x,y坐标 基于 VC++的图像特效显示研究 12 ,1,//提取源位图像素宽高 SRCCOPY)。 显示模式 Sleep(SleepTime)。 //时间延迟 SleepTime 默认为 20 } 栅条显示 栅条显示特效的特效预览 栅条 显示特效的特效如图 所示: 图 栅条 显示运行效果图 基本原理和实现方法 栅条显示即交错显示。 垂直交错效果表现为:设备上端下端各出现一幅由横向线条组成的图像相对移动,直至两图像刚好重叠成一幅完整清晰的图 像。 其实现方法为:分别取待显示位图的奇数行和偶数行做为向上和向下的两幅图,分别向上和向下移动,直至显示到待定的位置,此时两图刚好组合成一幅完整的图像。 栅条显示的基本原理如表 : 基于 VC++的图像特效显示研究 13 表 编程实现 类别 说明 图像分块 将图像按照一定宽度分成横向的图像块。 图像块的编号从上到下分别为 3......n 显示顺序 编号为奇数的图像块从左向右移动,编号为偶数的图像块从右向左移动 显示方法 ① 将 编号为技术的图像块向左移动距离 i,所有编号为偶数的图像块向右移动距离 i。 ② 延时 ③ 如果 i 不等于 nWidth,则使 i 加 1,重复步骤 ① 栅条实现代码如下: int i,j。 int buf=1。 //栅条的高度 取奇数跟偶数号行时用 1 int SleepTime=10。 //时间延迟 int low_height=(*buf)。 int temp_height= (*2)*buf。 //当 buf!=1 时 取偶数根 buf 高度像素条后剩下的最小高度 //用于放置在最下面到最后显示出来 使不影响整体效果 if(low_height0) thisStretchBlt(IncX,IncY+, low_height, amp。 dc,0,0,low_height,SRCCOPY), Sleep(speed*buf)。 //对上面提及的 low_height 高度像素条区域置图像 for(i=1。 i=。 i++){ for(j=i。 j=1。 j) { thisStretchBlt(IncX,IncY+(j1)*2*buf,buf, amp。 dc, 基于 VC++的图像特效显示研究 14 0,()*2*buf+(j1)*2*buf,buf,SRCCOPY)。 thisStretchBlt(IncX,IncY+temp_height(2*j1)*buf,buf, amp。 dc, 0,(ij)*2*buf+buf,buf,SRCCOPY)。 //对上下出现的栅条进行相对移动 } thisStretchBlt(IncX,IncY+, ,low_height, amp。 dc, 0,i*2*buf,low_height,SRCCOPY)。 //对由于 buf!=1 时产生的图像最后空隙进行填补 //填补的高度与上面的 buf 不同 Sleep(SleepTime*buf)。 } thisBitBlt(IncX,IncY,amp。 dc,0,0,SRCCOPY)。 //对整个图像显示的最后一次产生的空隙进行填补 马赛克显示特效 马赛克显示特效的特效预览 马赛克显示特效如图 所示 : 基于 VC++的图像特效显示研究 15 图 马赛克特效显示运行效果图 基本原理和实现方法 就用 RGB 来举例子, R( red 红色), G( green 绿色), B( blue蓝色)。 这三种颜色每种都有 0~255 范围内的强度值,数字越高越亮,例如,亮红色使用 R 值 25 G 值 0 和 B 值 0,有色光可被无色光冲淡并变亮。 如蓝色光与白光相遇,结果是产生更加明亮的浅蓝色光。 所以 R、 G、 B的值的不同来混合颜色。 例如一张图片,他们当中是有很多不同颜色的小色块的,由于这些色块的像素非常非常的小而且密密麻麻的,而打马赛克就是圈出一个范围( 小色块为整数的范围,所以一般都用长方形或正方形去圈),把在圈内的小色块的 R 值全加。基于vc的图像特效显示研究_毕业设计(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。