3

私はAndroidで開発しており、バイト配列をカメラのpreviewCallback(YUV形式)からrgb形式に変換したいと考えています。

私はこの答えで与えられた機能を使用しました: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' バイト オーガで raw 画像を返すため、変換関数で対応する変更を行います。

于 2012-02-01T16:30:49.783 に答える