1.3 视觉计算软件开发平台
1.3.1 可视化集成开发环境(IDE)
在程序设计的早期阶段,程序员需要借助不同的软件来编写程序,程序员在编程的过程中首先需要用文本编辑软件进行,然后通过编译器软件进行编译,用调试器软件进行调试。因此,在软件过程中,程序员往往需要在不同的软件间来回切换。比如当程序员发现程序执行的结果有错误的时候,他会通过调试器来跟踪程序执行的过程,发现出错的地方后,需要返回文本编辑器对源程序进行修改;修改后的源程序需要再次编译形成可执行文件;如果发现新的可执行程序还出现错误,程序员需要再次进行调试。因此,不同的软件间切换的过程会贯穿软件开发过程中代码实现的整个环节。这无疑给程序员带来了诸多不便,严重影响了软件开发的效率。
因此,如果有一个工具,能将软件开发过程中的代码编辑、编译、调试等功能集成在一个软件中,程序员不需要在不同的软件间来切换,代码的编辑、编译、调试的功能可以无缝的衔接在一起。比如,在这种软件工具中,程序员通过调试发现代码有错的时候,他能够马上对错误的代码进行编辑修改、再编译、调试。相比早期的程序开发而言,程序员会节省大量的时间,使得程序员将更多的经历集中在程序代码的逻辑结构上而不会分散太多的注意力在软件工具的来回切换和使用上。
集成开发环境就是具有上述特点的一个软件工具。集成开发环境(Integrated Development Environment,简称 IDE,也有人称为Integration Design Environment、Integration Debugging Environment)是一种辅助程序开发人员开发软件的应用软件。它将代码编辑、编译、调试的过程集成在一个完整的软件工具中,使得开发过程变得简单明了。大大的提高了软件开发工作人员的工作效率,使得编程的工作变得更加轻松、愉悦。
IDE通常包括编程语言编辑器、编译器/解释器、通常还包括调试器。有时还会包含版本控制系统和一些可以设计图形用户界面的工具。虽然目前有一些IDE支持多种编程语言(例如Eclipse*、NetBeans*、Microsoft Visual Studio*)。
Microsoft Visual Studio是微软公司推出的集成开发环境,是目前最流行的 Windows 平台应用程序开发环境。目前已经开发到 9.0 版本,也就是 Visual Studio 2008。早期的Visual Studio版本中主要有Visual Basic和Visual C++两种程序开发语言,随后,微软引入了建立在 .NET 框架上的托管代码机制以及一门新的面向对象语言 C#(最新的C#语言的版本是3.5),原先的Visual Basic也进化成完全支持面向对象的编程语言Visual Basic .NET。
在Visual Studio的开发环境中,我们可以很方便的建立工程、编辑和组织代码、通过图形用户界面设置编译选项、调试等。Visual Studio将这些功能集成在一起,程序员可以通过图形用户界面很方便的设置相应的功能,特别熟练的程序员还可以通过很多的快捷键来完成任务,使得程序开发的工作方便、快捷。Visual Studio还提供了很有特色的功能,比如智能代码预测功能(Intel® liSense),程序员在代码编辑的时候仅仅只需要输入少量字符,系统会提供较好的预测,帮助自动键入相应的代码,可以减少程序员编辑代码的时间和输入错误。
本书的所有代码示例,都是通过Visual Studio 2008来开发完成的。
1.3.2 控制台应用程序开发
现有的软件开发中,很多的应用都是需要开发图形用户界面(GUI)的,在早期,开发图形用户界面是非常冗繁的工作,窗口的大小、位置、菜单等的摆放等都需要程序员用代码来规定和实现。为了使程序员摆脱这些千篇一律的工作,加快工作效率,很多的集成开发环境提供了可视化编程环境。比如,在Visual Studio中,程序员可以通过界面编辑器拖放相应的界面元素(如按钮,菜单、文本框等)到窗口上,很快的设计出界面的各种布局、通过所见即所得的方式(what you see is what you get,程序运行的界面效果等同于设计时的界面),很容易使得界面的设计达到理想的效果。
相对而言,控制台应用程序比较简单,一般没有独立的窗口,在命令行运行。控制台程序的输入输出通过标准IO进行,而不像界面程序可以通过鼠标点击进行操作。一般后台运行(不需要界面显示)的程序可作为控制台应用程序。因此控制台应用程序无需使用任何图形用户界面即可读取标准输入和输出 (I/O) 中的数据并向其写入数据。
开发底层,游戏等(包括后台程序)的时候通常用到控制台程序来编写,一般在学校教学时,老师们初期讲语法,流程时也用到控制台应用程序。
1.3.3 Intel® C++编译器
在计算机技术发展的早期,控制计算机所用的机器所能够处理的机器语言(0,1代码)。虽然计算机能够很好的处理机器语言,但是机器语言对与计算机工程师或科研工作者来说,太过抽象,不容易理解,且编写起来很困难。因此,计算机的先驱们发明了高级程序语言。高级程序语言是方便人们编辑、阅读和维护的程序语言,它摆脱了0,1机器语言的束缚,使得程序的代码更加注重于实际应用的逻辑,方便了程序设计的过程。但是,高级程序语言又并不是计算机能够识别并能执行的语言。因此,必须有一种程序,它能起到从高级语言翻译到计算机所能识别的低级语言的作用,我们将这样的程序称为编译程序,将实现这样程序的软件通常称为编译器。
高级语言有很多种,最早的高级语言是Fortran语言,其主要的目的是用来科学计算,后来又出现了C语言。这些语言都是面向结构的程序语言。在国内,已故的国防科技大学中科院院士陈火旺教授是编译原理的先驱,他于上世纪70年代独立自主的实现了国内的首个Fortran语言的编译器。C++是面向对象的高级程序语言。它是C语言的超集(兼容C语言的所有功能)。市场上有很多公司各自推出的C++的编译器,主要有Microsoft 的C++编译器,Borland公司的C++编译器和英特尔公司的C++ 编译器。编译器的不同在于其支持不同的特色功能和生成的目标代码的质量上。
英特尔编译器可提升软件的性能。它能够针对不同CPU型号来生成更有效率的代码,并且通过自动并行处理机制来优化代码,帮助程序员以较快的速度来运行软件。同时,英特尔编译器与其他工具保持兼容,可以集成到广泛使用的开发环境,比如,英特尔编译器能够方便的集成到Visual Studio集成开发环境中。
1.3.4 Intel® Debugger调试工具
在程序编写的过程中,错误是在所难免的。我们将程序的错误分为语法错误和语义错误两大类,语法错误通常是指用户输入错了关键词和变量名等,使得编译器不能正确解释程序员的代码,因此不能生成目标代码。编译器都能够指出程序员的语法错误出在什么地方,因此程序员很容易定位并能够修改语法错误。语义错误是更难修改的一类错误(俗称Bug),很多情况下是因为程序员在代码输入的时候不小心使得代码出现逻辑错误(如代码“a==b” 错误地写成了“a=b”),这类错误在代码进行编译的时候是不能被发现的,这样的程序能够执行,只是在执行的时候并不是按照程序员本来的意图来执行,结果也自然会出现错误,甚至在某些状况下会出现严重的损失(导致程序非法退出等)。因此,这类错误的危险性更大。
如果程序员能够跟踪代码的执行过程,从而发现并修改程序执行中出现的语义错误(俗称Debug)。这将是一个非常关键的功能,编译器工具Debugger(调试器)提供了此类功能,程序员可以通过调试器一步一步跟踪代码的执行过程,或者设置断点(程序会在断点处停留下来让程序员观察程序执行的状态,如一些变量值等)来跟踪程序的运行,从而最终定位并修改程序中出现的语义错误。
在安装英特尔的编译器时可以选择是否安装Intel® Debugger。
1.3.5 Intel® VTune性能分析器
程序员们应该非常清楚,在很多场合,仅仅写出能够正确处理的程序时不够的,很多场合下,程序的性能非常关键,特别是在大数据量处理的环境下,好的算法程序有时候在时间上会有几个数量级的提高。但是程序员写程序的过程是一个递进的过程,开始写出的程序其性能并不是最优的。因此,如果有一个工具能够发现程序执行的过程中的瓶颈(比如找到执行最长时间的函数),并且对整个程序的运行过程进行分析,用图形化的结果显示出来,将对程序员是一个非常大的帮助。
英特尔公司提供的VTune性能分析器是一个强大的性能分析和优化工具,它能确定你的程序的hotspot(执行最长时间的函数),帮助你找到导致性能不理想的原因,从而让你能据此对程序进行优化。该工具支持不同的操作系统,在Windows系统下,最新的有Intel® VTune Performance Analyzer 9.1版本。该版本已经集成到Visual Studio集成开发环境中,使用图形界面,支持英特尔最新的四核处理器。能够对程序库、驱动程序和应用程序进行性能分析。Intel® VTune 不依赖于程序语言和特定的编译器,能够对C,C++,Fortran,以及C#等编写的程序进行分析,这些程序不需要重新编译,而且分析的过程只需要极低的系统开销,便可以确定性能瓶颈。同时Intel® VTune将英特尔® 线程档案器(Intel® Thread Profiler)也包含在内,线程档案器可以帮助您调试多线程代码,从而可以在当今的多核处理器上获得最佳性能。VTune只是一个工具,它只会给出一堆数据,要靠程序员从这些数据中分析代码中哪些是程序的瓶颈,哪些是可以大大优化的,而哪些是虽然很占时间但是没有什么优化余地的。
1.3.6 Intel® Parallel Studio 并行工作室
英特尔在提供了C++的编译器、调试器和性能分析工具VTune外,近期又推出了新的软件工具包Intel® Parallel Studio。Intel® Parallel Studio是一个针对Microsoft Visual Studio C/C++开发者的综合并行开发套件,由Intel® Parallel Composer, Intel® Parallel Advisor、 Intel® Parallel Inspector和Intel® Parallel Amplifier构成,使得基于Windows的开发人员能够更加简便、快捷地创建、调试和优化多核应用软件。
图1.5 Intel® Parallel Studio 软件套件组成
Intel® Parallel Composer Intel® Parallel Composer为并行化编程提供了广泛的选择。包括编译器、库和并行化调试器。无论是串行应用软件还是并行应用软件,Intel® Parallel Composer都可以简化和加速Microsoft Visual Studio C/C++ 开发人员在多线程的工作。
Intel® Parallel Advisor Parallel Advisor可以告诉开发者哪些顺序代码可以并行执行。但Parallel Advisor并不是自动生成并行代码的灵丹妙药,它只是帮助开发者对顺序程序进行分析,从而帮助开发者决定在哪里引入并行机制,而且可以检查出将顺序代码转化为并行代码时发生的数据冲突。
Intel® Parallel Inspector Intel® Parallel Inspector为Microsoft Visual Studio C/C++ 开发人员提供了最简单的检查多线程程序错误的工具。和其它错误检查工具不同,该产品不仅速度最快,选择最多,而且可以精确找到潜在的多线程编程问题和内存错误。
Intel® Parallel Amplifier 无须了解处理器的架构和内置编码,Intel® Parallel Amplifier可以快速找到多核性能瓶颈,并为优化性能,充分利用每一个处理器的功能。
1.3.7 Intel® IPP
软件开发库(SDK,Software Development Kit) 软件开发如果没有库函数的支持,其成本将是不可想象的。以Windows系统应用开发为例,早期,如果程序员想开发windows应用程序,他可以调用Windows API(Application Programming Interface,应用程序编程接口,是一些预先定义的函数,目的是提供应用程序与开发人员来调用一些系统的功能,而又无需访问源码,或理解内部工作机制的细节),熟悉Windows API的程序员会发现,用Windows API来写应用程序的时候,编程过于复杂,需要将很多精力花费在怎样建立窗口,怎样处理消息等一系列高重复性和复杂度的工作上,程序员的工作效率较低,而且分散了程序员编程的注意力,使得他们不得不将很多的经历花在这些琐碎的细节上(API函数实在太多了,而且名称很乱,从零创建一个窗口动辄就是上百行的代码。)。为了解决这个问题,微软实现了MFC(软软基础类库,Microsoft Foundation Classes),MFC将Windows API同C++相结合,对Windows API进行了封装,大大简化了程序员的工作。STL(Standard Template Library,标准模板库)也是一个开发库,它是一个标准的C++开发包,使得程序员更容易开发标准的C++应用程序。
面向特定领域的开发库也有很多,大家都熟悉,在标准C中,有一系列的数学库函数,这些函数的声明放包含在“math.h”头文件中,市场上的库函数还有很多。我们也可以针对自己的行业需求编写自己的库函数,加快行业应用软件的开发。
图1.6 Intel® IPP的应用领域
Intel® IPP(英特尔® 集成性能元件)是一个面向多个应用领域的开发库,它支持多核CPU,是一个高度优化的函数集合(包括并行优化处理、特定处理器结构的优化等优化处理技术),能够处理包括多媒体处理(语音处理、图像处理、视频处理等)、数据处理、通信等应用。Intel® IPP提供了几千个优化的函数,这些函数涵盖多个领域的通用算法(如上图所示),这些领域包括:图像和视频、通信和信号处理、数据处理等。在Intel® Parallel Studio一节可以看出,Intel® IPP已经集成到Intel® Parallel Studio工具套件中。Intel® IPP库的目录结构如表1.1所示。
Intel® IPP的链接方式
Intel® IPP由三种函数库组成 :
对于不同的需求,这些函数库提供以下四种链接模式:
表1.1 Intel® IPP库的目录结构图
表1.2 IPP图像处理函数分类及在本书中的体现
函数分类 |
主要功能作用 |
典型函数名 |
在本书的体现 |
Image Data Exchange and Initialization Functions |
图像数据的分配、初始化、赋值、拷贝、转换 |
ippiMalloc |
2.5.2小节 |
Image Arithmetic and |
图像的算术和逻辑运算 |
IppiAnd |
2.5.3小节 |
Image Color Conversion |
颜色空间转换 |
ippiRGBToYCbCr |
2.2.4小节、2.2.5小节、2.6.2小节、3.4.2小节、4.2.2小节、4.3.3小节 |
Threshold and Compare |
阈值和比较操作 |
ippiThreshold_GT |
2.5.3小节、5.5.1小节 |
Filtering Functions |
空间滤波器、提供各种空间滤波算子(平滑、锐化)的实现 |
ippiFilter |
5.1节、5.2节 |
Image Linear Transforms |
图像线性变换,包括离散傅里叶变换(DFT)、快速傅里叶变换(FFT)和离散余弦变换(DCT)等 |
ippiFFTFwd |
2.3节、3.4节、3.5.1 |
Image Statistics Functions |
图像统计函数 |
ippiHistogramEven |
4.1、4.3.1 |
Image Geometry |
图像几何变换 |
ippiResize |
第六章 |
Image Compression |
图像压缩功能(如JPEG) |
ippiDCTQuantFwd8x8 |
3.4、3.5 |
使用动态链接方式引用IPP库时所需设置的环境变量 在Microsoft Visual Studio中,要用Intel® IPP库进行编程,首先需要安装IPP,Intel® IPP已经集成到Intel® C++ Complier中,因此,只需要安装了Intel® C++的编译器,就可以使用IPP库进行编程。编程的时候需要在Visual Studio中设置两个引用,第一个设置时引用IPP的头文件路径(Include files),设置的方法:在Visual Studio的主菜单中选择Tools > Options,Options的对话框会打开,在该对话框的左边的列表中选择Projects and Solutions>VC++ Directories,接着在右上角的“Show directories for:”选项中选择“Include files”,同时在Options对话框右边中间的选项点击空余的选项,选择Intel® IPP的安装路径下的“include”目录。第二个设置是引用Intel® IPP的链接文件的路径,其方法和引用头文件相似,只是选择在右上角的“Show directories for:”选项中选择“Library files”,同时在Options对话框右边中间的选项点击空余的选项,选择Intel® IPP的安装路径下的lib目录。
Intel® IPP函数命名规则 在本书中、图像处理的实现都是基于IPP的调用。IPP有几千个函数,为了方便程序员使用这些函数,IPP中所有的函数名都遵循统一的命名规则。程序员很容易区分信号处理(一维处理)和图形和视频处理,因为他们的前缀是不一样的。用来信号处理的函数的前缀是“ipps”(ipp signal),而用来处理图像和视频的函数的前缀是“ippi”(ipp image)。Intel® IPP中的图像处理的函数命名规则可以参考附件一。
1.3.8 Intel® MediaSDK
随着计算机硬件技术和软件技术的发展,数字媒体技术发展迅速,但是数字视频等为代表的关键技术的开发和应用有着较大的难度。如在软件开发方面,数字视频的编解码工作就是一件非常耗时、繁琐的工作。一方面,数字视频编解码本身的算法具有复杂性,而且行业内的数字视频编解码的标准也有很多;另一方面,针对不同的硬件平台的特点和优势,往往在实现上也会有所不同。因此,这种复杂性可能会迫使很多软件开发团队将精力花在这些细节上,而妨碍了它们将精力投入到产品的其它的更能吸引客户的特色上。
针对上述软件存在的问题,英特尔媒体开发库(Intel® Media Software Development Kit)提供了一个对数字视频的通用解决方案,该解决方案支持多种图形平台(graphics platforms),实现了通用功能,能对数字视频进行预处理、编解码、以及不同编码格式的转换。该开发包支持现有的英特尔图形组件以及未来的英特尔图形架构Larrabee,Larrabee与AMD、NVIDIA的GPGPU(通用计算图形处理器)技术不同,后两者分别使用Stream Processing(流处理)和CUDA(统一计算设备架构)来满足对GPGPU计算的需求。而Larrabee基于传统的x86架构,它既可用在显卡上,也可用作一个特殊的x86处理器),同时,该开发包还支持纯软件的实现方式,第三方编解码器以及其他的具有硬件加速的图形产品(graphics products)
以前,开发人员可能需要掌握各种各样的图形架构(graphics architectures)并做具体的实现。Media SDK的问世可以让开发人员从这种繁琐的事务中解放出来。一些软件业的巨头已经采用Media SDK来充分利用他们的硬件加速和多核多线程的优势。
在Media SDK中,对数字视频的一些关键核心的编码、解码算法来自于Intel® IPP库,并在此基础上对处理性能进行了优化和提高。通过整合,Intel® Media SDK提供了一组容易使用,功能强大丰富的API。这种丰富性特别表现在其支持开放的体系结构,除能支持英特尔 的图形处理芯片和体系结构外,很容易扩展,从而支持任何第三方的图形硬件解决方案(graphics hardware solutions)和编解码方案。
Intel® Media SDK的软件体系结构
Media SDK高层的软件体系结构如图1.7所示,SDK的编程结构是通过库的分发层(Dispatcher layer)暴露给应用程序的。该层提供了通用的数字视频预处理、编解码的接口。同时,该层还有一个重要的重定向的功能,该功能的实现步骤为:
图1.7 Intel® Media SDK体系架构图
Intel® Media SDK的安装
Intel® Media SDK的下载地址为:/en-us/articles/media 。在下载的软件包中有两种软件版本,分别对应于Windows的32位和64位操作系统。用户可以根据自己的机器配置选择相应的安装,安装完成后,Media SDK的目录结构如表1.3所示。
表1.3 Meida SDK安装后目录结构图
目录 |
目录说明 |
|
Media SDK安装主目录,如: |
|
用户License协议书 |
|
Media SDK DLLs(包含samples中的filter,或plug-in) |
|
Media SDK开发资料说明,包含手册等 |
|
Media SDK头文件说明 |
|
Media SDK库文件,用于链接Dlls |
|
Media SDK示例代码,包含编解码、filter(plug-in)等 |
使用动态链接方式引用IPP库时所需设置的环境变量 开发者基于Media SDK进行应用开发时,首先要设置开发工具中的环境变量。因此需要在Visual Studio中设置两个引用,第一个设置时引用Media SDK的头文件路径(Include files),设置的方法:在Visual Studio的主菜单中选择Tools > Options,Options的对话框会打开,在该对话框的左边的列表中选择Projects and Solutions>VC++ Directories,接着在右上角的“Show directories for:”选项中选择“Include files”,同时在Options对话框右边中间的选项点击空余的选项,选择Media SDK的安装路径下的“include”目录。第二个设置是引用Intel® IPP的链接文件的路径,其方法和引用头文件相似,只是选择在右上角的“Show directories for:”选项中选择“Library files”,同时在Options对话框右边中间的选项点击空余的选项,选择Media SDK的安装路径下的lib目录。