【问题标题】:yuv to rgb in assembleryuv到rgb在汇编器中
【发布时间】:2012-06-19 13:57:33
【问题描述】:

public void onPreviewFrame(byte[] data, Camera camera) 

我们得到 YUV 格式的数据。现在为了转换为 RGB,我在 NDK 中使用了转换器。但还是不够快。

所以我发现了这个: http://www.roman10.net/effective-color-conversion-yuv-rgb-in-android-in-assembly/

具有此 NDK 方法: https://github.com/roman10/roman10-android-tutorial/blob/master/colorConversion/jni/test.c

但我不知道如何更改它,以便它接受 YUV 字节数组“数据”并返回一个 RGB int 数组?

【问题讨论】:

  • 不幸的是,这个[github收藏](github.com/roman10/roman10-android-tutorial/blob/master/…使用的是一个转换错误的公式。它是针对YUV视频的,在ITU-R BT.601标准中定义,Y范围为[16。 .235]。相机图像来自YCbCr色彩空间,Y范围为[0..255]。变化不是很强烈,但对人眼来说很重要。

标签: android android-ndk


【解决方案1】:

您必须编写类似于naGetConvertedFrame() 的JNI 函数。新函数将具有以下声明:

JNIEXPORT void JNICALL Java_<name>_convert(JNIEnv * pEnv, jobject pObj, jobject pBitmap, jbyteArray jData, jint jWidth, jint jHeight)

函数的名称应该反映将该函数声明为native 方法的Java 类的名称(参见RenderView.java 示例)。在 Roman 的示例中,共享库 是从另一个类加载的,位于 Main.java - 但这个 loadLibrary() 可以很容易地转换到 RenderView.java 文件中。

private static native void convert(Bitmap _bitmap, byte[] data, int _width, int _height);

您的函数将与原始示例类似,只是它不会读取文件,而是使用GetByteArrayElements() 获取yuv 转换器的指针。

【讨论】:

  • 我用谷歌搜索了 GetByteArrayElemnts() 但仍然不知道如何从字节中获取 Y U V 值[]
  • 您从相机接收到的字节[] 是半平面的:首先是 Y 字节 (_width*_height),然后是 (_width*_height/4) 对 V 和 U 字节。如我所见,您打算使用的库仅支持平面 YUV(其中 U 像素和 V 像素是分开的)。您可能需要根据他们接受半平面输入的代码编写自己的函数。
猜你喜欢
  • 2014-01-25
  • 2021-05-28
  • 1970-01-01
  • 2014-09-18
  • 2012-11-25
  • 2019-12-12
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多