簡體   English   中英

在c ++中從YUV轉換為RGB(android-ndk)

[英]Convert from YUV to RGB in c++ (android-ndk)

我在android中開發,並希望將字節數組從相機的previewCallback(YUV格式)轉換為rgb格式。

我使用了這個答案中給出的功能: 從Android中的視頻圖像中獲取幀

它在java中完美運行,但我的問題是我想用c ++編寫函數(我使用的是ndk,而不是很熟悉c ++)。

我試圖用c ++創建函數,但它總是會產生奇怪的結果(例如圖片全部為綠色)。

有沒有人有類似的功能或這個功能在c ++中工作?

謝謝。

在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請查看此內容

看看這個: http//pastebin.com/mDcwqJV3

從YUYV到RGB24的定點轉換

此外,某些相機以“UYVY”字節為單位返回原始圖像,因此在轉換功能中進行相應的更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM