将 YUV 数据转换为 Image 格式 Opencl

Posted

技术标签:

【中文标题】将 YUV 数据转换为 Image 格式 Opencl【英文标题】:Conversion of YUV data into Image format Opencl 【发布时间】:2017-03-13 08:43:52 【问题描述】:

我一直在做一个项目,我使用 YUV 作为输入,并且必须将此信息传递给内核才能处理该函数。我曾研究过类似的问题,但从未找到准确的答案来解决我的担忧。我尝试了一种简单的方法将 YUV 转换为 Opencl 处理的图像格式。但是,当我尝试打印已转换为图像的数据时,我得到的第一个值是正确的,然后是另外三个为零,然后我得到的第 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 是一个无符号字符。 这里 YUV_Data 是包含输入 YUV 图像的缓冲区,但我只处理代码中的 Y 元素。

【问题讨论】:

你必须发布一些代码,以便我们有话要说。 @Mikhail,当然,我会在某个时间发布。 我想你知道YUVUV 分量经常被二次采样,所以它们不是每个Y 样本都存在?您是否尝试过将图像转换为直接的顺序 CPU 代码? @Mark,实际上没有,我没有在 CPU 上尝试过。但是,让我纠正一下,我目前只使用 Y 组件。所以应该问题不大。只能让Y转成图片 @Mark,我也尝试过直接顺序 CPU 代码,这次我得到的只是 3 个零,后跟 1,整个图像重复相同的序列。 【参考方案1】:

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

【讨论】:

感谢您的回答,我认为这将帮助我解决我的疑虑。但是,如果您能为您的方法举一些例子,我将非常感激。我的另一个担忧是是否只有 YUV 数据的 Y 分量可以转换为 2D 图像。 @Harrisson 那是什么类型的 YUV? NV21 或 YUV 888 还是其他? @Huseyin,我不确定 YUV 格式,但我认为它是 YUV420 @Harrison 看看这个***.com/questions/22855510/…【参考方案2】:

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

【讨论】:

以上是关于将 YUV 数据转换为 Image 格式 Opencl的主要内容,如果未能解决你的问题,请参考以下文章

将android.media.Image(YUV_420_888)转换为Bitmap

为啥H264编码要先把数据转换成YUV图像格式的

如何将yuv420p数据旋转90

使用渲染脚本将相机 YUV 数据转换为 ARGB

如何将rgb 模式转换成 yuv 模式

将 H264 视频转换为原始 YUV 格式