android - Google Tango Leibniz API 中的彩色图像

标签 android c camera yuv google-project-tango

我正在尝试从 Google Tango 的 onFrameAvailable 方法中捕获图像数据。我正在使用莱布尼茨版本。在头文件中据说缓冲区包含 HAL_PIXEL_FORMAT_YV12 像素数据。在 release notes他们说缓冲区包含 YUV420SP。但在documentation据说像素是RGBA8888格式()。另外我有点困惑。我并没有真正获得图像数据,但有很多洋红色和绿色。现在我正在尝试从 YUV 转换为 RGB 类似于 this one 。我想步幅也有问题。这是 onFrameAvailable 方法的代码:

int size = (int)(buffer->width * buffer->height);
for (int i = 0; i < buffer->height; ++i)
{
   for (int j = 0; j < buffer->width; ++j)
   {
       float y = buffer->data[i * buffer->stride + j];
       float v = buffer->data[(i / 2) * (buffer->stride / 2) + (j / 2) + size];
       float u = buffer->data[(i / 2) * (buffer->stride  / 2) + (j / 2) + size + (size / 4)];

               const float Umax = 0.436f;
               const float Vmax = 0.615f;

               y = y / 255.0f;
               u =  (u / 255.0f - 0.5f) ;
               v =  (v / 255.0f - 0.5f) ;

               TangoData::GetInstance().color_buffer[3*(i*width+j)]=y;
               TangoData::GetInstance().color_buffer[3*(i*width+j)+1]=u;
               TangoData::GetInstance().color_buffer[3*(i*width+j)+2]=v;
   }
}

我正在 fragment 着色器中进行 yuv 到 rgb 的转换。

有人获得过 Google Tango Leibniz 版本的 RGB 图像吗?或者有人在从 YUV 转换为 RGB 时遇到类似的问题?

最佳答案

YUV420SP(又名 NV21)暂时是正确的。解释是here 。在这种格式中,您有一个 width x height 数组,其中每个元素都是一个 Y 字节,后跟一个 width/2 x height/2 数组,其中每个元素是一个 V 字节和一个 U 字节。您的代码正在实现 YV21,它具有单独的 V 和 U 数组,而不是将它们交错在一个数组中。

您提到您正在 fragment 着色器中进行 YUV 到 RGB 的转换。如果您只想绘制相机图像,则可以使用 TangoService_connectTextureId()TangoService_updateTexture() 而不是 TangoService_connectOnFrameAvailable()。这种方法已经以 OpenGL 纹理的形式向您提供相机图像,该纹理为您的 fragment 着色器提供 RGB 值,而无需担心像素格式细节。您需要绑定(bind)到GL_TEXTURE_EXTERNAL_OES(而不是GL_TEXTURE_2D),您的 fragment 着色器将如下所示:

#extension GL_OES_EGL_image_external : require

precision mediump float;

varying vec4 v_t;
uniform samplerExternalOES colorTexture;

void main() {
   gl_FragColor = texture2D(colorTexture, v_t.xy);
}

如果出于某种原因您确实想将 YUV 数据传递到 fragment 着色器,则无需将其预处理为 float 即可执行此操作。事实上,您根本不需要解压它 - 对于 NV21,只需为 Y 定义一个 1 字节纹理,为 VU 定义一个 2 字节纹理,然后按原样加载数据。您的 fragment 着色器将为两者使用相同的纹理坐标。

关于android - Google Tango Leibniz API 中的彩色图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30226424/

相关文章:

c - NTRUEncrypt C 实现

c - VS2013 : strtof doesn't set ERANGE?

c - MPI 数组搜索

java - 计算高度图上的高度

android - 使用 Android camera2 获取全屏预览

android - 如何确定 Android 版本的修订号?

java - 动态设置 View 的背景颜色

android studio 3.1 总是收到关于无法解析依赖的错误

android - 如何在 Android 应用程序中绘制类似谷歌地图的多边形?

iphone - 如何从 iOS 中的照片中检测带框的图像