YUV数据到Opencl图像格式的转换

YUV数据到Opencl图像格式的转换,opencl,Opencl,我一直在从事一个项目,在这个项目中,我使用YUV作为输入,并且必须将此信息传递给内核以处理函数。我曾研究过类似的问题,但从未找到一个准确的答案来回答我的担忧。我尝试了一种简单的方法将YUV转换为Opencl处理的图像格式。然而,当我试图打印转换成图像的数据时,我得到的第一个值是正确的,然后另外三个值是零,然后我得到的是正确的第五个像素值。我不明白写作是问题还是阅读部分。我不知道如何继续进行这项工作。如果有人能帮助我,我将非常感激,或者如果你能给我一个如何将YUV转换成2D图像的例子。我是否需要将

我一直在从事一个项目,在这个项目中,我使用YUV作为输入,并且必须将此信息传递给内核以处理函数。我曾研究过类似的问题,但从未找到一个准确的答案来回答我的担忧。我尝试了一种简单的方法将YUV转换为Opencl处理的图像格式。然而,当我试图打印转换成图像的数据时,我得到的第一个值是正确的,然后另外三个值是零,然后我得到的是正确的第五个像素值。我不明白写作是问题还是阅读部分。我不知道如何继续进行这项工作。如果有人能帮助我,我将非常感激,或者如果你能给我一个如何将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;
}
/*内核代码*/
int2位置;
uint4输入;
对于(inti=0;i
YUV_数据是一个无符号字符。
这里的YUV_数据是包含输入YUV图像的缓冲区,但我只处理代码中的Y元素。

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

我已经解决了与此相关的问题。我不必转换成任何其他格式。我使用了相同的YUV格式,在设备端也能完美地阅读。我所做的唯一额外的包含是将CL\U RGBA作为图像格式包含在内。

你必须发布一些代码,这样我们就可以谈点什么了。@Mikhail,当然,我会在某个时候发布。我想你应该意识到
YUV
U
V
组件通常都是二次采样的,所以它们不是每个
Y
样本都存在吗?你有没有试过将图像转换成直接、连续的CPU代码?@Mark,没有,事实上,我没有在CPU上尝试过。但是,让我更正一下,我目前只使用Y组件。所以这不应该是个问题。只能将Y转换为image@Mark,我也尝试了直接顺序的CPU代码,这次我得到的是3个0,后面跟着1,整个图像重复相同的顺序。谢谢你的回答,我想这会帮助我解决我的问题。但是,如果你能帮我举一些你的方法的例子,我将非常感谢。我更关心的是YUV数据中是否只有Y分量可以转换成2D图像。@Harrisson那是什么类型的YUV?NV21或YUV 888或其他什么?@Huseyin,我不确定YUV格式,但我认为它是YUV420@Harrison看看这个