IPP - “Intel Integrated Performance Primitives” (Intel IPP )是一套跨平台的软件函数库,他提供了广泛的多媒体功能:音频解码器(例如: H263 、 MPEG-4 )、图像处理 (JPEG) 、信号处理、语音压缩(例如: G723 、 GSM 、 AMR )和加密机制。“Intel IPP” 包含各种的函数,用于进行向量与图像处理、颜色转换、过滤、分屏、设置域值、变换,以及算术、统计、几何与图形运算。对于每个函数, “Intel IPP” 均支持多种数据类型和分布,同时保持了数据结构的最小化,它提供了丰富的选项供用户在设计与优化应用程序时选用,不必再去编写特定代码。Intel IPP 针对大量的 Intel Microprocessor (微处理器)进行优化: Intel Pentium 4 处理器,采用 Intel Centrino 移动运算技术的 Intel Pentium M 处理器组件, Intel Itanium 2 处理器、 Intel Xeon 处理器以及采用 Intel XScale 技术的 Intel PCA 应用处理器。采用一套跨平台结构的通用 API ,使用者除了不需要担心平台兼容性的问题,更节省了开发成本以及研发时间,使用者可以轻轻松松移植原有应用程序。特性Intel IPP 功能优化多媒体函数· 不再需要以 Hard-Coding 方式针对特定的处理器进行优化· 提高应用程序的可靠性· 节省时间:内置调度器选择优化处理,并根据处理器自动调度特定的运行时代码· 在基于信号和图像的数据结构的特定约束方面,改善了应用程序的灵活性Intel IPP 节省开发时间“Intel Integrated Performance Primitives” 为软件应用程序提供了一个连接界面,它可以增强 Intel 最新微处理器的性能,同时还具有加速上市时间、降低开发成本等优势。您不必针对特定的处理器专门去编写代码,即可利用处理器的高级功能。许多使用 “Intel IPP” 的多媒体应用程序开发人员已经大大改善了他们的软件在 Intel 处理器上的性能。高度的灵活性给予您自由发挥的空间“Intel IPP” 函数库针对 Itanium 2 微处理器、 Intel Xeon 、 Pentium III 、 Pentium 4 处理器以及采用 Intel Centrino 移动计算技术的 Pentium M 处理器元件进行过优化。“Intel IPP” 还针对 Intel XScale 微处理器的 “Intel 个人客户端架构 ” ( Intel R PCA )进行优化。这一个应用程序开发界面 (API) 可以跨越许多平台使用,使得多媒体应用程序开发人员能够轻松实现跨品台兼容,并有助于降低开发成本。取得性能增强效果Intel IPP 提供优化功能,让使用者在最短的时间内能得到最佳的效能, Intel IPP4.1 提供更丰富的优化效能。

假定你的IPP是安装在“D:\Intel\IPP”目录下。

  首先是配置VC2005的环境。打开VC2005后,点击菜单栏的“工具--选项”,在左侧找到“项目和解决方案--VC++目录”,在“可执行文件”的目录中添加“D:\Intel\IPP\bin”,在“包含文件”的目录中添加“D:\Intel\IPP\include”,在“库文件”中添加“D:\Intel\IPP\stublib”和“D:\Intel\IPP\lib”,确定即可。

  然后就是具体的在项目中使用IPP了。我们这次的项目主要是使用IPP的图像处理函数,这些函数的具体说明可以在“D:\Intel\IPP\doc\ippiman.pdf”这个文件中找到。函数的命名其实也是很有规律的,例如图像拷贝的函数,也就是手册里的“4.Image Data Exchange and Initialization Functions”中的Copy这一功能,对于不同的图像,应当使用不同的Copy函数,它的命名是这样的:首先是前缀“ippi”,所有图像处理的函数都以“ippi”开头;然后是功能名称“Copy”,连起来就是“ippiCopy”;之后连一个下划线和对应的模式“ippiCopy_”,那个“”替换成对应的颜色模式,例如“8u_C1R”,其中的“C1R”表示图像只有一个颜色通道,而“8u”表示每个象素的颜色的数据类型都是8位无符号数,也就是说这种图像是一个字节表示一个像素的。我们平时用的比较多的是“8u_C3R”,也就是三个颜色通道,每个通道的数据类型都是8位无符号数。但是显示的时候往往需要4个通道的,也就是除了RGB以外,还多了一个Alpha通道(透明度),这是因为我们的电脑一般都设成32位色深的。这时我们就需要把24位的图像转化成32位的,用“ippiCopy_8u_C3AC4R”这个函数就可以了。其中“8u_C3”就代表原始图像是8位无符号数据,3个通道,而AC4R就表示目标图像是带有Alpha通道的4通道图像。再看看函数的完整形式:

  其返回值是IppStatus,这个只要看看后面的返回值说明就知道啦,其实是一个整型值来的,只不过IPP里为了方便为这些值都用宏替换赋了名称,这里不再赘述。再来看看函数的参数,其中pSrc和pDst都是指针来的,pSrc就是源图像的图像数据指针,而pDst则指向目标图像的数据。前面的Ipp*中的datatype需要替换成相应的数据类型代码,例如8位无符号数,就是“Ipp8u*”了,大家看看手册前面的Function Naming中的Data Types那一节就知道了。而srcStep和dstStep则是指行扫描宽度,也就是图像的一行占用多少字节,这个参数在许多图像处理的函数中都会用到。例如一个320*240的8u_C3R图像,它的行扫描宽度就是320*(3*8)/8=960了。需要注意的是,行扫描宽度必须是4的整数倍,也就是DWORD对齐的,对于不满足4的整数倍的,则应补零对齐。那么上面那条公式就不能适用所有图像了,不过可使用下面的代码来正确计算行扫描宽度:

  (((width*channels*8)+31) >> 5) << 2

  其中width是图像的宽度,channels是通道数。

  最后的roiSize其实是一个IppiSize结构体来的,定义如下:

  typedef struct {

  int width;

  int height;

  } IppiSize;

  很明显就是图像的宽高了。这些结构体之类的基本类型定义都在手册的Function Naming中有详细说明。

  至于要使用这个函数需要包含哪个头文件呢?我们看到Copy函数的说明里后面有一句“The function ippiCopy is declared in the ippi.h file.”很好,#include "ippi.h"就是了。但是如果这样就直接编译,链接器便会告诉你有ippiCopy_8u_C3AC4R这么一个无法解析的外部符号。这是因为我们还没把库文件链接进来呢。ippi.h对应的库文件就是ippi.lib了。点击菜单的“项目--xxx属性--配置属性--链接器--输入”,在右边的“附加依赖项”中填入ippi.lib即可。若有多个库要使用,则用回车隔开。另外,为了兼容VC6.0的程序,在“项目--xxx属性--配置属性--常规”,右边的“字符集”应选择“多字节字符集”。

  而在“项目--xxx属性--配置属性--调试”中,“工作目录”应设为“D:\Intel\IPP\bin”,这样运行时程序才能调用IPP的动态链接库,或者把所需要的dll文件复制到你的Debug或Release文件夹下面也行。

