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

YUV像素和RGB之间的转换

[复制链接]
发表于 2011-5-30 09:56:44 | 显示全部楼层 |阅读模式
RGB转成YUV(RGB to YUV Conversion)1 D5 v6 I( h5 w5 W: _7 |2 m3 ~
Y  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
2 N  L7 G/ t% K3 C; O  E* b. K: C( gCr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 1285 p' U6 D9 [5 ?# {  ]2 g
Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128YUV转成RGB(YUV to RGB Conversion)/ w5 m% H( K) T" S5 `
B = 1.164(Y - 16)                   + 2.018(U - 128)
" }0 F) j7 U4 }, ], ~G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)4 x" T1 B5 w. E0 X# s1 w  k
R = 1.164(Y - 16) + 1.596(V - 128)3 i' ?, T1 @, C- i) U8 l
R, G, B, Y , Cr, Cb的取值范围都是[0,255].
3 S( C, E- c; G) C/ g' P
2 F7 _* c1 m! R# X( |0 \. S& m原文:http://www.rosoo.net/a/200604/6049.html
, V; Y$ x/ W. I* R; _( ~7 ?
 楼主| 发表于 2011-5-30 17:08:39 | 显示全部楼层

YUY2视频转化RGB格式

//YUY2视频转化RGB格式 by hardy 2007-10-175 U/ j6 x6 E) _2 r4 I
//http://www.fourcc.org/fccyvrgb.php! z- p4 |% j  X$ W- Y( t
inline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize); b4 y$ g( n3 I1 f+ d3 q9 G. ^
{
% i: f! J! b  O) P//B = 1.164(Y - 16)         + 2.018(U - 128)
9 t% {8 ~! f$ V, t//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)9 z3 g9 }9 u* @% z; }' y, l% B
//R = 1.164(Y - 16) + 1.596(V - 128)7 U7 ]9 n$ M7 p' X
BYTE *orgRGBbuff = RGBbuff;. O6 X" k0 M" N6 t$ R% u
for(DWORD count=0;count<dwSize;count+=4)
6 c3 f! `, ~  C- b5 \{
/ B4 G& K, |* w9 ^* I+ h//Y0 U0 Y1 V0
% ?4 f" ^/ u) P- qfloat Y0 = *YUY2buff;. c* c( D6 O) |* B# ?. n+ }' L
float U = *(++YUY2buff);
7 a" b" x% h- }- m) |  ~float Y1 = *(++YUY2buff);5 D  y, _% T& X# a0 S
float V = *(++YUY2buff);
1 \  N) a9 W( R7 O++YUY2buff;8 c- n- i7 `: X7 o
*(RGBbuff) =   (BYTE)(Y0 + (1.370705 * (V-128)));           
9 }) s+ _. _5 I4 n  I/ n' k! V*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
. C: E) m6 m( C*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));        : {% Q  ^+ X4 g/ a. g
*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));           ! }* h* k, ^; d
*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
! j1 ~$ S) D- v* u! `6 P*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));         ; w0 f; }' ]2 r1 a* ~2 v* t/ ~
++RGBbuff;( i  ]$ b# ~# D* o4 F3 H* L
}
  k' j( n- Z9 r}
# _! B3 P; \& U4 o; S+ q8 [inline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)- e3 m6 u7 o1 l  T
{
+ I. }# }5 `' D' c4 k. ?//R = Y + 1.14V; X, p, c9 _  ]" r; y
//G = Y - 0.39U - 0.58V6 F/ ~( A# T5 Z7 ^) \/ q% u
//B = Y + 2.03U
2 v) t8 e& ~/ C& r5 p  ?// R = Y + 1.403V'/ v9 E7 u8 }: M' P
//G = Y - 0.344U' - 0.714V'
: R; l% |" B, M; r: U% X* h+ b//B = Y + 1.770U'
( b- i5 ?' Y' n5 D9 z% ZBYTE *orgRGBbuff = RGBbuff;& G+ S7 i. N6 N4 h
for(DWORD count=0;count<dwSize;count+=4); H) N9 K& \# V
{
' j  Y4 h# n/ O2 @//Y0 U0 Y1 V0
( X5 `( W  H7 g0 @# tfloat Y0 = *YUY2buff;4 \3 G( {' y" t9 ~# N
float U = *(++YUY2buff);
0 i- L5 N2 F4 I- {/ C8 v% d% c0 Vfloat Y1 = *(++YUY2buff);0 X) v1 Q; m9 R- n
float V = *(++YUY2buff);* o8 R& B/ N5 j
++YUY2buff;! n( [  E/ E# w& n7 h0 Z
float R,G,B;$ |; ?( z: ^( x. u

( ?2 V6 m7 F; K3 Q: j9 n" y1 yR = (Y0 + 1.14f*V);
2 x. b  `' H1 W4 lG=(Y0 - 0.39f*U-0.58f*V);   / X$ P- e; D! F" P* a$ |
B=(Y0 +2.03f*U); ) r; h. P# d& X; a, T( [
if(R<0) R =0;
5 e, h. R* s6 i; gif(R>255) R=255;* U9 z& D/ l/ Z. z. Q# K5 A
if(G<0) G =0;! x+ p, z7 [, m( [
if(G>255) G=255;% I/ P* U% k3 r  l% S
if(B<0) B =0;
; B. l, ~' A: A  Uif(B>255) B=255;1 {; K7 G" B& \' F1 O
*(RGBbuff) =     (BYTE)B;         
6 U/ B" g4 Q+ p0 o# j6 C*(++RGBbuff) = (BYTE)G;
1 F$ j! n7 \) Q% }- ~. ]  h*(++RGBbuff) = (BYTE)R;
1 E; I8 y3 V) JR = (Y1 + 1.14f*V);
! d" m" J6 ]; n- F; Y( tG=(Y1 - 0.39f*U-0.58f*V);   , \( [( n7 d: Y( V3 z& c
B=(Y1 +2.03f*U)   ; % c6 S5 n; g6 x% W  M+ X/ y) U: U
if(R<0) R =0;8 h; N$ S* X$ l2 G
if(R>255) R=255;( H- u- \9 P9 x5 }$ G' |
if(G<0) G =0;8 M, p7 o7 d0 q& X3 m. Q# \4 r
if(G>255) G=255;
# b; Q; S5 q) s! ]/ \if(B<0) B =0;$ {0 i) R0 z- D+ E
if(B>255) B=255;, J. f- x3 B- G: s2 p% c
*(++RGBbuff) =     (BYTE)B;         
* u! S* w' T& c1 R, f9 B# R4 y  c5 a*(++RGBbuff) = (BYTE)G;' R1 {: E6 y9 N0 V  T1 T# a- e
*(++RGBbuff) = (BYTE)R;3 A' G$ e$ @9 |) n7 `9 g
++RGBbuff;1 `( q' W. A$ v+ e% N+ j
}& X: {; R2 c. @( R/ g
}
$ _  P; s3 u& v3 w3 o& S' t* }inline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
0 E* j8 v% U9 u1 ?/ G: z{& N- Y2 U3 @) ]% D6 C  P, t1 ?

( u3 F2 {) U& [// R = Y + 1.403V'$ y0 N2 @0 s6 K; D! M% e
//G = Y - 0.344U' - 0.714V'# K  p& w# R# F
//B = Y + 1.770U'% D) Y& k7 N' b+ \" K1 U
BYTE *orgRGBbuff = RGBbuff;
' K" X5 ^7 p* R% e- _& Gfor(DWORD count=0;count<dwSize;count+=4)% n  V2 O! F% S8 r7 T+ d
{, Y# H3 l5 n% |& R1 o
//Y0 U0 Y1 V0. [4 [" Y( O! e5 i8 y
float Y0 = *YUY2buff;
# G' u5 G5 \( Z2 ?4 d+ ]- Zfloat U = *(++YUY2buff);) T1 P! I- ]& {- W' N4 K* z+ x/ ?
float Y1 = *(++YUY2buff);
* h3 P' T5 u# F7 I# Cfloat V = *(++YUY2buff);
! h" s, N. J5 m/ w! E+ `8 @3 J( c++YUY2buff;
; z7 E" H& j7 o! d/ `float R,G,B;% p. m, P- v9 X1 y2 o* z. g( I- ^
; {( \4 z$ Y3 W# F+ [: Z/ K
R = (Y0 + 1.403f*V);
+ U/ d& K5 Y1 p9 EG=(Y0 - 0.344f*U-0.714f*V);   4 c) G8 Y: i+ J4 B( x$ d% _9 E
B=(Y0 +1.77f*U);
& v, K$ A3 [* c/ [( q2 ?5 W' Fif(R<0) R =0;
5 Q. O8 ?8 D. G% `if(R>255) R=255;
" @% w; J5 e1 \4 j+ ~5 ^3 j+ Dif(G<0) G =0;# x  U, v, u' y+ n4 o
if(G>255) G=255;
8 ?2 y+ y, u1 x; _9 Bif(B<0) B =0;' u4 T& ]7 l7 @# }
if(B>255) B=255;5 F0 o( ^8 m, R$ P3 g: G" u- s
*(RGBbuff) =     (BYTE)R;         
/ }7 W  y. z. d1 f- p0 F/ o*(++RGBbuff) = (BYTE)G;
' ?% z: Z( C, U' h*(++RGBbuff) = (BYTE)B;
* q- o+ Z- ^' J( L+ Y; M" u8 k6 L: qR = (Y1 + 1.403f*V); : c( \4 S/ u' {4 S9 \. y4 _# w
G=(Y1 - 0.344f*U-0.714f*V);   
. s$ g/ C6 |- UB=(Y1 +1.77f*U);
+ ~3 T( p$ R" C7 G: _) W6 H5 rif(R<0) R =0;
, V7 n. g# F- f/ A: Wif(R>255) R=255;' v9 Y$ Z0 z2 i  }7 e7 H
if(G<0) G =0;
4 o; Z2 D& c5 T8 Y  iif(G>255) G=255;
& x1 s2 o' I: Y" w: ^6 s: `if(B<0) B =0;0 a: t7 B0 Y; f; H# L, e$ O
if(B>255) B=255;
9 [: F& i6 h) r" G, F5 e*(++RGBbuff) =     (BYTE)R;         
: l2 ^3 h( Z9 b1 h' C6 u*(++RGBbuff) = (BYTE)G;9 i) N5 ?* r0 p
*(++RGBbuff) = (BYTE)B;
  x! H) f, b' ?) Y6 X++RGBbuff;
  u1 t& }7 \- y2 l' i- f: p. U}
7 U! T3 T: c0 y9 R( _% h7 P}+ e5 }1 j) z, A7 w/ ^2 o& v
inline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)7 {, }" C2 [  C6 a% ?2 L
{+ j/ K. u% X+ s. ^$ b& o
//B = 1.164(Y - 16)         + 2.018(U - 128)
, `+ Q  U. O$ s/ h//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
* E5 Z9 \/ g" f7 s& X//R = 1.164(Y - 16) + 1.596(V - 128)( ?1 g9 [: A* q2 [2 d/ x
BYTE *orgRGBbuff = RGBbuff;
# M+ _* X6 |  yfor(DWORD count=0;count<dwSize;count+=4): L6 i: E! D: x/ B+ }, `0 m
{
( j' R6 u: d+ F  f//Y0 U0 Y1 V0& M5 n+ Q1 S1 K/ s( H9 a+ }& i0 \
float Y0 = *YUY2buff;
% W9 d6 }; t/ O9 X  j2 I* h6 xfloat U = *(++YUY2buff);* Y7 W! c5 a& n
float Y1 = *(++YUY2buff);
( ?- a0 a7 v3 Ofloat V = *(++YUY2buff);
8 N; w: \  W0 D  n++YUY2buff;( o8 Z. z  Z+ |# X) h, U3 B
*(RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           
4 I# N0 k' S9 L" t*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   5 t( K# }# c; X# X5 L8 ?! `1 a
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));        
9 G4 X- S+ d3 ^( z0 ~: ~" i*(++RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           2 d4 u, I' h2 H9 I
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   
. S( z5 w3 X& a# T8 U5 U# Z  ~*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));          3 Z3 r+ a$ K  o+ }8 c+ O/ z" ]% {
++RGBbuff;
' j+ ]/ e0 G+ @, v6 U5 m" P% ^: ?2 c. R( s
}- Q, p, [) B; g2 W# \
}; D2 k  y2 ~2 x4 w4 a
// http://msdn2.microsoft.com/en-us/library/ms893078.aspx* `+ a% S/ d3 A' F: g/ P  x0 I
void VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)# D5 S0 C& g/ K6 }7 K- m
{' f7 c' Y4 H! y# G! O- n& K
//7 J7 E; s8 O3 |2 Z+ f5 x
//C = Y - 16$ Q) _: @( E, o, M' l& i/ @8 b
//D = U - 128
$ |' r) B( Z- y# D, q//E = V - 128  z, e2 o# G1 E" A* J# x" c- S
//R = clip(( 298 * C           + 409 * E + 128) >> 8)- k% m4 o9 m% x, c& }; A% x/ L% ]8 O
//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8). S) h, Y" ?. g& \
//B = clip(( 298 * C + 516 * D           + 128) >> 8)
& ]! N' Q: ~  k) F0 KBYTE *orgRGBbuff = RGBbuff;
4 i( N# F3 E, f  ?: X# Vfor(DWORD count=0;count<dwSize;count+=4). y2 T0 L+ @6 T$ t
{
( Q# Z2 \8 y& d6 u4 q//Y0 U0 Y1 V0
- p* C5 ~$ y, ~/ N7 M1 e# ^, QBYTE Y0 = *YUY2buff;4 O# E2 s) ^+ D* [  g
BYTE U = *(++YUY2buff);
# y# |0 B  ^/ y. h; SBYTE Y1 = *(++YUY2buff);( N( D% m8 }/ R" |8 G7 k2 V
BYTE V = *(++YUY2buff);" j; Z4 ]  M* |" w, h
++YUY2buff;
" O; T: V& P' u/ ~% \* e+ Q* k8 ~LONG Y,C,D,E;! V% y3 f8 G' `5 J, H4 v8 `! T
BYTE R,G,B;: }! A. `1 H  ?( {, |

& o( n2 k2 [; X; C* _; PY = Y0;4 r! W- ^+ g; o5 v5 G$ L
C = Y-16;
: n! |( x  O7 ?; aD = U-128;, m4 ]2 W1 j& c
E = V-128;/ R5 E2 R& X$ G3 l9 ]/ \( F
R = clip255(( 298 * C           + 409 * E + 128) >> 8);' F5 m8 L; o- T2 w# n
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);9 w3 K9 K7 s! n6 g
B = clip255(( 298 * C + 516 * D           + 128) >> 8);" G. _' u, I" n$ G/ N! b5 ]$ F
*(RGBbuff) =   B;           # ?; G+ v+ ?: u, A3 I% d2 V: b" V
*(++RGBbuff) = G;   : E, r0 Q* I, b; q
*(++RGBbuff) = R;        
( k% i! a/ v" {/ \7 y; a! s" [Y = Y1;
8 Z, N' _2 j9 ~2 |, T- N4 tC = Y-16;
4 q# w! E, N5 P3 x( U* WD = U-128;% d- M8 t3 O- q8 V* L% o2 h
E = V-128;
: q& D' v. @. g: B: V! hR = clip255(( 298 * C           + 409 * E + 128) >> 8);: N$ M$ b8 y7 C" S$ a' q! s/ [
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
0 d* \( b2 J8 @B = clip255(( 298 * C + 516 * D           + 128) >> 8);
$ f3 V5 |5 ]# g. u+ A+ j*(++RGBbuff) =   B;           6 P" E4 m4 h& K4 v( ^
*(++RGBbuff) = G;   
. p5 C8 m; j' L# B/ f/ H*(++RGBbuff) = R;         
; q  u: s, B  y5 L( T++RGBbuff;  k8 W: ~0 _- X' S: S( H$ n! l2 ^
4 P, ]* K0 n- O' T5 u# u( t; z9 K
}
4 S8 X+ R! v5 s}4 X8 g! ^0 `9 r. g% g; l
BYTE VC4000Graber::clip255(LONG v)
8 S. a% ?3 m7 v' s8 }- ]7 m{6 N# n2 M  S* m; Z4 M/ C
if(v<0) v=0;
) H& d6 }$ C! ~3 _  g' u* W) delse if(v>255) v=255;
, s% h' G& U) T: {- w$ H. }3 B; U2 r. Greturn (BYTE)v;
( J% ?- z3 @* M; _7 t}
  d6 B# P- h% Y; L' v, d2 \" _
' B& u1 h3 \6 @5 U& b8 D3 ]7 {. W本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hardVB/archive/2007/10/18/1831810.aspx0 U2 u# ~% c/ x& U

8 Y% d! w/ S+ F4 H* M$ R
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-14 16:27 , Processed in 0.018596 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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