我尝试了解在OpenCV中使用OpenCL但我得不到它:
这是来自orb.cpp
的示例代码部分,其中ORB_HarrisResponses
中创建了名为orb.cl
的内核(可行):
ocl::Kernel hr_ker("ORB_HarrisResponses", ocl::features2d::orb_oclsrc,
format("-D ORB_RESPONSES -D blockSize=%d -D scale_sq_sq=%.12ef -
D HARRIS_K=%.12ff", blockSize, scale_sq_sq, harris_k));
return hr_ker.args(ocl::KernelArg::ReadOnlyNoSize(imgbuf),
ocl::KernelArg::PtrReadOnly(layerinfo),
ocl::KernelArg::PtrReadOnly(keypoints),
ocl::KernelArg::PtrWriteOnly(responses),
nkeypoints).run(1, globalSize, 0, true);
但这不是常规的OpenCL语法(像clCreateKernel这样的函数......)。有人知道我可以从哪里获得对OpenCV的OpenCL实现的基本了解,以回答以下问题:
我无法在网上找到文档或相关问题。 感谢
编辑:感谢您回答它有助于理解一些事情:
ocl::Kernel hr_ker("ORB_HarrisResponses", ocl::features2d::orb_oclsrc,
format("-D ORB_RESPONSES -D blockSize=%d -D scale_sq_sq=%.12ef -D HARRIS_K=%.12ff", blockSize, scale_sq_sq, harris_k));
在此部分中,位于字符串ORB_HarrisResponses
内的orb.cl
内部的内核代码ocl::features2d::orb_oclsrc
创建为hr_ker
(对吗?)。
如果hr_ker.empty()
返回false;
return hr_ker.args(ocl::KernelArg::ReadOnlyNoSize(imgbuf),
ocl::KernelArg::PtrReadOnly(layerinfo),
ocl::KernelArg::PtrReadOnly(keypoints),
ocl::KernelArg::PtrWriteOnly(responses),
nkeypoints).run(1, globalSize, 0, true);
在内核参数imgbuf
的这一部分中,layerinfo
,keypoints
被设置,内核的输出存储在响应中。
nkeypoints发生了什么?
为什么此参数前面没有ocl::KernelArg
?
orb.cl
中的内核有7个参数,但只设置了5个,为什么? hr_ker.args(...)
确切返回了什么?答案 0 :(得分:2)
这种语法是一种内部OpenCV“糖”,不重复一些常见的代码块。遗憾的是,没有好的文档,所以学习它的唯一方法是查看源代码和示例。
一些提示:
modules\core\src\ocl.cpp
(请参阅Kernel
,Kernel::Impl
,Program
,ProgramSource
,KernelArg
类。 ocl::features2d::orb_oclsrc
访问。cv::UMat
而不是常规cv::Mat
(请参阅CV_OCL_RUN_
宏和cv::OutputArray::isUMat()
方法)。 基本上opencv中的所有opencl实现都会执行以下操作:
cv::ocl::KernelArgs
传递内核参数。有几种类型的参数可以优化处理:只读,只写,常量等。因此,对于使用opencl实现的最终用户来说,透明。如果出现问题,处理将切换到cpu实现。
让我们讨论以下代码片段:
return hr_ker.args(ocl::KernelArg::ReadOnlyNoSize(imgbuf),
ocl::KernelArg::PtrReadOnly(layerinfo),
ocl::KernelArg::PtrReadOnly(keypoints),
ocl::KernelArg::PtrWriteOnly(responses),
nkeypoints).run(1, globalSize, 0, true);
和ocl函数声明:
ORB_HarrisResponses(__global const uchar* imgbuf, int imgstep, int imgoffset0,
__global const int* layerinfo, __global const int* keypoints,
__global float* responses, int nkeypoints )
nkeypoints
是整数,因此无需将其包装到ocl::KernelArg
。它将直接传递给内核。ocl::KernelArg::ReadOnlyNoSize
实际上扩展为三个参数:imgbuf,imgstep,imgoffset0。hr_ker.args
会返回对cv::ocl::Kernel
的引用,因此您可以使用以下构造:kernel.args(...).run(...)
。一些有用的链接:
cv::format
documentation。它的作用类似于boost::format
。希望它会有所帮助。