介绍
Open Computing Language (OpenCL) 是一种开放标准,用于编写可在异构平台(包括 CPU、GPU、DSP 等)上运行的代码。特别是 OpenCL 为应用程序提供了对 GPU 的访问权限,用于非图形计算 (GPGPU),在某些情况下会导致显著的加速。在计算机视觉中,许多算法可以在 GPU 上比在 CPU 上运行得更有效:例如图像处理、矩阵运算、计算摄影、目标检测等。
历史
OpenCV 与 OpenCL 的加速始于 2011 年,由 AMD 发起。结果,OpenCV-2.4.3 版本 包含 新的 ocl
模块,其中包含一些现有 OpenCV 算法的 OpenCL 实现。也就是说,当客户端机器上存在 OpenCL 运行时和兼容设备时,用户可以调用 cv::ocl::resize()
而不是 cv::resize()
来使用加速代码。在 3 年内,越来越多的函数和类被添加到 ocl
模块中;但它一直是 OpenCV-2.x 中与主要面向 CPU 的 API 并存的独立 API。
在 OpenCV-3.x 中,架构概念已更改为所谓的透明 API (T-API)。在新的架构中,独立的 OpenCL 加速 cv::ocl::resize()
从外部 API 中删除,并成为常规 cv::resize()
中的一个分支。当从性能角度来看,此分支在可能并且有意义时会自动调用。T-API 实现由 AMD 和 英特尔 公司赞助。
数字
下图显示了一些性能数据
代码示例
常规 CPU 代码
// initialization
VideoCapture vcap(...);
CascadeClassifier fd("haar_ff.xml");
Mat frame, frameGray;
vector<rect> faces;
for(;;){
// processing loop
vcap >> frame;
cvtColor(frame, frameGray, BGR2GRAY);
equalizeHist(frameGray, frameGray);
fd.detectMultiScale(frameGray, faces, ...);
// draw rectangles …
// show image …
}
OpenCL 感知代码 OpenCV-2.x
// initialization
VideoCapture vcap(...);
ocl::OclCascadeClassifier fd("haar_ff.xml");
ocl::oclMat frame, frameGray;
Mat frameCpu;
vector<rect> 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 …
}
OpenCL 感知代码 OpenCV-3.x
// initialization
VideoCapture vcap(...);
CascadeClassifier fd("haar_ff.xml");
UMat frame, frameGray;
vector<rect> faces;
for(;;){
// processing loop
vcap >> frame;
cvtColor(frame, frameGray, BGR2GRAY);
equalizeHist(frameGray, frameGray);
fd.detectMultiScale(frameGray, faces, ...);
// draw rectangles …
// show image …
}