使用OpenCV';OpenCL特征检测器
如何使用基于OpenCL的特征检测器?根据源代码(),有opencl版本的AKAZE、FAST和ORB。我想知道如何在C++中使用它们? 我尝试导入使用OpenCV';OpenCL特征检测器,opencv,Opencv,如何使用基于OpenCL的特征检测器?根据源代码(),有opencl版本的AKAZE、FAST和ORB。我想知道如何在C++中使用它们? 我尝试导入#include,然后我还设置了cv::ocl::setUseOpenCL(true)为了检查是否正常,我做了cv::ocl::haveOpenCL()。做这些我可以确认我已经用OpenCL支持构建了OpenCV 也就是说,我尝试将所有的cv::Mat转换为cv::UMat。现在程序在detector->detectAndCompute(umat,c
#include
,然后我还设置了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\OpenCV\modules\core\src\glob.cpp第267行中找不到请求的对象(无法打开目录:C:\Users\PC\AppData\Local\Temp\OpenCV)
callstack错误显示:
- _错误“无法打开目录:C:\Users\PC\AppData\Local\Temp\opencv”const
std::basic_字符串,std::分配器
&
我已将其初始化如下:
detector = cv::AKAZE::create();
detector->setThreshold(akaze_thresh);
这是使用OpenCL版本AKAZE的正确方法吗?如果是,如何修复错误?如果没有,我如何使用OpenCL版本的AKAZE?结果表明,由于某种原因,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);
这生成了所需的缓存文件夹,我现在可以运行OpenCL版本的AKAZE了。为了让提到这一点的人明白,自OpenCV 4.0.0-dev起,AKAZE的OpenCL版本尚未完全实现。只有部分算法在OpenCL上运行,因此性能与原始OpenCV AKAZE大致相同,检测仍在单线程上运行
有一个cuda verion可用。还有一个高度多线程的版本,可以在8个线程上以60 fps的速度运行。这两个版本都是为OpenCV 3.0.0
而构建的,应该可以与较新的版本配合使用,只需稍作改动。我不确定OpenCV是否支持OpenCL对AKAZE的支持,他们确实支持使用CUDA,但这可能在4.0中有所改变。你试过使用ORB还是FAST吗?@RickM。您能否确认akaze是否仍有cuda支持?或者cuda akaze提供的opencv的最新版本是什么?我还没有试过ORB和FAST,我在CPU上的这两个没有达到预期的效果。试着通读一下CPU上的这两个没有达到预期的效果是什么意思?你期望的结果是什么?速度?@RickM。速度和准确性。有了AKAZE,我得到了100+场比赛,而有了ORB,我几乎没有得到5+场比赛,而FAST也差不多和ORB一样。既然akaze有这么好,我想要一个更快的版本。在核心i9上进行检测和匹配大约需要70毫秒。我想把它降得尽可能低。