Intel_IPP 的基本使用方法相关推荐

  1. 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群

    作者:Jeffrey Hunter 了解如何以低于 2,700 美元的费用在 Oracle Enterprise Linux 上安装并配置 Oracle RAC 11g 第 2 版开发集群. 本指南中 ...

  2. Java面试题大全2021版

    一.Java 基础 JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...

  3. Kotlin协程使用,协程使用注意事项,协程中的await方法使用|不使用suspend使用协程

    参见 码云 协程使用方法一 (Dispatchers调度器模式) 指定不同线程.同线程会挂起并阻塞(挂起是不影响主线程执行,阻塞是同样的IO线程会阻塞) withContext(Dispatchers ...

  4. IDEA中将代码块封装为方法,IDEA代码重构快捷键

    IDEA中将代码块封装为方法 选中要转换的代码块,快捷键: Windows快捷键:Alt + Shift + M Mac快捷键:Alt + Command + M 如图:

  5. IDEA自动生成对象所有set方法

    idea中有一款插件能够生成对象所有的set方法,GenerateAllSetter :下载地址 步骤1:将下载好的压缩包放在自己记得的文件夹中,在idea中进行导入 步骤2:在本地选中刚才的压缩包, ...

  6. List元素互换,List元素转换下标,Java Collections.swap()方法实例解析

    Java Collections.swap()方法解析 jdk源码: public static void swap(List<?> list, int i, int j) {// ins ...

  7. java1.8新增超实用Map方法——Map.getOrDefault()和Map.value()方法详解

    1. Map.getOrDefault() 翻译一下官方解释: java.util.Map<K, V> V getOrDefault(Object key, V defaultValue) ...

  8. spring boot项目 中止运行 最常用的几种方法

    spring boot项目 中止运行 最常用的几种方法: 1. 调用接口,停止应用上下文 @RestController public class ShutdownController impleme ...

  9. Java Calendar.add()方法的使用,参数含义。指定时间差。

    cal.add()方法中的参数含义: 第一个参数如果是1则代表的是对年份操作,2是对月份操作,3是对星期操作,5是对日期操作,11是对小时操作,12是对分钟操作,13是对秒操作,14是对毫秒操作. 第 ...

最新文章

  1. python动态规划详解_经典动态规划例题整理(Python版)
  2. [转贴]经济学人:Win7拉开新时代序幕 云计算群雄逐鹿
  3. 目前最快的360°全景VR摄影方法
  4. jMeter Transaction Controller 学习笔记
  5. iOS 6 自动布局入门
  6. java socket资源释放_java基础--socket
  7. Spring-@value用法详解与苏宁框架vars的解释
  8. 设计模式之GOF23享元模式
  9. Cannot open include file: 'unistd.h': No such file or directory的解决办法
  10. 朋友圈的人脉关系的算法
  11. slf4j、log4j日志级别与配置
  12. typedef void far *LPVOID 的具体定义
  13. AutoIt教程资源及autoit学习方法
  14. MFC修改图标简单方法(包括exe图标,任务栏图标,应用程序运行左上角图标)
  15. iOS端手游和c++交互 lua和c++交互
  16. 下载图片存入本地,命名为图片地址最后一个/的内容
  17. 学了那么久Python还什么都做不了,我觉得你该试试这个方法了
  18. 元宇宙系列--元宇宙介绍
  19. 网络安全设备概念的熟悉和学习
  20. FLTK 重写Fl_Button回调

热门文章

  1. 汽车vin码识别简述
  2. 【webpack5配置favicon.ico】
  3. C语言:指针三(线性表的存储结构)
  4. JQ---h5页面上实现微信扫一扫功能
  5. 计算机语言学考研考什么,语言学及应用语言学考研有哪些内容-考研经验
  6. Linux上解压缩安装Mysql
  7. MC服务器启动脚本写法
  8. Word换页不用频繁敲回车
  9. 大前端学习--开发脚手架与自动化构建工作流封装
  10. grep查找的内容输出到文件