介紹
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 …
}
