如何使用基于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版本?
答案 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
构建的,应该可以在稍作改动的情况下与较新的版本一起使用。