我一直在查看simple opencl example的源代码,以便更好地了解如何编写opencv代码。
似乎kernel definition的参数列表包含9个参数:
"__kernel void magnutude_filter_8u(\n"
" __global const uchar* src, int src_step, int src_offset,\n"
" __global uchar* dst, int dst_step, int dst_offset, int dst_rows, int dst_cols,\n"
" float scale)\n"
但只有3个参数called:
bool executionResult = k
.args(
cv::ocl::KernelArg::ReadOnlyNoSize(src), // size is not used (similar to 'dst' size)
cv::ocl::KernelArg::WriteOnly(result),
(float)2.0
)
在其他代码中也会发生这种情况,例如canny .cl和.cpp实现。
我想知道UMat结构有什么特别之处可以实现这一点。
答案 0 :(得分:1)
如果你浏览了一下opencv代码,你会发现它 ReadOnlyNosize和WriteOnly函数返回一个kernelArg,它似乎是4个值打包到一个结构中,从这三个中使用"使用"由你的内核,默认情况下为每个KernelArg 2值分配,在这种情况下,这些匹配到,src_step,src_offset,dst_step和dst_offset,另一方面,dst_rows和dst_cols参数是从dst UMat大小推导出来的(再次参见集合) ()call),这是OpenCL函数调用所需的所有参数。
现在args(...)为每个参数调用set(int index,T type),对于KernelArg,它将是
set(int i, const KernelArg &arg);
这是set call,这意味着它解包(使用KernelArg结构的成员)。 如果你想知道他们被分配给内核的地方是多少
clSetKernelArg(..)
在函数内部调用