Конвертировать из YUV в RGB в c ++ (android-ndk) - PullRequest
3 голосов
/ 01 февраля 2012

Я работаю в Android и хочу преобразовать байтовый массив из предварительного просмотра камеры, который находится в формате YUV, в формат rgb.

Я использовал функцию, приведенную в этом ответе: Получение кадров из видеоизображения в Android

Это прекрасно работает в Java, но моя проблема в том, что я хочу сделать функцию в C ++ (я использую ndk, и не очень знаком с C ++).

Я пытался создать функцию в c ++, но она всегда дает странные результаты (например, все изображение зеленое).

У кого-нибудь есть подобная функция или эта функция работает в c ++?

Спасибо.

Ответы [ 2 ]

6 голосов
/ 07 мая 2013

Преобразование из YUYV в RGB в C ++:

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 также является неподписанным символом *.

Более подробную информацию о YUYV можно найти здесь

И для получения дополнительной информации о YUYV -> RGB, проверьте это

1 голос
/ 01 февраля 2012

Посмотрите на это: http://pastebin.com/mDcwqJV3

Преобразование с фиксированной запятой из YUYV в RGB24

Кроме того, некоторые камеры возвращают необработанные изображения в байтовом устройстве 'UYVY', поэтому внесите соответствующие изменения вфункция преобразования.

...