logo资料库

CUDA和OpenCV图像并行处理方法研究.pdf

第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
资料共3页,全文预览结束
第 37 2012 卷第 年 期 4 月 07 测绘科学 Science of Surveying and Mapping Vol. 37 No. 4 July. CUDA 和 OpenCV 图像并行处理方法研究 刘 鑫①,姜 超②,冯存永① ( ① 新疆 69028 部队四队,乌鲁木齐 830006 ; ② 信息工程大学测绘学院,郑州 ) 450052 【摘 要】 CUDA 架构与传统 GPU 通用计算相比,编程更简单、应用领域更广泛,将 CUDA 架构引入到图像处理 中可以提高图像的处理效率。本文提出了一种基于 CUDA 和 OpenCV 的图像并行处理方法,实现了图像二值化以 及融合,经实验结果表明基于该方法可以提高图像处理效率; 将该方法集成到 MFC 框架,能够应用到实际工程开 发领域。 【关键词】 GPU 【中图分类号】 TP751 ; 【文献标识码】 A 【文章编号】1009-2307 ; 图像二值化; 图像融合 04-0123-03 OpenCV GPGPU CUDA 2012 ( ) ; ; 1 引言 可编程图形处理器( , PGPU ] 1 ed 用器件[ 。 特性, GPU 近几年的发展经验表明,一块高端 理器 点处理性能可以达到一块同时期高端桌面 显存带宽也达到 同 时 期 桌 面 平 台 的 Programmable Graphic Process Unit- ) 已经是目前计算机普遍采用的图形图像处理专 与此同时,由于图形渲染以及图像处理的并行 与生俱来就是一种拥有大量运算单元的并行处 的单精度浮 倍,其 的 10 并 且,由 提供相同的计算能力,所需要的成本和功耗都要小于 GPU CPU 倍 左 右 。 。 5 GPU 基于 的系统[ ] 2 。 GPU GPU GPGPU ( 基于 但是传统的 CPU 传统上, GPU 可编程性的不断提高,如果不将 。 的应用往往局限于处理图形渲染计算任 务,随着 强大的 GPU 计算能力运用到通用计算领域,无疑是对 计算资源的 GPU 的通用运算) 受硬 极大浪费 件可编程性和开发方式的限制,应用领域受到了限制并且 开发难度也很大 fied Device Architecture 一局面,与传统 GPGPU 强大,应用领域更广泛 。 高并行性的特性,因此将 以提高图像的处理效率 Compute Uni- ,统一计算设备架构) 完全扭转了这 编程更简单,功能更 而图像处理处理具有大数据量 、 架构引入到图像处理中可 编程架构并结合 进行了图像的二值化处理以及融合,实验表明,基 架构的图像处理可以大大的提高效率 CUDA 本文采用 公司推出的 。NVIDIA 相比, CUDA CUDA CUDA 。 ( 。 CUDA OpenCV 于 2 CUDA 和 OpenCV 简介 2. 1 CUDA 简介[2] 是 CUDA NVIDIA 公司于 2007 构,与以往的传统 著的改进,下面就对两种开发方式进行介绍及比较 开发方式相比, GPGPU CUDA 。 ) 传统的 1 GPGPU 开发 发布的统一计算设备架 有十分显 作者简介: 刘鑫( 主要研究方向为摄影测量与遥感 1986- ) ,助理工程师, 。 : E-mail jiangchao19850429@ 126. com 收稿日期: 2011-3-28 基金项目: 国家 息系统网格化集成和智能化服务技术 ( 城市空间信 项目 863 “ ” ) ; 国 家 网 苏州数字城市网格应用 区 项 目 863 “ 2009AA12Z228 - 格地理信息系统软件及其重大应用 示范系统 “ 域空 间 信 息 资 源 共 享 与服 务 关 键 技 术 研 发 与 集 成 ( ) ; 国家科技支撑计划课题 2007AA120504 ” ) ( ” 2007BAH16B03-r3 。 。 GPU 目前的 中主要的可编程单元是顶点着色器和片元 中,两者在物理 一个具体的应用 此外, 不允许计算单元之间通过片内的存储器进行通 ( 单指令流多数据 GPGPU 不允许数据间的通信,限制了很多算法,也就制 着色器,在没有采用统一渲染架构的 上是分离的,数量上的比例也是固定的 程序很难同时完全利用两种可编程着色器的性能 传统 GPU 信,因此 流) 模型 约了传统 的应用范围和代码效率 也只能采用严格的 GPU 。 SIMD 。 开发直接使用了图形学 GPGPU 最早的 编程,这种 方式要求将数据打包成纹理,将计算任务映射为对纹理的 渲染过程,用着色器语言( 如 ) 编写着色 器程序,然后通过图形学 ) 执行 。 这种方式要求开发人员不仅要熟悉自己需要实现的计算和 并行算法,还要对图形学硬件和编程接口有深入的了解 由于开发难度大,传统 编程开发 GLSL、HLSL、Cg ( 如 没有被广泛应用 OpenGL、Direct3D GPGPU GPGPU API API 。 。 ) CUDA 2 CUDA 采用了比较容易掌握的类 不需要借助图形学 从熟悉的 熟悉图形学编程 C API。 语言比较平稳的从 语言进行开发而且 它的这一特性使得开发人员可以 ,而不需要 过渡到 C CPU GPU 。 GPU 与以往的 编程相比,支持 在架构上 有两项改进: 一是采用了统一处理架构,可以更加有效地 利用过去分布在顶点着色器和片元着色器的计算资源; 二 是引入片内共享存储器,支持随机写入和线程间通信 这 两项改进使得 通用计算 CUDA GPU 的 。 架构更加适用于 通过以 上 介 绍,我 们 可 以 发 现 CUDA 。 GPU CUDA GPU 相 较 于 传 统 的 的计算资源并 自推出以后获得了广泛 ,其编程更简单,更能充分利用 因此, 。 CUDA GPGPU 且支持线程间通信 的应用 ) 3 我们对 。 CUDA CUDA 编程模型 和传统的 GPGPU 进行了比较, 很大的优势以及更广泛的应用领域,接下来对 程模型进行介绍以助于我们进行 程序的开发 CUDA 有 的编 CUDA 。 CUDA 编 程 模 型 将 ) , Host GPU co-processor ) ( 如 图 1 CPU CUDA 作为主机 ( 作为 ) 或 者 协处理器 ( 设备 ( ) 在 一个系统中可以存在一个主 在该模型 机和若干个设备 中, 负责进行逻辑性较 强的 事 务 处 理 及 并 行 计 算, Device CPU 。 。 负责高度线程化的并行 GPU 计算任务 。 图 1 CUDA 的 主机和设备 开发人员确定程序中的并行部分,就可以把并行部分 并行计算函 运行在 的计算任务交给 上的 GPU。 GPU CUDA
421 测绘科学 第 37 卷 3 实验方案与结果 在图像处理中,最常见的即为单通道和三通道的图像 。 本文以图像处理中的二值化和融合为例,说 明 如 何 基 于 CUDA 和 基于 行两个部分 。 行图像的加载 端,我们编写 、 OpenCV CUDA 在 进行图像的并行处理 和 。 OpenCV 的图像处理模块分为串行和并 进 中提供 端,我们利用 CPU 获取像素数据以及图像的显示等 OpenCV API 在 。 GPU 程序进行图像的并行处理 的 CUDA cvLoadImage 。 对于图像的加载和获取像素数据,我们采用 中 ( ) 函数,通过这个函数我们可以获得一个 结构的指针,利用这个指针我们就可以方便的访问 IplImage 图像的像素数据,有了数据我们就可以根据具体的算法进行 指针访问像素数据的方式如下) 想要的操作 OpenCV ( 通过 。 IplImage 对于单通道图像: 图 2 CUDA 编程模型 。 一个 kernel ( 内核函数) 数称为 kernel 程序中的一个可以被并行执行的步骤 CUDA 程序是由一系列的设备端 函数并行部分和主机断的 串行处理部分共同组成的,这些处理部分会按照程序中相 应语句的顺序依次执行,满足顺序一致性( 如图 函数只是整个 一个完整的 CUDA kernel 。 ) 2 。 2 。 CPU CPU Block kernel 从图 中的 中的 Grid 之间的并行 Thread 以线程网格( 串行代码的工作包括在 启动前进行数据准 kernel 之间进行一些串行计算 。 串行代码的作用只是清理上一个内核函 中我们可以看出,一个 之间 中,我 ) 的形式组织,每个 ) 组成,而每个线程块又由 为单 备和设备初始化,以及在 理想情况下, 数并启动下一个内核函数 内核函数中存在两个层次的并行,即 的并行以及 Block 们还可以看出, 线程网格由若干个线程块( ) 组成 若干个线程( Block 是并行执行的,没有执行顺序, 位执行的,各 Block 间也无法通信,但是同一 采 可以通信 用这种编程模型,可以使得无论是在只能同时处理一个线 上,还是在能同时处理数十甚至上百个线程块 程块的 GPU 的 上都可以适用 2. 2 OpenCV 简介[3] Block 实质上, Thread Thread 在图 间的 是以 kernel kernel Block Block GPU Grid 。 。 。 。 2 ( Open Source Computer Vision Library ,开源计 函数 函数的跨平台的 ,实现了图像处理和计算机视觉方面的很多通 类构成,包含了 它是由一系列 研究中心 。 多个 Intel 500 C C OpenCV 算机视觉库) 诞生于 和少量的 中 高层 用算法,可以运行在 c + + API 、 OpenCV Linux、Windows、Mac 。 的设计目标是执行速度尽量快,主要关注实时 代码编写,能够充分利用多核处理 平台上得到更快的处理速度, C 如果希望在 它采用优化的 等操作系统上 Intel 的高性能多媒体函数库 ( IPP Integrated Per- 。 应用 器的优势 可以购买 。 Intel ) formance Primitives 其重要特性有: 。 ① 完全开源,使用简单方便; 跨平 对商业和非商业应用 ② 台,可以在多个操作系统上使用; 都是免费的 ③ 为 。 的 ( Integrated Performance Primitives 透明接 口,这 意 味 着 如 果 本 机 安 装 了 高 性 能 的 Intel IPP OpenCV 在运行时会自动调用 IPP 函数从而提高运行效率 ) 提供了 库, IPP 。 unsigned char * pSrcData = imageData ) ; 对于三通道图像: ( unsigned char* ) ( ImgSrc-> uchar3* h_ image _ dataA = ) ) ( imageA-> height geA-> width * h_ image _ dataA [ j * ( ( uchar3 * * sizeof ( ) ( malloc ) ; ] ) + i ( ima- . x = uchar3 ) imageA-> width unsigned char * imageA-> imageData + imageA-> width- Step* j ) ) [ ]; i* 3 ) ) [ Step* j i* 3 + 1 ( ( ( ( ( ( ) ( ) ( ]; ) ( h_ image _ dataA [ j * ( imageA-> width ) ] + i . y = unsigned char * imageA-> imageData + imageA-> width- h_ image _ dataA [ j * ( imageA-> width ) ] + i . z = unsigned char * imageA-> imageData + imageA-> width- Step* j ) ) [ ]; 为了便于后续的 i* 3 + 2 程序处理,我们把获取的图像 CUDA uchar CUDA 提供的 的数据类型 处理数据存储为 和 获取到图像数据以后,我们将其传入 用 显存的数据传到内核函数,由内核函数在 的处理并将处理结果由显存复制回主存,最后由 对结果图像进行显示 程序,利 将主存传入的数据复制到显存,再把 上进行相应 负责 ( 主存与显存间的数据传递由 uchar3。 CUDA CUDA GPU CPU API ( ) 函 数 实 现,通 过 。 cu- 和 标志控制数据是由主存到显存还是 cudaMemcpyHostToDevice daMemcpy cudaMemcp·eviceToHost 从显存到主存) 和 CUDA OpenCV 以上即为基于 进行图像并行处理的 基本流程,本文选取了几幅不同数据量的单通道图像和一 幅三通道图像分别进行图像二值化和融合,并对二值化的 上执行的二值化进行对比,实验结果及 处理时间与在 所示( 处理时间不包括主存与显存间的数据传输 分析如表 时间) ,图像数据大小以像素为单位 时间单位: CPU 1 。 ms 。 表 1 像数据大小 处理时间 CUDA CPU 处理时间 加速比 10241024 20482048 40964096 0. 062 0. 081 0. 082 0. 578 3. 067 9. 322 37. 864 12. 713 155. 036 1 如表 所示,采用 进行图像处理在没有采取优 化措施的情况下就得到了很好加速比,而且随着数据量的 加大,加速越明显 CUDA 。
第 4 期 刘 鑫等 和 CUDA OpenCV 图像并行处理方法研究 521 CUDA 程中添加一个头文件 函 对要导出的 数进行声明并在程序 要调用该函数的地方 包 含 此 头 文 件 实 现 互联 。 最后本 文 将 经 由 程 序 中 的 内 核 CUDA 函数处理的结果显示 框架中,显示 到 效果如图 5 5 结束语 所示 MFC 。 图 5 MFC 下的显示效果 。 和 CPU CUDA OpenCV 本文提出了一种基于 的图像并行处 理方法,根据该方法进行了图像二值化以及融合处理并对 上的执行时间进行比较,经由实 二值化处理的时间与 验结果表明,通过引入 我们可以大大提高图像处理 最后,为了将 的效率 能够更好的为实际的工程应 用服务,我们将 在本文 的研究过程中,虽然取得较好加速比,但是我们并没有对 程序进 行 优 化,如 如 何 对 主 存 与 显 存 间 的 数 据 交 结合其他的并行编 编程等,如果我 们 再 对 程序进行优化必将进一步提高图像处理的加速比, CUDA CUDA 程序集成到 CUDA 换 程方法( 如 内核函数中线程块的划分 ) 以及多 框架下 、CUDA OpenMP CUDA MFC GPU 。 、 CUDA 当然这也是作者的下一步研究方向 。 参考文献 [ ] 盖素丽 1 . 基于 算机技术理论, GPU 2009. ] 的数字图像并行处理研究[ J . 计 高 性 能 运 算 之 [ ] 张舒,楮艳利,赵 开 勇,张 钰 勃 2 . GPU 北京: 中国水利水电出版社 CUDA [ M ] . . ] 于仕琪,刘瑞祯 [ . 3 清华大学出版社 学习 OpenCV . ( 中文版) [ M ] . 北京: [ ] 4 [ ] 5 CUDA Tollkit NVIDIA Corporation developer. nvidia. com / object / cuda_3_2_toolkit_rc. html. CUDA SDK NVIDIA Corporation www. nvidia. com / object / cuda_get_samples. html. DB / OL DB / OL . http . http [ ] : / / / / ] 在 [ 6 windows 下 安 装 [ ] cuda DB / OL . http / / [ ] : : [ ] 7 [ ] 8 ( 赵 开 勇) [ wenku. baidu. com / view / f206fc4ffe4733687e21aa1c. html. CUDA Wizard OpenHero DB / OL blog. csdn. net / OpenHero / archive /2008 /05 /20 / 2463474. aspx. CUDA MFC wenku. baidu. com/ view /75c4d52acfc789eb172dc8c0. html. 曹伟国中科院计算所[ : . http DB / OL . http ] 与 ] : / / / / 图 3 二值比处理结果 图 4 融合处理结果 4 CUDA 与 MFC 的集成 CUDA 使得 发中 CUDA 。 CUDA CUDA 虽然在并行处理方面有很大优势,但是在实际 的工程应用中,我们除了一些数据需要进行并行处理外还 要有一个良好的人机交互界面 如果我们只单纯的编写一 个 程序很难实现 。 人机交互,因此我们将 框架, 并行处理模块可以方便的应用到实际的工程开 程序集成到 CUDA MFC 程序的编写有 种方式: 使用 自己建一个工程设定 ① 3 中相应的 SDK ] [ 7 CUDA 。 的模板存在编程不太灵活的缺陷; 方 CUDA_ VS_ Wizard custom build tool 执行 CUDA 程序,不符合我们要将 CUDA 4 ]; , 5 ② 使用 模板进行改造[ ]; 执行 方法 法 应用工程开发中的目的 [ 6 CUDA ③ SDK 1 只能创建一个纯 必须使用 3 。 集成到 MFC CUDA 为了将 进行程序的 编 写 框架下,使其作为实际工 程中负责并行处理的模块 ,因此在本文中我们采用方法 在 实 际 编 写 的 过 程 中,作 者 对 网 上 ] 进 行 归 纳 总 结 得 出 了 一 个 简 单 单文档为 2 常用的几种编写 方 式[ 易行的编写方法,具体操作流程如下 ( 以 例) : MFC 。 5 -8 ) 新建一个 ) 添加一个 置( 具体配置参考 1 2 单文档工程 文件,并对 MFC cu OpenHero 的 。 cu CUDA 文件进行编译的相关配 向导创建的程序) 。 ) 将 3 cpp cu 文件和 文件互联,这里我们可以通过在工 : Image parallel processing based on CUDA and OpenCV Abstract NVIDIA’s CUDA architecture programs easier is more powerful and has more extensive applications than the tradi- tional general-purpose GPU computing so the introduction of the CUDA architecture to the image processing can improve image pro- cessing efficiency. This paper presented a parallel processing method combining OpenCV and CUDA to achieve the image binarization and the integration. The experimental results showed that this method could greatly improve image processing efficiency and finally it was integrated into the MFC framework in order to apply in practical engineering fields. , , : Key words LIU Xin①, ; ; GPU GPGPU JIANG Chao②, ; ; CUDA OpenCV FENG Cun-yong①( , binarization ①Fourth Group of Sinkiang Troops 69028 image fusion , ) of Surveying and Mapping Information Engineering University Zhengzhou 450052 China , Urumqi 830006 , China ; ②Institute , ; ,
分享到:
收藏