第
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
,
;
,