将YUV数据转换为图像格式Opencl

时间:2017-03-13 08:43:52

标签: opencl

我一直致力于一个项目,我使用YUV作为输入,并且必须将此信息传递给内核才能处理该函数。我曾调查过类似的问题,但从未找到对我的担忧的准确答案。我尝试了一种简单的方法将YUV转换为Opencl Processing的Image格式。但是,当我尝试打印已转换为图像的数据时,我得到第一个值正确,然后另外三个为零,然后我得到第5个像素值正确。我不明白写作是问题还是阅读部分。我很困惑如何继续这个。如果有人可以帮助我,我将非常感激,或者如果你能给我举例说明如何将YUV转换为2D图像。我是否有必要将YUV转换为RGB以便在设备上处理它。如果有人需要,我也可以发布示例代码。感谢您提前提供任何帮助。

/*Kernel Code*/

int2 position;
uint4 Input;
for(int i = 0; i < Frame_Height; i++){ 
for(int j = 0; j < Frame_Width; j+=4){ 
position = (int2)(j,i);
Input.s0 = (uint)YUV_Data[j];
Input.s1 = (uint)YUV_Data[j+1];
Input.s2 = (uint)YUV_Data[j+2];
Input.s3 = (uint)YUV_Data[j+3];
write_imageui( 2D_Image, position, Input );
}
YUV_Data += Frame_Width;
}

YUV_Data是一个unsigned char。 这里YUV_Data是包含输入YUV Image的缓冲区,但我只是处理代码中的Y元素。

2 个答案:

答案 0 :(得分:1)

我们这样做的方法是在OpenCL 缓冲区中传递YUV数据,并运行一个内核,在OpenCL 图像中将其转换为RGB,用于进一步RGB处理。 某些 YUV格式可以作为图像传递;如果你的话可以随意这样做(但很多人不能,比如v210,所以我们总是使用Buffers)。在我们的处理链的末尾,如果我们再次需要YUV,我们运行一个内核,将RGB [A]图像转换为YUV缓冲区。

答案 1 :(得分:0)

我已经解决了有关问题的问题。我没有必要转换成任何其他格式。我使用相同的YUV格式在设备端完美读取它。我做的唯一额外包含是将CL_RGBA包含为image_format。