找回密码
 注册
查看: 4652|回复: 1

YUV像素和RGB之间的转换

[复制链接]
发表于 2011-5-30 09:56:44 | 显示全部楼层 |阅读模式
RGB转成YUV(RGB to YUV Conversion)
6 F0 y! E! B7 o2 a+ t2 r; \0 ~7 wY  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16- Z! X; F  H6 a; ?) x
Cr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128% ~7 Q) o- p1 W) b) p  ]' o  ^
Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128YUV转成RGB(YUV to RGB Conversion)
* p  v4 y2 o, M% u% t" eB = 1.164(Y - 16)                   + 2.018(U - 128)) M+ V7 v# K8 B& S6 i* b
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)+ o: Q( q2 H* x' C
R = 1.164(Y - 16) + 1.596(V - 128)
" B& {# o3 P; M  B* ^R, G, B, Y , Cr, Cb的取值范围都是[0,255].
3 K  z' z2 b; Y
0 j4 L! B) g& P原文:http://www.rosoo.net/a/200604/6049.html
9 H, e( v+ ?: ~/ i
 楼主| 发表于 2011-5-30 17:08:39 | 显示全部楼层

YUY2视频转化RGB格式

//YUY2视频转化RGB格式 by hardy 2007-10-17; G3 M6 \) u1 F, k0 a5 q$ c
//http://www.fourcc.org/fccyvrgb.php9 Z" I7 C" w/ B1 X  g$ O
inline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)$ t! u# j/ ^9 I6 u
{
* }+ M, T0 ]) j8 R5 |//B = 1.164(Y - 16)         + 2.018(U - 128)
+ d2 F) L4 r  A//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
$ I6 i8 E7 d2 M. H! ~: {//R = 1.164(Y - 16) + 1.596(V - 128)/ t* a9 K- Z8 g' A5 ?2 Q1 \
BYTE *orgRGBbuff = RGBbuff;
- E- z- }- Z$ V9 {" W8 E: Xfor(DWORD count=0;count<dwSize;count+=4)
" H$ `% e: d. S3 u6 Y{' i) ~* c! G* v8 M4 S: L- W% I
//Y0 U0 Y1 V0
7 `: y7 d( t6 j2 m6 o$ j5 d6 afloat Y0 = *YUY2buff;
% R& {0 R* D7 u3 ?/ ?( v% Y- d' l( Tfloat U = *(++YUY2buff);3 a& J* B2 d- u9 ]# F
float Y1 = *(++YUY2buff);
, i) o4 _9 i7 I1 m+ F2 m& [float V = *(++YUY2buff);% z6 N* A) x1 |& y# ]% d0 g" a* I
++YUY2buff;" K' s! Z9 P: B0 d5 r1 x" i
*(RGBbuff) =   (BYTE)(Y0 + (1.370705 * (V-128)));           ! Z) P( Q$ q; L+ ]" r
*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   . c9 N& i, _% o4 M+ l+ [" b
*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));        / D7 z+ r) w! [% [) ~: {; X  E
*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));           
; a% p. ^; e9 b1 U" I*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
) @0 ?  e$ T( g" k  C*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));         6 n) P) O! A; f& W7 T  l
++RGBbuff;
% Z0 {- |- E, N: X}8 z  ~& v- [$ z& |
}# w7 z9 h3 N/ z/ q
inline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
- u/ R- `! ~. q6 S( d{
# K2 v; z6 P; T. S: X2 |  @//R = Y + 1.14V, Z, X" g+ R; q+ W8 l) b: c+ a- J
//G = Y - 0.39U - 0.58V
& p+ {% r# }/ m4 W' E//B = Y + 2.03U+ ]$ W2 w% b7 i- ~" y
// R = Y + 1.403V'
7 G" S. p; ?7 m& Y//G = Y - 0.344U' - 0.714V'2 E4 S, u) S9 x" G
//B = Y + 1.770U'
& t! {2 B, c& {, A& M/ EBYTE *orgRGBbuff = RGBbuff;" x5 E) D& t% B  a
for(DWORD count=0;count<dwSize;count+=4)
5 U; _) W3 f/ G5 R. m4 o{
3 L/ P* Q3 B" F8 Y//Y0 U0 Y1 V0
1 ~  B) m! b# J. cfloat Y0 = *YUY2buff;1 ]. T. _& B2 _, v
float U = *(++YUY2buff);
. N: t9 \/ @8 M& |+ mfloat Y1 = *(++YUY2buff);4 U. }+ |2 j9 p. ~
float V = *(++YUY2buff);5 I- V& g2 u4 T$ X
++YUY2buff;4 }# Q, R$ R" {% p
float R,G,B;
2 j: k) U2 B( x( W$ L; J; m# N$ O
* g4 M0 d: d7 G; N0 qR = (Y0 + 1.14f*V); 8 D# \, z" w$ n6 u# {9 L
G=(Y0 - 0.39f*U-0.58f*V);   / m, O, Y( l( L0 I% Y$ [
B=(Y0 +2.03f*U); . y2 w1 a& A0 [! O! M6 z4 B4 I. B
if(R<0) R =0;# V+ k2 ?8 T8 B  r' _
if(R>255) R=255;- s/ M" x0 k* u. d3 ^* X
if(G<0) G =0;* d% d% [" k  e3 Y
if(G>255) G=255;
6 A9 o8 h  d+ n! V" _; C, a* _# C, _if(B<0) B =0;0 l, O" B6 W! O# |. B: D) K
if(B>255) B=255;
8 M4 f% X6 p& u6 i, |9 e*(RGBbuff) =     (BYTE)B;          4 i7 B; T" l+ _. k
*(++RGBbuff) = (BYTE)G;4 K1 }: }/ Q3 ?' z2 @
*(++RGBbuff) = (BYTE)R;5 v. B6 y+ z6 A8 m- g* u" O
R = (Y1 + 1.14f*V); 8 U% b' \5 ^; ^* T
G=(Y1 - 0.39f*U-0.58f*V);   9 t( b2 d, u8 r5 b6 @) X
B=(Y1 +2.03f*U)   ;
5 x/ |& }' H' n7 e3 \4 T  `if(R<0) R =0;
- E0 j) L' M% i$ g- ^if(R>255) R=255;- }2 S# b7 w+ y0 Z8 [
if(G<0) G =0;
" F. {7 j/ F4 n' T; `7 n1 W6 aif(G>255) G=255;
1 p" O  |  r8 }" K7 V' G; Bif(B<0) B =0;- Q' i* y2 A. l* [; f! O  V1 b
if(B>255) B=255;1 h, \7 k/ E3 Q1 T; ^5 p2 Z/ j
*(++RGBbuff) =     (BYTE)B;          2 }* ]( x3 i' Z) M/ m
*(++RGBbuff) = (BYTE)G;: x# k5 @. ~! ]: L. A3 Y/ p
*(++RGBbuff) = (BYTE)R;4 t3 J  I( y. }) A8 d
++RGBbuff;, {0 V. p4 j; }* l4 d2 j! c5 W
}
1 \  q6 u, x6 l, w1 W, m4 X}/ T5 \, o% x5 E
inline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
$ [, ?8 ?& k1 Q+ ~! w{
. [- e+ Z5 z- n- V$ f- ]4 z' L" C6 u& d
// R = Y + 1.403V'
* O& [, E( ]& c+ C6 W( K//G = Y - 0.344U' - 0.714V'" G1 t( _& n7 @0 G/ d' R) X
//B = Y + 1.770U'
& t7 T# n3 i4 GBYTE *orgRGBbuff = RGBbuff;* l$ \3 ~( }; x3 F0 Z. i
for(DWORD count=0;count<dwSize;count+=4)% J) l8 u* @1 L
{
1 o( M* s, B/ ^1 k0 T//Y0 U0 Y1 V0
$ w/ W. H( d0 |8 P6 \float Y0 = *YUY2buff;* g5 L3 @+ |5 E
float U = *(++YUY2buff);  C$ }$ K8 y" S3 K' ?! E6 n
float Y1 = *(++YUY2buff);
( R8 d* _6 N6 m( V: ifloat V = *(++YUY2buff);' y) U, \  u. \8 l4 q
++YUY2buff;
/ e  w7 b/ g7 s; V8 p/ d( jfloat R,G,B;' ^2 S/ x7 \) D, i2 u
! z9 N6 j- m8 e& P; X% L8 z/ W6 W" y) x
R = (Y0 + 1.403f*V); . e" ~4 g7 \. I# z  I
G=(Y0 - 0.344f*U-0.714f*V);   
. m! r' F0 \( p0 p# fB=(Y0 +1.77f*U); ) I4 L& ?; B$ m- Q  }: V/ m
if(R<0) R =0;
- w2 |8 ^) T: [; G/ @8 }if(R>255) R=255;+ |; K# T# @- m* ~# I0 q
if(G<0) G =0;
& E$ ?) |2 R9 Yif(G>255) G=255;
$ W& O9 j' k; G/ E, L' ~if(B<0) B =0;/ S( ?' v* g+ ~& z0 H
if(B>255) B=255;
! @5 l9 n# \" n. T) O3 C# h*(RGBbuff) =     (BYTE)R;         
# h, [( B% J4 X1 K/ `. @' Q*(++RGBbuff) = (BYTE)G;! H2 i$ n- q; [! H
*(++RGBbuff) = (BYTE)B;& ^* r/ X3 Q) F2 [: p, o4 ]5 o, i. `) h
R = (Y1 + 1.403f*V); : D; R; P9 c. v/ d
G=(Y1 - 0.344f*U-0.714f*V);   
+ J+ O0 |5 p( W: M% pB=(Y1 +1.77f*U);
) J" U0 G% d( W% p5 w$ R7 hif(R<0) R =0;  O2 q( j7 \) T# H" g" c2 t
if(R>255) R=255;
8 f5 R, a" B' A& C+ ~if(G<0) G =0;
" g! `9 D. x& v" O" T4 b, Sif(G>255) G=255;% {) s  c" a, q, i/ I0 [
if(B<0) B =0;
( T1 W5 I0 f1 f* T' y  m" N* N/ Sif(B>255) B=255;
* ~4 n! x% S7 g; \2 g, o+ T& f*(++RGBbuff) =     (BYTE)R;          ; W! T; l$ r8 Y$ N$ J! d2 j5 }
*(++RGBbuff) = (BYTE)G;( K1 _  Z- H# `) U% U( U
*(++RGBbuff) = (BYTE)B;8 |& s) T) N. b* |
++RGBbuff;* i0 [  [) M/ E( f) `+ V
}
1 F! ^  W2 B9 x1 t8 n+ |}
, S% |" k8 c* Y0 i* ]inline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)7 @  N* R3 e) t& i$ j
{0 D; \" H  ~. `
//B = 1.164(Y - 16)         + 2.018(U - 128): K; A1 Q; m& y  Y5 W
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
; V5 W8 o, l3 F: Z2 |# V//R = 1.164(Y - 16) + 1.596(V - 128)
  L$ Z* C$ n4 O% J* B/ j" d( wBYTE *orgRGBbuff = RGBbuff;, |. P# ?, \0 N- u& ^/ P  l
for(DWORD count=0;count<dwSize;count+=4)' s1 Z0 A: b1 u3 G: n
{
8 C) h5 l# j  G8 e$ q  Q4 j//Y0 U0 Y1 V0
+ G7 h: S6 [$ X: r$ gfloat Y0 = *YUY2buff;# x4 M+ n! |" O/ U4 A
float U = *(++YUY2buff);: K" j) l0 g; E) \
float Y1 = *(++YUY2buff);& K) [. e, ]! M  R
float V = *(++YUY2buff);
; [/ L$ |( @+ W3 c9 s$ ?) m++YUY2buff;
# q6 m8 ]- k) q8 C$ O*(RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           ) U* y: Y& n& D7 o# z
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   9 y; o7 q/ h9 N2 q
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));        
" b- q% \* F) g3 D$ a8 ^8 X*(++RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           8 D% ?" U) R- K. I" K% ?* I8 E( z
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   - j3 Q; O; L( B2 \
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));         
; G1 A" ?. F6 Y* L& a++RGBbuff;4 Z. y& `1 j3 M+ N2 \, v- U

# p0 R, q. n0 ~}
% t+ ?6 }- [  H1 G2 C}
, j+ _/ Y9 [& L" B" O// http://msdn2.microsoft.com/en-us/library/ms893078.aspx
  k1 G5 K5 C* N$ `void VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
" }0 d4 s& N1 V$ c{
! U; e% F* x+ ]: p' y+ ~//' t3 `0 z7 A9 v6 E4 v2 B
//C = Y - 16
# V# \" Q7 u3 ?//D = U - 128
" N- e( U, y" l1 H1 ~0 ~//E = V - 1283 w3 W$ l2 @! ~$ H) q; C, m
//R = clip(( 298 * C           + 409 * E + 128) >> 8)& O+ W+ s) V0 U/ r6 B# [
//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
- |& T$ T7 N$ i( r* T6 t//B = clip(( 298 * C + 516 * D           + 128) >> 8)9 F8 x% p$ M6 J1 c8 U
BYTE *orgRGBbuff = RGBbuff;& [+ p  C' a; `5 ?$ o2 \
for(DWORD count=0;count<dwSize;count+=4)% j3 y5 G5 n) I4 r5 @. @9 z
{7 L+ g/ E6 e* ?9 B* N
//Y0 U0 Y1 V0
0 e  E6 E& b2 T+ z: q1 iBYTE Y0 = *YUY2buff;
& M# ?# A/ Z2 |3 q* d- QBYTE U = *(++YUY2buff);) U8 v/ q+ U6 y  s  x5 Z: R
BYTE Y1 = *(++YUY2buff);; Y- t6 Y( e! U. t, E
BYTE V = *(++YUY2buff);& z: W: V7 j$ ?/ n
++YUY2buff;
4 j2 }! @2 Z4 tLONG Y,C,D,E;) c. {" d' p  o, W
BYTE R,G,B;
7 J  g7 R4 ?2 l5 v. u
" G4 i/ u; z! x& g) F) y( n9 bY = Y0;( t* A, H! I% w
C = Y-16;
! H8 D- M! c1 H/ J1 I1 xD = U-128;
/ E6 I! o! _! t2 u; V/ LE = V-128;% l( l  J) w- U
R = clip255(( 298 * C           + 409 * E + 128) >> 8);
1 c& [% o2 s6 ]' }% r$ hG = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
1 N2 u  a+ [2 t: e" ^; g7 OB = clip255(( 298 * C + 516 * D           + 128) >> 8);
; d. E1 N' _* H3 N0 m4 F*(RGBbuff) =   B;           
; g' t- n0 p3 {$ `" K+ B: E*(++RGBbuff) = G;   , N" `/ [" U' {8 x9 C0 I9 W
*(++RGBbuff) = R;        ; w/ E' E2 X1 p
Y = Y1;
& h! k5 S9 I4 @, j1 N5 EC = Y-16;" K# @6 D3 v0 H
D = U-128;/ Q# ?& ?) V% F& s) k9 q  K
E = V-128;! c9 C4 D( t8 D
R = clip255(( 298 * C           + 409 * E + 128) >> 8);
% M  h' _  l5 T& Z/ {# Z: TG = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);! \/ a2 z; o/ D% t* }6 M4 I. K
B = clip255(( 298 * C + 516 * D           + 128) >> 8);
! T, ^$ b6 O/ `* Z+ S" [*(++RGBbuff) =   B;           
: D# f2 h# W- Z3 \*(++RGBbuff) = G;   9 S) Q2 V) t7 l9 S9 h: }' E
*(++RGBbuff) = R;         
" s5 b# _) N6 k$ V( M6 x++RGBbuff;/ Y/ \  w( D1 Z2 t* k0 f
# ^3 `5 ]) y& A. @! V
}
9 T, Z, t  V- K: X' y}
* w3 {; N% y& T* r& U9 _& hBYTE VC4000Graber::clip255(LONG v)# P" o* p) n) c5 V/ P
{- w2 n* t. v( S
if(v<0) v=0;
& h0 _5 @" B: F) Eelse if(v>255) v=255;
7 o% P, M9 L7 nreturn (BYTE)v;
% Z3 k2 N, X$ \( v}. \; ~* q7 m1 c7 ?

$ R" u  O' ]# z+ y0 C% B% E$ a本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hardVB/archive/2007/10/18/1831810.aspx3 H0 w0 I+ |& C0 W( l
4 h) X  S! i" L# @
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-1 20:39 , Processed in 0.019275 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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