在https://github.com/opencv/opencv/blob/4.x/modules/imgproc/src/opencl/laplacian3.cl的第107-118行中,我发现了以下代码:
arr[0] = (uchar16)(a, b.s0123, b.s456789ab, b.scde);
arr[1] = b;
arr[2] = (uchar16)(b.s123, b.s4567, b.s89abcdef, c);
arr[3] = (uchar16)(d, e.s0123, e.s456789ab, e.scde);
arr[4] = e;
arr[5] = (uchar16)(e.s123, e.s4567, e.s89abcdef, f);
arr[6] = (uchar16)(g, h.s0123, h.s456789ab, h.scde);
arr[7] = h;
arr[8] = (uchar16)(h.s123, h.s4567, h.s89abcdef, i);
arr[9] = (uchar16)(j, k.s0123, k.s456789ab, k.scde);
arr[10] = k;
arr[11] = (uchar16)(k.s123, k.s4567, k.s89abcdef, l);
变量a,b,c,d,e,f,g,h,i,j,k,l
声明如下:
uchar a; uchar16 b; uchar c;
uchar d; uchar16 e; uchar f;
uchar g; uchar16 h; uchar i;
uchar j; uchar16 k; uchar l;
我有点困惑,例如,b.s0123
是做什么的?它看起来不像普通的C++代码。也许是特殊的OpenCL语法?
1条答案
按热度按时间waxmsbnn1#
在OpenCL中,
uchar16
是一个16元素的向量。您可以使用一种“成员”语法来访问它的元素。您可以访问单个元素(
b.s0
),也可以访问多个元素作为另一个向量(b.s0123
)。假设
b
是uchar16
…这就组成了一个 new uchar16(并将其分配给
arr[0]
),使用a
的值和b
的前15个元素(0
到e
),分三部分访问:两个4元素向量和一个3元素向量。b
的值显示为 * 向右移动 *(视图向左移动)。它只是复制矢量。
这与第一种情况类似,不同的是现在
b
的 * 最后 * 15个值与c
一起被取。这使得b
现在看起来向左移动。这种模式重复三次,使用不同的变量。
总的来说,这看起来像是通过准备一个(大)矩阵来建立卷积。我猜这是一个3x3卷积(移位),它可以对4通道数据(
b,e,h,k
)进行操作。这是有意义的,因为拉普拉斯算子是作为核的卷积计算的。
你不会从这些实现中学到很多关于拉普拉斯算子或卷积的知识。这些实现是 code。代码不能解释理论。