3

我在android中开发,并希望将字节数组从相机的previewCallback(YUV格式)转换为rgb格式。

我已经使用了这个答案中给出的功能:Getting frames from Video Image in Android

它在java中完美运行,但我的问题是我想用c++制作函数(我使用的是ndk,对c++不太熟悉)。

我曾尝试在 c++ 中创建该函数,但它总是产生奇怪的结果(例如,图片全是绿色)。

有没有人有类似的功能或这个功能在 c++ 中工作?

谢谢。

4

2 回答 2

9

在 C++ 中从 YUYV 到 RGB 的转换:

unsigned char* rgb_image = new unsigned char[width * height * 3]; //width and height of the image to be converted

int y;
int cr;
int cb;

double r;
double g;
double b;

for (int i = 0, j = 0; i < width * height * 3; i+=6 j+=4) {
    //first pixel
    y = yuyv_image[j];
    cb = yuyv_image[j+1];
    cr = yuyv_image[j+3];

    r = y + (1.4065 * (cr - 128));
    g = y - (0.3455 * (cb - 128)) - (0.7169 * (cr - 128));
    b = y + (1.7790 * (cb - 128));

    //This prevents colour distortions in your rgb image
    if (r < 0) r = 0;
    else if (r > 255) r = 255;
    if (g < 0) g = 0;
    else if (g > 255) g = 255;
    if (b < 0) b = 0;
    else if (b > 255) b = 255;

    rgb_image[i] = (unsigned char)r;
    rgb_image[i+1] = (unsigned char)g;
    rgb_image[i+2] = (unsigned char)b;

    //second pixel
    y = yuyv_image[j+2];
    cb = yuyv_image[j+1];
    cr = yuyv_image[j+3];

    r = y + (1.4065 * (cr - 128));
    g = y - (0.3455 * (cb - 128)) - (0.7169 * (cr - 128));
    b = y + (1.7790 * (cb - 128));

    if (r < 0) r = 0;
    else if (r > 255) r = 255;
    if (g < 0) g = 0;
    else if (g > 255) g = 255;
    if (b < 0) b = 0;
    else if (b > 255) b = 255;

    rgb_image[i+3] = (unsigned char)r;
    rgb_image[i+4] = (unsigned char)g;
    rgb_image[i+5] = (unsigned char)b;
}

此方法假定您的 yuyv_image 也是 unsigned char* 。

更多关于 YUYV 的信息可以在这里找到

有关 YUYV 的更多说明 --> RGB 看看这个

于 2013-05-07T14:25:52.520 回答
1

看看这个: http: //pastebin.com/mDcwqJV3

从 YUYV 到 RGB24 的定点转换

另外,有些相机以'UYVY'字节顺序返回原始图像,因此在转换函数中进行相应的更改。

于 2012-02-01T16:30:49.783 回答