首页 > 解决方案 > 使用 OpenCV 的 OpenCL 特征检测器

问题描述

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

我尝试导入#include <opencv2/core/ocl.hpp>,然后我还设置cv::ocl::setUseOpenCL(true);并进行了完整性检查cv::ocl::haveOpenCL()。这样做我可以确认我已经构建了具有 OpenCL 支持的 OpenCV。

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

控制台上的错误是:

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

调用堆栈错误说:

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

    &

我已经像这样初始化它:

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

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

标签: opencv

解决方案


事实证明,由于某种原因,没有生成 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 版本。只是为了让那些提到这个的人清楚,AKAZE 的 OpenCL 版本在OpenCV 4.0.0-dev. 只有部分算法在 OpenCL 上运行,因此与原始 OpenCV AKAZE 相比,性能大致相同,检测仍然在单线程上运行。

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


推荐阅读