使用OpenCV的OpenCL功能检测器

时间:2018-12-12 08:37:20

标签: opencv

如何使用基于OpenCL的特征检测器?根据源代码(here),存在AKAZE,FAST和ORB的opencl版本。我想知道如何在C ++中使用它们吗?

我尝试导入#include <opencv2/core/ocl.hpp>,然后我也设置了cv::ocl::setUseOpenCL(true);,为了进行健全性检查,我做了cv::ocl::haveOpenCL()。完成这些操作后,我可以确认我已经建立了具有OpenCL支持的OpenCV。

话虽如此,我尝试将所有cv::Mat转换为cv::UMat。现在程序在detector->detectAndCompute(umat, cv::noArray(), kp1, des1);崩溃。我正在使用AKAZE。

控制台上的错误是:

  

OpenCV(4.0.0-dev)错误:在glob_rec,文件e:\ cv4.0 \中找不到请求的对象(无法打开目录:C:\ Users \ PC \ AppData \ Local \ Temp \ opencv) opencv \ modules \ core \ src \ glob.cpp,第267行

callstack错误说:

  
      
  • _err“无法打开目录:C:\ Users \ PC \ AppData \ Local \ Temp \ opencv” const   std :: basic_string,std :: allocator      
        

      
  •   

我已经像这样初始化它:

detector = cv::AKAZE::create();
detector->setThreshold(akaze_thresh);

这是使用OpenCL版本的AKAZE的正确方法吗?如果是,如何解决该错误?如果没有,如何使用ACL的OpenCL版本?

1 个答案:

答案 0 :(得分:1)

出于某种原因,未生成OpenCL缓存文件夹(应该在此处-C:\Users\User\AppData\Local\Temp\opencv)。我创建了另一个项目,并运行了一个简单的OpenCL程序:

UMat m(100,100,CV_8UC3, Scalar(100,200,0));
UMat r;
GaussianBlur(m,r,Size(5,5),0);

这生成了所需的缓存文件夹,我现在能够运行AKAZE的OpenCL版本。只是为了使那些正在使用此工具的人清楚一点,ACLZE的OpenCL版本在OpenCV 4.0.0-dev之前尚未完全实现。算法的仅某些部分在OpenCL上运行,因此与原始OpenCV AKAZE相比,性能几乎相同,检测仍在单线程上运行。

here有一个cuda版本。还有一个高度多线程的版本here,可以在8个线程上以60 fps的速度运行。这两个版本都是为OpenCV 3.0.0构建的,应该可以在稍作改动的情况下与较新的版本一起使用。