使用OpenCV UMat作为输入时,参数的OpenCL参数化

时间:2018-01-18 13:16:32

标签: c++ opencv opencl

我一直在查看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结构有什么特别之处可以实现这一点。

1 个答案:

答案 0 :(得分:1)

如果你浏览了一下opencv代码,你会发现它 ReadOnlyNosizeWriteOnly函数返回一个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(..)

在函数内部调用