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

YUV像素和RGB之间的转换

[复制链接]
发表于 2011-5-30 09:56:44 | 显示全部楼层 |阅读模式
RGB转成YUV(RGB to YUV Conversion)# ^9 n, ~- T* x# E5 F7 E
Y  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 162 ~8 `6 y0 ^) N$ P, p
Cr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
# }; Y7 T- r2 `: r# N- lCb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128YUV转成RGB(YUV to RGB Conversion)5 U# r1 T* A9 z
B = 1.164(Y - 16)                   + 2.018(U - 128)
+ Y* m0 h) [' c" _+ e6 @* s! OG = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)* D. p, p# ~7 [7 |. P
R = 1.164(Y - 16) + 1.596(V - 128), T2 |; `( d' }) C
R, G, B, Y , Cr, Cb的取值范围都是[0,255].
( S- j' |" N3 Q' o3 p0 A: A3 ~( a" p7 w: y) r7 R3 t( Z/ v/ ]4 L  o
原文:http://www.rosoo.net/a/200604/6049.html/ F& d& H: G" R3 C
 楼主| 发表于 2011-5-30 17:08:39 | 显示全部楼层

YUY2视频转化RGB格式

//YUY2视频转化RGB格式 by hardy 2007-10-17
; O8 H6 ?- u6 Z, q$ a: N//http://www.fourcc.org/fccyvrgb.php
" |% h7 H) A' ^$ B  ^1 Finline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)3 M( u$ z" L& b
{  T8 R: _9 K5 d$ Z1 B7 D8 p
//B = 1.164(Y - 16)         + 2.018(U - 128)! r# t. X( b4 d8 C- q5 X) o
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)+ O$ f7 r% q) B8 {
//R = 1.164(Y - 16) + 1.596(V - 128)
! }# u  d+ o7 c; n0 {! X  fBYTE *orgRGBbuff = RGBbuff;4 b6 h2 @( i+ ~1 D4 m/ N
for(DWORD count=0;count<dwSize;count+=4)
" ~. L) }8 _! ]( e$ ~1 j{
! y8 w/ n( u/ w1 g; x. t//Y0 U0 Y1 V00 L4 G" b: L: I1 E( M3 q
float Y0 = *YUY2buff;; e$ m" O3 \! m9 X0 R
float U = *(++YUY2buff);% h: y3 Z! k0 |( V+ _
float Y1 = *(++YUY2buff);8 w+ g7 f" v7 a7 P, W% Z! l
float V = *(++YUY2buff);
0 K" f) T. X: u# Y% r, I* B++YUY2buff;9 V1 B: B5 [0 L
*(RGBbuff) =   (BYTE)(Y0 + (1.370705 * (V-128)));           + V% y/ m. q- Y
*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   * P: m3 B, G$ v
*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));        
- q( g0 ]/ u# i- u$ m*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));           " A" k3 `4 p: X6 U$ i
*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   $ m0 _( F0 I" w8 V8 W
*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));         % q$ x9 G, y! }# X
++RGBbuff;
" E2 q. Q* l& b1 j6 X; n1 R" o}
9 z( H" d0 {9 E+ L}/ h$ v" g+ W  I" i9 {
inline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
+ n" `. q1 f. A{
& S# f7 K3 u8 S, s' K* ~//R = Y + 1.14V
- Q7 ?. D4 K; m; @, j8 b3 W//G = Y - 0.39U - 0.58V
8 u' B3 [* U- G* N( i//B = Y + 2.03U
  t% R. t3 g2 L+ b7 K! F. T1 v8 j// R = Y + 1.403V'
* l0 P3 g/ l; _8 i6 D0 {" v: r. a' X//G = Y - 0.344U' - 0.714V'
( q3 m7 f* u4 _8 ~+ N//B = Y + 1.770U'8 z. V0 J4 t& E; B
BYTE *orgRGBbuff = RGBbuff;) T) h7 e8 f* f" \- w
for(DWORD count=0;count<dwSize;count+=4)5 e! q4 L5 |: R8 q0 c$ X  t: y
{; A  ]% H& G7 {+ E! v7 P# N3 G
//Y0 U0 Y1 V0: V. ]. @, C' B
float Y0 = *YUY2buff;2 F0 ^! ?8 }* p4 e, w
float U = *(++YUY2buff);
4 o7 U/ B* F) Ffloat Y1 = *(++YUY2buff);$ Y9 c2 @  p* _6 D  [. c, y
float V = *(++YUY2buff);
/ _8 V: z% G5 a++YUY2buff;- u3 P! s  e0 ~" s! q
float R,G,B;3 n4 B1 {) x) P
* ^, `/ A: |! f9 I8 S" K: G: W
R = (Y0 + 1.14f*V); 8 |) t* e3 m; @" ?) d; y- C; Z
G=(Y0 - 0.39f*U-0.58f*V);   
% S6 J# B. [- ~" Z$ W6 RB=(Y0 +2.03f*U);
/ p9 p" i/ P8 Y. q5 f$ _1 L3 g8 K4 \if(R<0) R =0;9 o* [) E$ a# ]8 m- U8 k
if(R>255) R=255;  x+ E* b; t2 W8 v( M* B  D* Q3 t  X& O! ^
if(G<0) G =0;, D4 [2 p: S* i7 x+ o6 c
if(G>255) G=255;
- T, L8 ~5 Z( R4 Wif(B<0) B =0;
* S5 f. f$ t& z$ f( b- bif(B>255) B=255;$ p& u, H' `6 |+ p' v1 C
*(RGBbuff) =     (BYTE)B;         
8 ^6 f( u1 T3 A7 o*(++RGBbuff) = (BYTE)G;
& @" R4 ]/ w. ]! e7 v" E  ?9 M1 l0 j*(++RGBbuff) = (BYTE)R;! c. q9 p  G0 [# U5 Y" n+ ]' ~( m/ B. S
R = (Y1 + 1.14f*V);
: J3 F9 j' T! l% {8 xG=(Y1 - 0.39f*U-0.58f*V);   
7 C% [& |- }, U* f* x; M# hB=(Y1 +2.03f*U)   ;
; ?2 a# N5 s- C. r. e( @# uif(R<0) R =0;& u" C; S4 ?+ g/ M4 R6 {6 ?5 p
if(R>255) R=255;! }, }+ w* `- W; Y* W" e4 f. B
if(G<0) G =0;
' I9 z7 F6 E* T7 C! ]  I7 _if(G>255) G=255;
5 b5 H3 Z' w3 Q1 l' yif(B<0) B =0;/ |% F9 |2 y7 {+ ?
if(B>255) B=255;
# G) Z/ Q8 t+ w9 m6 \; j*(++RGBbuff) =     (BYTE)B;          8 Y  W4 W$ u& V0 x, w$ z7 i2 O$ E
*(++RGBbuff) = (BYTE)G;6 C+ ?/ r6 e8 b
*(++RGBbuff) = (BYTE)R;+ d: q3 p/ }# `- ^! J" k
++RGBbuff;
! l; |- q6 O  G) v}
1 w' b! v9 @2 f) a/ B}$ ^4 ]5 {* H' t
inline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)5 P8 h2 i4 P: x! Q; ?
{6 B- d: d: O8 C* V% l2 [
3 g0 T+ T8 R! ~! S
// R = Y + 1.403V'2 j2 ?( k9 A$ j' R
//G = Y - 0.344U' - 0.714V'
3 O, O& N# y" Z6 U; J//B = Y + 1.770U'1 M. J- |1 k4 ~+ l+ h8 T
BYTE *orgRGBbuff = RGBbuff;+ F0 b0 x2 J9 j4 N5 h
for(DWORD count=0;count<dwSize;count+=4)$ t) n5 j- F5 J( `+ A
{7 a( t( O: D4 E2 f
//Y0 U0 Y1 V0
& d9 C: Q0 v1 z' Xfloat Y0 = *YUY2buff;9 ]. b6 E4 C! b( ]3 B# E; h9 W& P& x2 k
float U = *(++YUY2buff);
) Z! ?4 x8 a8 e+ d9 a' Bfloat Y1 = *(++YUY2buff);
) U+ k+ R4 s. P( ufloat V = *(++YUY2buff);
2 g5 w+ y/ O- N& @++YUY2buff;
+ B& R9 L) `( _6 T+ L3 _float R,G,B;
# M# U' b' j' I! h7 f) P4 c
. d' d1 }1 m0 G, sR = (Y0 + 1.403f*V); 6 |+ c: x+ u; n
G=(Y0 - 0.344f*U-0.714f*V);   3 G5 y2 h$ r! c, ^5 F3 s/ D  W' E
B=(Y0 +1.77f*U);
/ H: C9 I4 b+ \5 l# Q6 F: v3 Vif(R<0) R =0;
( b3 k) S! a, `5 W! x) y6 ^" r; eif(R>255) R=255;+ c* u1 U3 I6 p" d1 R
if(G<0) G =0;' A* W& ~- C& v: P
if(G>255) G=255;: {3 S9 m, p% c/ K
if(B<0) B =0;) ~; r+ }! @5 v
if(B>255) B=255;
$ N8 w# r  z3 {2 W*(RGBbuff) =     (BYTE)R;          ; W  D$ D4 u" G6 ^
*(++RGBbuff) = (BYTE)G;6 P7 v. A( f$ s7 a9 J) l
*(++RGBbuff) = (BYTE)B;
* o& Z9 _, u* v) D0 TR = (Y1 + 1.403f*V); & y2 C' q2 D9 k1 ~* t
G=(Y1 - 0.344f*U-0.714f*V);   ; i' ^$ c  I- \- \  g& ^% Z
B=(Y1 +1.77f*U); 2 p7 p. v/ `, k. I! N
if(R<0) R =0;
% f% M" H' B- N: h& Kif(R>255) R=255;
! L) k: l- T8 R8 X/ h: Rif(G<0) G =0;
1 G, `/ \! P5 m: C% S. S- [if(G>255) G=255;9 V9 _+ C% A' K: R
if(B<0) B =0;
7 k5 p' A* K7 g6 k  ]7 Wif(B>255) B=255;
  D+ W7 x1 L* I, O3 ]*(++RGBbuff) =     (BYTE)R;          * G' _- Q, d  q
*(++RGBbuff) = (BYTE)G;
% l& [# c" x5 h$ F*(++RGBbuff) = (BYTE)B;
6 N8 [2 I" f/ Y++RGBbuff;2 B# ~* z" O- L+ O- ^! y! i% `/ J
}" j6 \! C' w  [1 G8 f: ?1 g8 D
}2 s2 s1 ^' h; a- C& J
inline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
3 q# |& O3 m. x3 j{
# t. b- D2 a8 a; v2 _, d' L$ B) V3 G//B = 1.164(Y - 16)         + 2.018(U - 128)6 N% Y6 j' D, o- G1 g( v1 U0 p9 @
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
- ^; y- y1 u* W0 N" \) a//R = 1.164(Y - 16) + 1.596(V - 128)/ s$ W3 }7 U- J
BYTE *orgRGBbuff = RGBbuff;
2 ?, b2 \- L8 T$ @for(DWORD count=0;count<dwSize;count+=4)" Q2 o* i; @% F  h' f
{
* q# ]- M4 }1 s1 C//Y0 U0 Y1 V0
* Q  ~2 l8 u$ Bfloat Y0 = *YUY2buff;3 P) J% {# R1 n2 R6 m5 q
float U = *(++YUY2buff);7 F$ J& `; Z. t: g9 u
float Y1 = *(++YUY2buff);
- L2 u# Q2 x4 _+ Yfloat V = *(++YUY2buff);: q% `* g6 p# ~+ f
++YUY2buff;1 l0 b4 V" n+ X+ h$ O; v7 E% X
*(RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           9 d+ Q0 c2 {* j. }- o5 W" l( L
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   * K1 A, j# R, `$ A
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));        , Z5 {4 @8 z* b5 t3 \" q5 V
*(++RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           3 l. L5 k; u! T( P
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   + P, @9 s: W. m3 ?% N" _5 Y. @/ X
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));          + Y  s, A5 f3 V9 e
++RGBbuff;" z. @* y( q- @$ Z  y$ @* F) `' w

/ J( D: a' J7 W) r) B9 D, _}
( D- t2 r5 s) w( L2 l3 [}. S$ p1 [  ]& P* Q# l  ^1 A2 b
// http://msdn2.microsoft.com/en-us/library/ms893078.aspx9 h' e7 A) W: I$ j. B/ T; O
void VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)% V3 h6 ]0 j, K3 Q
{
% U! ]  k5 k' h3 s+ o9 H//
$ B: k- C: P8 K% U4 H" t//C = Y - 16
) b! `% @, P! P/ l* o//D = U - 1289 A0 q) h* ~9 J) V, W" Q- i
//E = V - 128# P# ]% A3 H- h
//R = clip(( 298 * C           + 409 * E + 128) >> 8)
% S0 h: Z4 s( Y1 U, ^//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)8 J/ r- Z8 N& C# w
//B = clip(( 298 * C + 516 * D           + 128) >> 8)8 a0 W, L  j4 u/ e" E  n! ?
BYTE *orgRGBbuff = RGBbuff;' E4 s0 W3 h, I! Q* g9 n/ }" _
for(DWORD count=0;count<dwSize;count+=4). i9 P7 K/ R" ?+ e4 {* g9 @6 r
{6 m8 N- \  s) l7 S
//Y0 U0 Y1 V0
' K- _$ u5 |* D- G, ABYTE Y0 = *YUY2buff;
, U" e; }4 j' W; `/ I2 \5 MBYTE U = *(++YUY2buff);4 ]% q8 {7 v8 C& t
BYTE Y1 = *(++YUY2buff);* Z8 J7 D, i& E0 B  |* M
BYTE V = *(++YUY2buff);
1 G( l* @  ]- V8 Q/ O++YUY2buff;/ a) ~& S1 z. e/ h! d$ M
LONG Y,C,D,E;
4 s8 \) J, v' l  U  q: aBYTE R,G,B;
# k, r5 K3 j$ T% L3 t9 n2 R6 n+ l
6 ?5 B7 y& l1 oY = Y0;  [. V2 w5 S, ~
C = Y-16;
3 N6 {3 F6 G8 |3 c' C  eD = U-128;' Z# q! `) n, l2 H# q
E = V-128;
- }' X) k: ]0 ?9 m, r, B" X$ v8 AR = clip255(( 298 * C           + 409 * E + 128) >> 8);
$ K, `9 |. C( }3 HG = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);0 e0 ?, b7 j- f; k& r' e' L
B = clip255(( 298 * C + 516 * D           + 128) >> 8);7 d% d4 O* r% c9 D: A3 h
*(RGBbuff) =   B;           / d; M2 m; P: Q% M0 V; X2 S
*(++RGBbuff) = G;   ! P" k: f" M7 F0 L* K
*(++RGBbuff) = R;        ' W7 Z* b) _) ~. k1 W
Y = Y1;2 L& P& }6 P" r1 m
C = Y-16;7 D, i! |# P6 O1 ]0 X  w+ O$ Q
D = U-128;7 C6 O6 `3 I8 i( }3 E; l
E = V-128;
1 ~1 S9 ~& J, N$ U% K$ V3 nR = clip255(( 298 * C           + 409 * E + 128) >> 8);
. H$ W1 i: F, v& ^! B+ M0 R( z; I; O7 t6 f; uG = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);0 a/ s; b6 @" d  i; Q$ {+ `0 ~# p
B = clip255(( 298 * C + 516 * D           + 128) >> 8);% H5 E- N7 r7 Q4 |# }
*(++RGBbuff) =   B;           
. @; f  m0 W+ q& N6 G* k) X3 E7 E4 P*(++RGBbuff) = G;   
$ q1 ?" _5 s; z. i1 M% ^*(++RGBbuff) = R;         % i- D! v" Y0 T6 O/ i
++RGBbuff;4 X1 s; m9 g$ B
3 r; Y1 h3 @( C4 @
}8 c8 @/ ]& D& F
}% h, d1 f1 f; m) f# k
BYTE VC4000Graber::clip255(LONG v)2 t( ~; |3 d/ \1 i0 i( Y/ Y: d
{4 A6 ?/ P% v6 F% N" \$ `  x  C
if(v<0) v=0;9 Q/ D# G5 S" D2 s' j
else if(v>255) v=255;
7 w, j7 `! ?" b5 `$ o2 jreturn (BYTE)v;1 H  m5 g* @0 j! Z7 f" ^* H" I
}4 ^) V, f% b) k" A

0 u% u* v- _: A本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hardVB/archive/2007/10/18/1831810.aspx
) H5 B. z; _  r, d+ s8 A$ y( N& f/ h% `
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-18 04:46 , Processed in 0.019186 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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