2009-11-15 8 views
9

Jak wykonać konwersję RGB-> YUV w C/C++?Jak wykonać konwersję RGB-> YUV w C/C++?

Mam Bitmap .. RGB muszę go przekonwertować na YUV

Libs? Tuts? Artykuły?

+4

's/with actionscript/in C \/C++ /' nie sprawia, że ​​jest to nowe pytanie http://stackoverflow.com/questions/1737712/how-to-perform-rgb-yuv-conversion- with-actionscript – voyager

+1

Chcesz zmienić wartość RGB na YUV? Lub zmienić bitmapę RGB na plik YUV? Chcesz dokonać konwersji pliku graficznego, prawda? – voyager

+0

Jestem pewna, że ​​istnieje sposób na przeniesienie tej pracy na kartę Gfx. Ten rodzaj operacji jest idealny dla karty gfx. – fishfood

Odpowiedz

-3
+0

Pytanie, w którym należy wykonać konwersję w języku C/C++. ImageMagick to oczywiście C++, ale tutaj nie pokazano tutaj żadnych funkcji (plus ImageMagick jest pod własną licencją), więc przegłosowałem i wznowiłem odpowiedź Leszka. –

17

Sprawdź ten artykuł: http://www.fourcc.org/fccyvrgb.php konwersji jest dość łatwe, więc prawdopodobnie można napisać własną funkcję na podstawie tego

Y =  (0.257 * R) + (0.504 * G) + (0.098 * B) + 16 

Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128 

Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128 

Previously answered for ActionScript

+0

Witam Voyagera Potrzebuję pomocy, porzuciłem mój kod, który jest yv12-> rgb565. W taki sam sposób muszę wykonać dla yuv444 do rgb888. Proszę, prowadź mnie. Proszę spojrzeć na moje ostatnie pytanie dotyczące funkcji, która konwertuje yuv12-> rgb565 – Abhineet

+1

Zauważ, że istnieje kilka standardów rządzących przestrzenią kolorów, które możesz napotkać w pliku yuv (np. BT601, BT709, xvYcc) te formuły dadzą ci obraz widoczny z większością z nich, ale możesz potrzebować ich zmienić, aby uzyskać "poprawne" koplory (możesz również zapisać wartości wejściowe i wyjściowe, jeśli masz dane xvYcc lub inne niż 8 bitowe – tletnes

29

Można również spróbować te całkowitą tylko obliczenia (powinno być szybsze niż pływa)

#define CLIP(X) ((X) > 255 ? 255 : (X) < 0 ? 0 : X) 

// RGB -> YUV 
#define RGB2Y(R, G, B) CLIP((( 66 * (R) + 129 * (G) + 25 * (B) + 128) >> 8) + 16) 
#define RGB2U(R, G, B) CLIP(((-38 * (R) - 74 * (G) + 112 * (B) + 128) >> 8) + 128) 
#define RGB2V(R, G, B) CLIP(((112 * (R) - 94 * (G) - 18 * (B) + 128) >> 8) + 128) 

// YUV -> RGB 
#define C(Y) ((Y) - 16 ) 
#define D(U) ((U) - 128) 
#define E(V) ((V) - 128) 

#define YUV2R(Y, U, V) CLIP((298 * C(Y)    + 409 * E(V) + 128) >> 8) 
#define YUV2G(Y, U, V) CLIP((298 * C(Y) - 100 * D(U) - 208 * E(V) + 128) >> 8) 
#define YUV2B(Y, U, V) CLIP((298 * C(Y) + 516 * D(U)    + 128) >> 8) 

// RGB -> YCbCr 
#define CRGB2Y(R, G, B) CLIP((19595 * R + 38470 * G + 7471 * B) >> 16) 
#define CRGB2Cb(R, G, B) CLIP((36962 * (B - CLIP((19595 * R + 38470 * G + 7471 * B) >> 16)) >> 16) + 128) 
#define CRGB2Cr(R, G, B) CLIP((46727 * (R - CLIP((19595 * R + 38470 * G + 7471 * B) >> 16)) >> 16) + 128) 

// YCbCr -> RGB 
#define CYCbCr2R(Y, Cb, Cr) CLIP(Y + (91881 * Cr >> 16) - 179) 
#define CYCbCr2G(Y, Cb, Cr) CLIP(Y - ((22544 * Cb + 46793 * Cr) >> 16) + 135) 
#define CYCbCr2B(Y, Cb, Cr) CLIP(Y + (116129 * Cb >> 16) - 226) 
+3

To wszystko jest szaloną czarną magią mi :) – paulm

+0

Czy nie jest to lepsza odpowiedź, w porównaniu do tzw. "ImageMagick"? – kenmux

Powiązane problemy