gpt4 book ai didi

opencv - OpenCV 的 OpenCL 实现中使用的语法/函数

转载 作者:太空宇宙 更新时间:2023-11-03 22:24:13 26 4
gpt4 key购买 nike

我试图了解 OpenCV 中 OpenCL 的使用,但我不明白:

这是来自 orb.cpp 的示例代码部分,其中创建了位于 orb.cl 中的名称为 ORB_HarrisResponses 的内核(可能) :

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 实现的基本了解以回答以下问题:

  • “普通”OpenCL 和 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.cl 中的内核代码 ORB_HarrisResponses 构建在字符串 ocl::features2d::orb_oclsrc 中,创建为hr_ker(对吗?)。

  • 但是 format(...) 的作用是什么?

如果 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);

在内核参数的这一部分中,imgbuflayerinfokeypoints 被设置,内核的输出存储在响应中。

  • nkeypoints 是怎么回事?

  • 为什么这个参数前面没有ocl::KernelArg

  • orb.cl 中的内核有 7 个参数,但只设置了 5 个,为什么?
  • return hr_ker.args(...) 究竟返回了什么?

最佳答案

这种语法是一种内部 OpenCV“糖”,不会重复一些常见的代码块。不幸的是,没有好的文档,所以学习它的唯一方法是查看源代码和示例。

给你的一些提示:

  • OpenCL API 和 opencv 之间的连接在 modules\core\src\ocl.cpp 中(参见 KernelKernel::ImplProgramProgramSourceKernelArg 类)。
  • 存储在 *.cl 文件中的内核源代码(例如 ORB 内核在 modules\features2d\src\opencl\orb.cl 文件中)。内核的模块构建代码正在复制到自动生成的 cpp 文件(例如 opencl_kernels_features2d.cpp),代码可以通过 ocl::features2d::orb_oclsrc 访问。
  • 要在 opencv 中使用 opencl 实现,您需要传递给函数 cv::UMat 而不是常规的 cv::Mat(参见 CV_OCL_RUN_宏和 cv::OutputArray::isUMat() 方法)。

基本上 opencv 中的所有 opencl 实现都执行以下操作:

  • 定义内核参数,例如全局大小、 block 大小等。
  • 使用带有源代码和定义参数的字符串创建 cv::ocl::Kernel。 (如果未创建内核或没有用于指定输入参数的 opencl 实现,处理将传递给常规 cpu 代码)。
  • 通过 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 (...)

一些有用的链接:

希望对您有所帮助。

关于opencv - OpenCV 的 OpenCL 实现中使用的语法/函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44256049/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com