无法在OpenCV 3.2中使用OpenCL

时间:2017-08-02 09:15:25

标签: c++ opencv opencl

我想使用OpenCL加速我的OpenCV程序,所以我尝试使用OpenCV的透明API。

系统信息

  • OpenCV 3.2.0
  • 带有CUDA Toolkit 8.0的NVIDIA GTX 760
  • Windows 10 64位
  • Visual Studio 2015

问题描述

当我尝试使用透明API cv :: UMat时,没关系。但我发现执行时间比简单地使用Mat更长。

然后我发现ocl::haveOpenCL()返回 false ,并且ocl::getPlatfomsInfo(platforms)抛出错误消息错误:( - 220)OpenCL函数不可用:[clGetPlatformIDs]在函数opencl_check_fn

代码段

#include <opencv2/core/core.hpp>
#include <opencv2/core/ocl.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <ctime>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    ocl::setUseOpenCL(true);

    vector<ocl::PlatformInfo> platforms;
    try {
        ocl::getPlatfomsInfo(platforms);
    }
    catch (cv::Exception& e)
    {
        const char* err_msg = e.what();
        std::cout << "exception caught: " << err_msg << std::endl;
    }

    if (!ocl::haveOpenCL()) {
        std::cout << "OpenCL is not available..." << std::endl;
    }

    std::clock_t start;
    double duration;

    UMat uimg,ugray;
    imread("test.jpg", 1).copyTo(uimg);
    start = std::clock();
    cvtColor(uimg, ugray, COLOR_BGR2GRAY);
    GaussianBlur(ugray, ugray, Size(7, 7), 1.5);
    Canny(ugray, ugray, 0, 50);
    duration = (std::clock() - start) / (double)CLOCKS_PER_SEC;
    Mat ugray_r = ugray.getMat(ACCESS_RW);

    Mat img, gray;
    img = imread("test.jpg", 1);
    start = std::clock();
    cvtColor(img, gray, COLOR_BGR2GRAY);
    GaussianBlur(gray, gray, Size(7, 7), 1.5);
    Canny(gray, gray, 0, 50);
    duration = (std::clock() - start) / (double)CLOCKS_PER_SEC;

    imshow("edges", gray);
    waitKey();

    return 0;
}

我认为我的环境或OpenCV构建可能有问题。但是OpenCL.dllOpenCL64.dll可以在CUDA Toolkit目录下找到。任何人都可以给我任何关于我必须检查的建议吗?

顺便说一句,我发现在OpenCV 3中使用OpenCL的细节信息很少,有关如何在OpenCV中构建,配置或使用OpenCL的任何有用信息都表示赞赏。

0 个答案:

没有答案