gpt4 book ai didi

android - YUV NV21 转换为 RGB 的困惑

转载 作者:IT老高 更新时间:2023-10-28 21:47:10 27 4
gpt4 key购买 nike

根据http://developer.android.com/reference/android/graphics/ImageFormat.html#NV21 , NV21 是默认使用的格式。

网上有很多关于 YUV NV21 到 RGB 转换的代码。但是,当我浏览代码时,我怀疑代码的正确性。

第一个分量 V 应该在前,然后是第一个分量 U

根据http://wiki.videolan.org/YUV#NV21 , NV21 和 NV12 一样,但是 U 和 V 顺序颠倒了:它以 V 开头。 但是,当我通过代码实现时

R应该是最重要的位置根据 Color.javaint argb 的实现, R 假设在最重要的位置。但是,我经历了以下代码实现

我想知道,是他们犯了常见的错误,还是我忽略了什么?

目前,我的实现如下。

public static void YUV_NV21_TO_RGB(int[] argb, byte[] yuv, int width, int height) {
final int frameSize = width * height;

final int ii = 0;
final int ij = 0;
final int di = +1;
final int dj = +1;

int a = 0;
for (int i = 0, ci = ii; i < height; ++i, ci += di) {
for (int j = 0, cj = ij; j < width; ++j, cj += dj) {
int y = (0xff & ((int) yuv[ci * width + cj]));
int v = (0xff & ((int) yuv[frameSize + (ci >> 1) * width + (cj & ~1) + 0]));
int u = (0xff & ((int) yuv[frameSize + (ci >> 1) * width + (cj & ~1) + 1]));
y = y < 16 ? 16 : y;

int r = (int) (1.164f * (y - 16) + 1.596f * (v - 128));
int g = (int) (1.164f * (y - 16) - 0.813f * (v - 128) - 0.391f * (u - 128));
int b = (int) (1.164f * (y - 16) + 2.018f * (u - 128));

r = r < 0 ? 0 : (r > 255 ? 255 : r);
g = g < 0 ? 0 : (g > 255 ? 255 : g);
b = b < 0 ? 0 : (b > 255 ? 255 : b);

argb[a++] = 0xff000000 | (r << 16) | (g << 8) | b;
}
}
}

最佳答案

首先,我在图像编码方面并不是很有经验(大约一年前对此有一些有限的了解)。所以,对我的回答持保留态度。

但是,我相信你是对的。我认为在他们的代码中a) V 和 U 翻转b) R 和 B 翻转

我有一种感觉,当这两个东西都被翻转时,它会产生与它们没有被翻转一样的结果。这就是为什么您可以在许多地方找到错误代码的原因(最初,有人弄错了,然后将其复制到所有地方,因为生成的代码可以正常工作(但是,变量命名不正确))。

这是另一个代码示例(与您的代码相同): http://www.41post.com/3470/programming/android-retrieving-the-camera-preview-as-a-pixel-array

关于android - YUV NV21 转换为 RGB 的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12469730/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com