人工智能研究网
欢迎访问 www.studyai.cn
啥是OpenCL
OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景。计算机视觉中的许多算法可以运行在GPU比CPU更有效:如图像处理,矩阵运算,计算摄影、目标检测等。
OpenCV使用OpenCL的历史
OpenCV中使用OpenCL进行加速的历史是从 2011 年开始的. Opencv 2.4.3的发行版中包含了一个新的“ocl module”, 这个模块包含了一些现有的OpenCV算法的OpenCL实现。这意味着, 当OpenCL运行时环境以及一个兼容的计算设备比如GPU或DSP在你的计算机上存在且可用的时候, 你可以使用 cv::ocl::resize() 而不是 cv::resize() 来加速你的代码. 从2011年开始的这几年里,越来越多的函数被添加到ocl模块,但是在OpenCV2.4.x中ocl模块的API与原始的CPU-oriented API是分离并存的.
OpenCV3.x中的架构已经改为 Transparent API (T-API).在新的架构中分离存在的ocl module 已经被移除了,ocl函数成为与原始的CPU函数一模一样的调用借口。当条件成熟时,OpenCV会自动调用ocl的对应函数分支,不需要像OpenCV2.4.x那样显式的指定。 The T-API implementation was sponsored by AMD and Intel companies.
性能测试
代码范例
一般CPU代码
// initialization VideoCapture vcap(...); CascadeClassifier fd("haar_ff.xml"); Mat frame, frameGray; vector faces; for(;;){ // processing loop vcap >> frame; cvtColor(frame, frameGray, BGR2GRAY); equalizeHist(frameGray, frameGray); fd.detectMultiScale(frameGray, faces, ...); // draw rectangles … // show image … }
OpenCV-2.x中的OpenCL代码
// initialization VideoCapture vcap(...); ocl::OclCascadeClassifier fd("haar_ff.xml"); ocl::oclMat frame, frameGray; Mat frameCpu; vector faces; for(;;){ // processing loop vcap >> frameCpu; frame = frameCpu; ocl::cvtColor(frame, frameGray, BGR2GRAY); ocl::equalizeHist(frameGray, frameGray); fd.detectMultiScale(frameGray, faces, ...); // draw rectangles … // show image … }
- OpenCV-3.x中的OpenCL代码段
// initialization
VideoCapture vcap(...);
CascadeClassifier fd("haar_ff.xml");
UMat frame, frameGray;
vector faces;
for(;;){
// processing loop
vcap >> frame;
cvtColor(frame, frameGray, BGR2GRAY);
equalizeHist(frameGray, frameGray);
fd.detectMultiScale(frameGray, faces, ...);
// draw rectangles …
// show image …
}