这个OpenCL代码是什么意思?uchar16是如何工作的?(OpenCV laplacian3.cl源码)

wfveoks0  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(148)

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语法?

waxmsbnn

waxmsbnn1#

在OpenCL中,uchar16是一个16元素的向量。
您可以使用一种“成员”语法来访问它的元素。您可以访问单个元素(b.s0),也可以访问多个元素作为另一个向量(b.s0123)。
假设buchar16

arr[0] = (uchar16)(a, b.s0123, b.s456789ab, b.scde);

这就组成了一个 new uchar16(并将其分配给arr[0]),使用a的值和b的前15个元素(0e),分三部分访问:两个4元素向量和一个3元素向量。b的值显示为 * 向右移动 *(视图向左移动)。

arr[1] = b;

它只是复制矢量。

arr[2] = (uchar16)(b.s123, b.s4567, b.s89abcdef, c);

这与第一种情况类似,不同的是现在b的 * 最后 * 15个值与c一起被取。这使得b现在看起来向左移动。
这种模式重复三次,使用不同的变量。
总的来说,这看起来像是通过准备一个(大)矩阵来建立卷积。我猜这是一个3x3卷积(移位),它可以对4通道数据(b,e,h,k)进行操作。
这是有意义的,因为拉普拉斯算子是作为核的卷积计算的。
你不会从这些实现中学到很多关于拉普拉斯算子或卷积的知识。这些实现是 code。代码不能解释理论。

相关问题