使用 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 特征检测器的主要内容,如果未能解决你的问题,请参考以下文章

Opencv学习笔记 - 关于OpenCV的UMat 类

[OpenCV实战]19 使用OpenCV实现基于特征的图像对齐

OpenCV ORB 特征检测器如何工作?

原神位置检测【OpenCV 特征匹配】

OpenCV特征点检测

使用 OpenCV Android 进行面部特征检测