使用 OpenCV 的 OpenCL 特征检测器
Posted
技术标签:
【中文标题】使用 OpenCV 的 OpenCL 特征检测器【英文标题】:Use OpenCV's OpenCL feature detector 【发布时间】:2018-12-12 08:37:19 【问题描述】:如何使用基于 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 行
调用堆栈错误说:
_err "无法打开目录:C:\Users\PC\AppData\Local\Temp\opencv" const std::basic_string,std::分配器&
我已经这样初始化它了:
detector = cv::AKAZE::create();
detector->setThreshold(akaze_thresh);
这是使用 OpenCL 版本的 AKAZE 的正确方法吗?如果是,我该如何解决这个错误?如果没有,我该如何使用 OpenCL 版本的 AKAZE?
【问题讨论】:
我不确定 OpenCV 是否有对 AKAZE 的 OpenCL 支持,他们确实使用 CUDA 支持它,但这可能在 4.0 中有所改变。您是否尝试改用 ORB 或 FAST? @RickM。您能否确认 akaze 是否仍可使用 cuda 支持?或者 cuda akaze 可用的 opencv 的最新版本是哪个?我没有尝试过 ORB 和 FAST,我没有在 CPU 本身上使用这 2 个实现预期的结果。 尝试阅读this Git repository 你说的 CPU 本身没有达到预期的结果是什么意思?你想要的结果是什么?速度? @RickM。速度和准确性。使用 AKAZE 我得到了 100 多场比赛,使用 ORB 我几乎没有得到 5 场以上的比赛,而 FAST 也或多或少与 ORB 相同。由于 akaze 原来这么好,我想要一个更快的版本。在核心 i9 上检测和匹配大约需要 70 毫秒。我想把它降到最低。 【参考方案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 版本。只是为了让那些提到这个的人清楚,从OpenCV 4.0.0-dev
开始,AKAZE 的 OpenCL 版本还没有完全实现。只有部分算法在 OpenCL 上运行,因此与原始 OpenCV AKAZE 相比性能大致相同,检测仍然在单线程上运行。
有一个可用的 cuda 版本here。还有一个高度多线程的版本here,它可以在 8 个线程上以 60 fps 的速度运行。这两个版本都是为OpenCV 3.0.0
构建的,应该可以与稍作改动的较新版本一起使用。
【讨论】:
以上是关于使用 OpenCV 的 OpenCL 特征检测器的主要内容,如果未能解决你的问题,请参考以下文章