http://opencv.org/platforms/opencl.html
一、OpenCV-2.x 和 OpenCV-3.x使用区别
OpenCL-aware code OpenCV-2.x
// 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 … }
OpenCL-aware code OpenCV-3.x
// 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 …
}
二、例子
备注:在OpeCV3.X中需要添加 ocl::setUseOpenCL(true); 才能正常调用OpenCL模块
1、CUP 不使用OpenCL
#include <stdio.h> #include <iostream>
#include <opencv2/opencv.hpp>
using namespace std; using namespace cv; const string filename = "../data/lena.jpg";
int main(int argc, char **argv)
{
// time
int64 start=0,end=0;
start = getTickCount();
Mat img,gray;
img = imread(filename, 1);
cvtColor(img,gray,COLOR_BGR2GRAY);
GaussianBlur(gray, gray, Size(7,7), 1.5);
Canny(gray, gray, 0, 50);
imshow("edges",gray);
end = getTickCount();
printf("time: %f ms\n", 1000.0*(end - start)/getTickFrequency());
waitKey(0);
return 0;
}
2、使用OpenCL模块
#include <stdio.h>
#include <iostream>
#include <opencv2/opencv.hpp>
//opencl
#include <opencv2/core/ocl.hpp>
using namespace std;
using namespace cv;
const string filename = "../data/lena.jpg";
int main(int argc, char **argv)
{
// time
ocl::setUseOpenCL(true);
int64 start=0,end=0;
start = getTickCount();
UMat img,gray; //
//imread(filename, 1).copyTo(img);
img = imread(filename, 1).getUMat(ACCESS_READ);
cvtColor(img,gray,COLOR_BGR2GRAY);
GaussianBlur(gray, gray, Size(7,7), 1.5);
Canny(gray, gray, 0, 50);
imshow("edges",gray);
end = getTickCount();
printf("time: %f ms\n", 1000.0*(end - start)/getTickFrequency());
waitKey(0);
return 0;
}
两段程序运行结果分别是:
CUP:
GPU: