找回密码
 注册
搜索
查看: 4557|回复: 1

YUV像素和RGB之间的转换

[复制链接]
发表于 2011-5-30 09:56:44 | 显示全部楼层 |阅读模式
RGB转成YUV(RGB to YUV Conversion)
2 ?7 O* |% s* V4 [+ YY  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
$ ]4 k  p$ S" h5 D' X7 tCr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
: K6 S4 D/ w; w8 n+ D2 E: uCb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128YUV转成RGB(YUV to RGB Conversion)
, w3 K# G9 g1 B9 rB = 1.164(Y - 16)                   + 2.018(U - 128)
  n* V9 _% H( `1 uG = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
2 z/ p' X4 s0 V/ iR = 1.164(Y - 16) + 1.596(V - 128)/ ^$ j; E) Q+ A' b! m, O
R, G, B, Y , Cr, Cb的取值范围都是[0,255].; z' F: s9 |' W0 i( z) j

& [$ L8 a9 S% k7 g原文:http://www.rosoo.net/a/200604/6049.html! r% R# \& v2 `/ V, v
 楼主| 发表于 2011-5-30 17:08:39 | 显示全部楼层

YUY2视频转化RGB格式

//YUY2视频转化RGB格式 by hardy 2007-10-17$ [( w* P7 n( T# _- @; d8 _
//http://www.fourcc.org/fccyvrgb.php$ \% O! `) M% n5 h6 N) l! s
inline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
. f# K9 }1 x; E{$ ~: V2 v) C, p; [
//B = 1.164(Y - 16)         + 2.018(U - 128)2 }8 C8 T- P1 Q0 ], r0 A
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)3 N- H0 G0 U/ F4 C% @
//R = 1.164(Y - 16) + 1.596(V - 128)' N* I- p  {6 \( g
BYTE *orgRGBbuff = RGBbuff;
. @; A6 ^" ]% f: ?- V( T: W/ dfor(DWORD count=0;count<dwSize;count+=4). r% s$ G  i$ a/ S" \
{! e. v3 E1 ~( m* ]
//Y0 U0 Y1 V0
: o. Q9 E! w' ]7 X5 h2 Zfloat Y0 = *YUY2buff;
' j+ D4 H8 s0 lfloat U = *(++YUY2buff);5 c# P" y& w. x. }
float Y1 = *(++YUY2buff);
% D  N0 x- `0 @' F8 ]2 t6 ?$ G1 Qfloat V = *(++YUY2buff);' Z5 y: k7 q* s) @. |$ \
++YUY2buff;
( F! ^1 a/ m% m0 o7 [*(RGBbuff) =   (BYTE)(Y0 + (1.370705 * (V-128)));           : p: w3 y  w+ d8 E: O: C2 p, c
*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
9 |! v, H% t0 G, C*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));        : |% X) t1 N# x
*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));           
( L1 d+ ?5 B6 I# `# h*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
% k# `( ?! c: a. v$ i. {*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));         2 R# Z1 |$ S8 t. Q. ]
++RGBbuff;& e6 K! @2 p8 E1 S
}
; K! B2 |, h, f2 o; }$ F# ]% A/ ^}  d  ]- Q) T" ], t
inline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)  T& v* X6 B$ @* v8 l& R  y
{5 j0 {; I) F; z3 G1 c; w
//R = Y + 1.14V5 ?4 s2 x) w, X4 U9 T/ L
//G = Y - 0.39U - 0.58V. _, G  v+ A" d. u2 s4 d6 I- `& ^
//B = Y + 2.03U
& m* E4 G7 j6 G& k( h  x// R = Y + 1.403V'' X: ?: ]3 Y0 [4 \; K- v
//G = Y - 0.344U' - 0.714V'
  b+ }" p  t1 ^//B = Y + 1.770U'
7 {- ^% q$ i3 P/ L+ }" l5 jBYTE *orgRGBbuff = RGBbuff;- |& N/ r' M' R  {/ e) R# w2 [
for(DWORD count=0;count<dwSize;count+=4)
" v) @, k$ c/ P6 J3 W1 A0 |$ ?{  R6 d/ D2 w+ T. e3 Z8 s5 N, w
//Y0 U0 Y1 V09 Q* u: k. E% A: V" J1 \% [* u
float Y0 = *YUY2buff;
" V, B- O1 T& _. ?5 u! Sfloat U = *(++YUY2buff);
1 T% s. }5 c' d( ]0 Afloat Y1 = *(++YUY2buff);. X% G* J$ z0 `" t2 v- p8 a+ g
float V = *(++YUY2buff);* v7 x% C( G! t: C( G" \
++YUY2buff;
, F# s9 I6 D* r( yfloat R,G,B;
' C: `# R  Y% c5 d( H: O- `6 b5 o0 q
R = (Y0 + 1.14f*V); 8 M* \5 y8 r7 ?
G=(Y0 - 0.39f*U-0.58f*V);   ( R1 [8 B1 @6 {9 c
B=(Y0 +2.03f*U);
+ ?6 U' |& d: X1 R: cif(R<0) R =0;+ p" o' y( y/ Q2 r- z  u+ @4 b
if(R>255) R=255;( c& F( N: e1 _7 r  q
if(G<0) G =0;" b" b' b$ |& Y
if(G>255) G=255;
5 T; ^  q) }- a. S' ], Vif(B<0) B =0;
$ D0 `( t+ ^' R' S( q+ qif(B>255) B=255;
" ?. f# F# y$ t  G' E8 e& [2 J- ~*(RGBbuff) =     (BYTE)B;          ' |. O9 A5 c9 T9 b# r
*(++RGBbuff) = (BYTE)G;+ n$ |7 u4 \6 M" [7 x3 ^. b; V* y6 c
*(++RGBbuff) = (BYTE)R;
2 d4 _9 e& \0 s# W" CR = (Y1 + 1.14f*V);
  Z" S- o6 k8 b( ]3 F+ oG=(Y1 - 0.39f*U-0.58f*V);   $ _, N5 I2 j  @' o2 j6 {9 ~$ H- b. Y1 J
B=(Y1 +2.03f*U)   ;
9 f' @; D; ~7 w0 H! Y& L7 L" Mif(R<0) R =0;2 w" A6 }2 f0 [  E3 C% h
if(R>255) R=255;- P, O% K7 I# I1 c7 ]2 K" n
if(G<0) G =0;: n3 W  ]4 z8 N
if(G>255) G=255;
$ N5 L9 f' j, n4 Q  Oif(B<0) B =0;) D$ N6 j' }( C/ y. N1 Y5 w
if(B>255) B=255;, p2 f( {: C+ Q# F
*(++RGBbuff) =     (BYTE)B;          + L7 T! `+ e- n2 K
*(++RGBbuff) = (BYTE)G;
, X! m+ ^1 T) n8 s6 C*(++RGBbuff) = (BYTE)R;' K6 o' w& ^5 T6 c
++RGBbuff;( O( ~0 t. {- }3 \1 E" c1 f9 k5 C
}
2 w. j9 w7 b. \2 m}
; f' M; b! U/ M) s5 {inline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
2 l6 X3 T* b3 l" L  r{/ K7 _# k1 D/ D9 T( U8 ~- m1 g1 f
" \5 U+ c6 n; }$ U+ v; j9 }
// R = Y + 1.403V'6 M) R8 ^6 l. N1 N
//G = Y - 0.344U' - 0.714V'9 h4 v/ t9 L& B3 d
//B = Y + 1.770U'
: m! z2 o& A, z7 o2 w; Z9 t0 ABYTE *orgRGBbuff = RGBbuff;) y) S5 M7 }/ S" j" n* I+ E" u2 C
for(DWORD count=0;count<dwSize;count+=4)
/ O9 {2 \- }+ P# D7 b  J{
. B0 X' f$ R) \0 g2 B//Y0 U0 Y1 V0
" n* \8 w$ d% y" E6 cfloat Y0 = *YUY2buff;* m3 F+ m# z2 ?9 v* ~
float U = *(++YUY2buff);9 D4 L2 @2 e) I) D
float Y1 = *(++YUY2buff);# \- _& [+ ^  K: `
float V = *(++YUY2buff);$ @, U% ^# F/ [  G: G2 g
++YUY2buff;  R& r( N; x, Y0 a* N+ A
float R,G,B;  Y/ s6 U: X% v/ p0 N
, o0 o1 r$ I- J( y. R
R = (Y0 + 1.403f*V);
. x; s4 T& U1 o- F/ DG=(Y0 - 0.344f*U-0.714f*V);   # t6 W% V; ?' O8 E+ w; J
B=(Y0 +1.77f*U); $ U- G4 Y. S2 ]. p4 S7 P
if(R<0) R =0;
( `+ y1 i; ^/ |if(R>255) R=255;
1 Q5 t' w$ _6 R+ O! s+ S+ S2 p, uif(G<0) G =0;- E9 f: }3 J- I# I
if(G>255) G=255;$ E- D6 ^  W5 B3 X: s
if(B<0) B =0;, D) x5 \. u) ~
if(B>255) B=255;
0 \2 A; j: f* }! ^# y" k*(RGBbuff) =     (BYTE)R;         
6 F) m' m5 |$ c*(++RGBbuff) = (BYTE)G;
) p; G4 z  a; [. i/ D*(++RGBbuff) = (BYTE)B;
3 O1 d4 e7 _& jR = (Y1 + 1.403f*V); 4 f  Y; J: _/ e& v* B5 w: ~
G=(Y1 - 0.344f*U-0.714f*V);   
* j9 t- c2 c1 R$ j6 R6 h/ P0 y1 UB=(Y1 +1.77f*U);
* v7 T8 [! ~4 w; D, Zif(R<0) R =0;9 O% T3 r/ v. Y) d. N" g5 ^
if(R>255) R=255;
3 Q9 e0 f: p8 aif(G<0) G =0;/ k5 b& V+ @0 K7 g$ i3 t) Z" L
if(G>255) G=255;' T! O6 V3 U; m5 X" M5 \
if(B<0) B =0;( o! B' L0 i$ m( r
if(B>255) B=255;  I  c# P3 ^. h7 P5 c7 s
*(++RGBbuff) =     (BYTE)R;          & x3 B! T7 H& I1 W
*(++RGBbuff) = (BYTE)G;! Q5 M1 Q1 l7 V( D( f* y! r1 S( U. X) ^
*(++RGBbuff) = (BYTE)B;
/ q8 b/ S% j. Z8 U- t- O) e# |++RGBbuff;! i9 {' D, `* n" M. `' ^
}* ]& S3 F. b- C
}
. f8 a7 I' S7 p7 A9 L9 oinline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
( t! j/ S$ f4 B0 X4 L7 G4 g{
1 S8 E8 s/ B# G) y# \  Q8 g//B = 1.164(Y - 16)         + 2.018(U - 128)
; w! ~" D4 \0 s" K* k+ o//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
$ N+ n* ~% O- t1 [6 `7 g7 ~& v//R = 1.164(Y - 16) + 1.596(V - 128)
0 S* }( {/ b3 ^* ^+ {& c6 BBYTE *orgRGBbuff = RGBbuff;
6 f1 a2 w$ H) U9 U7 x- Kfor(DWORD count=0;count<dwSize;count+=4)5 R; B# b% h! E5 f  L
{
2 q/ T2 t& [: _! Q. l//Y0 U0 Y1 V0
; n) V# R+ e" C5 hfloat Y0 = *YUY2buff;
; z, h- \2 O; n# X9 G8 }" efloat U = *(++YUY2buff);
6 h3 o) |! }  X0 ~2 tfloat Y1 = *(++YUY2buff);5 g5 T* v( A3 U" \2 `6 a
float V = *(++YUY2buff);
/ w. s* K3 g( b$ S$ K4 Q; g* J++YUY2buff;
* e/ e1 j1 v6 c& {+ G: [*(RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           
9 S! V2 ?8 {0 T% Z*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   
& v- N6 Y% y8 f9 E& |  a/ g' {*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));        0 g% j0 r1 b) t- H2 `1 ^. A. R
*(++RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           
: C5 Z4 b; f* E*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   
7 f' |; U, U7 h+ \/ Z7 R0 z+ I*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));          9 T" x6 V% R! ?" {8 X
++RGBbuff;
; ]( I! N: W" S* S7 d5 B
  ?% I  O! a* h( U; n. v}
( ]8 ?6 \/ W  R# x6 A# x}
3 c" D/ X* ^  C( t0 T! T// http://msdn2.microsoft.com/en-us/library/ms893078.aspx
, m: x; t- u" _% L, f% Hvoid VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
, A7 Q$ t* U# M1 v( {{
0 E1 ?* B+ p  d6 I2 `1 L//
, S$ m" c( N) s. w: s; Z//C = Y - 16
& }0 s- C4 s. T1 {7 I//D = U - 128& U' s9 V. `  y/ b1 f# j0 N
//E = V - 128
* F( ?* e; X- Q% D: g- m//R = clip(( 298 * C           + 409 * E + 128) >> 8)) j6 e* M8 g' [) S
//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)! ?8 x5 D, ~2 W' f
//B = clip(( 298 * C + 516 * D           + 128) >> 8)
& ~* t1 X) e' H2 e2 D: d+ bBYTE *orgRGBbuff = RGBbuff;9 Z6 \0 [  G( U% K- q
for(DWORD count=0;count<dwSize;count+=4); W# f1 r# c4 m) h) f6 P7 q* X
{
# E' v! E5 A- F9 r% C//Y0 U0 Y1 V01 S' @1 J0 T3 X  I- U3 O3 X
BYTE Y0 = *YUY2buff;( W! N1 H' J4 ^/ |; o
BYTE U = *(++YUY2buff);, w, `/ E# H8 c- `
BYTE Y1 = *(++YUY2buff);
" ~* _" W8 P7 ^! Y- tBYTE V = *(++YUY2buff);
: n* e2 k, o. O8 [++YUY2buff;
- M( `& z9 U2 E* x5 I" v) hLONG Y,C,D,E;
, D/ m. a$ Y4 y- ~BYTE R,G,B;
4 [" e3 N' l( h( ^. S5 c1 z% @/ b" y( q' {% n7 F
Y = Y0;) g: y$ S5 C# `) J% m, o
C = Y-16;5 I7 J7 @  b5 j' ?
D = U-128;
8 A% K8 q' s6 V  r% AE = V-128;. c. p" H/ A1 ?( V
R = clip255(( 298 * C           + 409 * E + 128) >> 8);& E5 \( V- V$ e$ p
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
0 \! o% P, j; `& v" o- P2 V8 `B = clip255(( 298 * C + 516 * D           + 128) >> 8);, M* \6 D! I$ v$ K& V3 f  l* ~) b7 s
*(RGBbuff) =   B;           
/ _3 d9 c8 ?# [$ `6 @*(++RGBbuff) = G;   
) ^9 t0 j+ J. [+ A6 {8 K: B6 M9 C# C8 K*(++RGBbuff) = R;        4 T: B. {1 c: W9 j! z7 a
Y = Y1;
! ]' r4 Q+ ]7 v# v1 pC = Y-16;
  n% X6 L+ Z/ KD = U-128;
0 i9 n4 P+ q6 q! XE = V-128;/ m7 \. y; |# U& @1 o9 B- R
R = clip255(( 298 * C           + 409 * E + 128) >> 8);
1 O+ c, F0 m- m' V3 c6 e6 hG = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);/ F, [, Q$ _% R* d( g# s' Q
B = clip255(( 298 * C + 516 * D           + 128) >> 8);
% n4 K0 O* j4 M( w*(++RGBbuff) =   B;           
8 |8 l  a# m/ z# {*(++RGBbuff) = G;   2 C( g; J6 D' {2 ]* ~
*(++RGBbuff) = R;         ; f" m. \  b) w
++RGBbuff;* b, b* N# m; g7 |
5 @! k2 x  Q2 S- C6 \+ Z, l3 Z
}
+ |& _$ s- A$ ^}$ n% d% R9 }; u" q: o* W
BYTE VC4000Graber::clip255(LONG v)/ I+ m' a, u6 K) x; x& q" @
{
7 p# P0 @8 X& I1 G4 M6 L9 e0 Gif(v<0) v=0;
# d# Q2 X/ {% K! O. c, I% L. ^else if(v>255) v=255;
1 Z$ A, T% Q3 jreturn (BYTE)v;( v* j1 P( h# z# D" K9 T* x# ?8 x. h
}
* s; h% I) V' q  ~
0 s- U7 e( f- y; `本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hardVB/archive/2007/10/18/1831810.aspx& L$ F' a. ?% D* n! h6 t  _: \
5 l0 H/ Y+ b. S
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-6-18 08:01 , Processed in 0.021672 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表