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

YUV像素和RGB之间的转换

[复制链接]
发表于 2011-5-30 09:56:44 | 显示全部楼层 |阅读模式
RGB转成YUV(RGB to YUV Conversion)
6 t! ]- {0 z+ k0 b; pY  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
1 @$ y4 k) g4 w  fCr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 1282 |: O. F! v9 X- a! l7 B$ z
Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128YUV转成RGB(YUV to RGB Conversion)- N2 [, S: i# b( w5 V; g1 }
B = 1.164(Y - 16)                   + 2.018(U - 128), F' l% H. u# i) r5 O2 a& j1 R
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128). s% s6 K& }" q
R = 1.164(Y - 16) + 1.596(V - 128)
: j! x  b. V+ B. r6 r- ]& J7 rR, G, B, Y , Cr, Cb的取值范围都是[0,255].
% @& |3 p! _  c3 a7 @
( F" d0 F! H0 [+ j8 f- m原文:http://www.rosoo.net/a/200604/6049.html; o5 V) g. b  Z# H. J
 楼主| 发表于 2011-5-30 17:08:39 | 显示全部楼层

YUY2视频转化RGB格式

//YUY2视频转化RGB格式 by hardy 2007-10-176 v6 r# Q0 z1 \% M- X8 c. v# y
//http://www.fourcc.org/fccyvrgb.php  B  o( {% ~* h# }( c5 a: V
inline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)+ L9 D5 q) _2 @0 r& M
{
/ V  c( I9 m- A6 w5 b9 [//B = 1.164(Y - 16)         + 2.018(U - 128)7 t2 j$ I& J5 `2 l  {& p  @
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
9 J9 y3 u# Q/ O//R = 1.164(Y - 16) + 1.596(V - 128)
2 k6 T: V/ O. e" `BYTE *orgRGBbuff = RGBbuff;
$ a; u8 V8 X& Q+ mfor(DWORD count=0;count<dwSize;count+=4)
% a& v4 S' M' `& I{/ K. u7 q8 B+ N# q9 T
//Y0 U0 Y1 V03 ?5 k' x; a+ S" V
float Y0 = *YUY2buff;
. ]: v/ t& H6 R' S! r" B6 _float U = *(++YUY2buff);
$ m  ^9 g& [) hfloat Y1 = *(++YUY2buff);2 W( V; ^& A; T) g
float V = *(++YUY2buff);8 r9 {: n' F% F+ Z6 ~* e
++YUY2buff;
: ?- S" A+ O( D9 o3 s*(RGBbuff) =   (BYTE)(Y0 + (1.370705 * (V-128)));           + t4 j9 ^! u7 S6 N
*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
  y& m( I2 Y7 i$ Q$ f*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));        # F& _6 v6 D+ c# l  S
*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));           7 z2 |" p% u3 {4 X$ m
*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
- z) m( F' N  _1 t9 ]*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));         
1 w/ i. p/ i  Z, o+ S! X' t++RGBbuff;/ K, k7 S5 m+ O/ h
}4 x$ I$ O7 g" n. _
}/ u/ y( U& W6 z, [8 |2 D
inline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)% D5 ~* B, B% q! q: |
{
) D0 r* {, [8 v5 U3 B+ l//R = Y + 1.14V! ?9 l; t% t# c/ L
//G = Y - 0.39U - 0.58V
$ i! \' k: H4 D, I3 h6 I9 ~//B = Y + 2.03U
7 r& m+ p  u6 Z$ S: _# u- ]0 l// R = Y + 1.403V'7 W  F7 w" X, `  s6 @' B
//G = Y - 0.344U' - 0.714V'4 r0 `) y8 \9 g# O( W
//B = Y + 1.770U'& `8 g) i% E- Y
BYTE *orgRGBbuff = RGBbuff;
" B% s2 C4 K$ |# C- cfor(DWORD count=0;count<dwSize;count+=4)
% w- Y4 q, |* z, O5 ]/ J# J{
/ \* S: O+ K1 B, _$ y- j# `//Y0 U0 Y1 V0
. L8 T  `* Y; z# P  f/ vfloat Y0 = *YUY2buff;
) Y9 S) Y% Q: J6 q/ o! kfloat U = *(++YUY2buff);
, i* Q; G; N% r0 T# Gfloat Y1 = *(++YUY2buff);
) H, W) e$ ~8 S5 M* h" m$ Sfloat V = *(++YUY2buff);
4 V* I6 M7 H* d++YUY2buff;
% k# J3 O' z, {3 Ffloat R,G,B;' k' Y' d6 G) C  \- \

  u9 x3 v5 V$ t) h+ K' T6 Y7 s. sR = (Y0 + 1.14f*V); ! ?- \( a) V- p3 O9 a/ l
G=(Y0 - 0.39f*U-0.58f*V);   ) a0 H7 ^4 ]; l' r( |
B=(Y0 +2.03f*U);
% X% u8 ]$ i" ?6 w7 pif(R<0) R =0;  T4 C5 f" _# P
if(R>255) R=255;
* i, c* ?" D9 {; @if(G<0) G =0;; N8 O9 b, s0 G$ K- ~: M" t
if(G>255) G=255;, Q' e5 u4 j5 ]  X$ w
if(B<0) B =0;
- k( S; R' P* ~4 Uif(B>255) B=255;
8 w  K7 b0 O# J+ ~) N" @7 o) n: U*(RGBbuff) =     (BYTE)B;          ; S( \1 x% g4 e/ R" Y. \/ j6 ]) u5 f
*(++RGBbuff) = (BYTE)G;
" _3 e7 h6 o! C3 v, z*(++RGBbuff) = (BYTE)R;
: I3 M6 O& {; g" DR = (Y1 + 1.14f*V); ) o0 P5 S' A2 Y, g" e& C
G=(Y1 - 0.39f*U-0.58f*V);   
7 l& I5 a& m, w/ ?+ [B=(Y1 +2.03f*U)   ; - G. |( s. i% ?
if(R<0) R =0;
# p4 A. t" T$ t6 I& |3 S$ _if(R>255) R=255;
. a3 L8 G$ x+ ]if(G<0) G =0;9 P5 n" G5 `  w+ V3 a; N6 E
if(G>255) G=255;9 m4 M6 o& S; y/ D% Y
if(B<0) B =0;
% i) a( E1 R: Z! ^& Sif(B>255) B=255;
, t/ B" o5 t5 M! ^*(++RGBbuff) =     (BYTE)B;         
' S6 H* x7 d( m5 c6 W*(++RGBbuff) = (BYTE)G;
+ j1 @! m7 ]& ]  ~1 I8 ^8 Z; z*(++RGBbuff) = (BYTE)R;* p* n/ [/ I8 t% `( q% F
++RGBbuff;
1 o; W) ~" R- S: ^}' m1 w! X  H. c5 k! E6 j+ G; `1 U
}6 Q" l1 p- U( t# F7 T6 u! z
inline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)8 |8 i# g: d2 _6 f: D9 L9 T
{* n1 P+ Q; V# g4 l
$ ]: q% W& w4 f  e; d: P
// R = Y + 1.403V'
: w! k0 ^# ?' ~2 g! Z% C//G = Y - 0.344U' - 0.714V'. q! _/ ?5 U" X4 a+ ]. x3 @; _3 M
//B = Y + 1.770U'9 A3 [1 C2 ~- _. F
BYTE *orgRGBbuff = RGBbuff;
: t. V! w+ n" a( Zfor(DWORD count=0;count<dwSize;count+=4)3 W  t- `7 o* k9 \3 _" Y
{/ i; O3 _1 p& b# c4 t4 p
//Y0 U0 Y1 V0
+ X* B; o3 D4 ~& gfloat Y0 = *YUY2buff;
) C/ l- _0 l! ~! g- Nfloat U = *(++YUY2buff);: U/ `' A% \9 ?$ j& O
float Y1 = *(++YUY2buff);9 b& J+ B9 s6 {, i6 n4 P
float V = *(++YUY2buff);8 o8 e( P; o8 m0 c& \, ~- k
++YUY2buff;
. o9 n( M) _6 P0 T/ o  w# kfloat R,G,B;
' l; ]4 P! _* k  O! u% h6 ^# t3 h7 S! Q$ Z* v4 l- C7 V0 O9 m
R = (Y0 + 1.403f*V); 2 ^: w) [4 b! n6 s: F
G=(Y0 - 0.344f*U-0.714f*V);   # R8 J) o7 g- h: o; y
B=(Y0 +1.77f*U); 3 l: Z3 W8 |2 G' z- w$ X* [
if(R<0) R =0;
* \5 Y+ }: a8 H% b) eif(R>255) R=255;" E1 l% y" m( F$ [8 @! H( T
if(G<0) G =0;: d; K* F8 n; f. w9 ]
if(G>255) G=255;/ N" N2 m4 S3 k8 |8 A0 F
if(B<0) B =0;3 I: V5 w2 Y; m  l/ J& R, j; k/ q# m
if(B>255) B=255;
% Q! K- |& U2 M6 n$ e*(RGBbuff) =     (BYTE)R;          6 Z5 C( D0 p% C. S" U& z$ A! d6 w
*(++RGBbuff) = (BYTE)G;* o4 W1 r( W8 w4 e
*(++RGBbuff) = (BYTE)B;* o# ~* x( O! ?
R = (Y1 + 1.403f*V); * f& r0 h% m' L( \' r# K
G=(Y1 - 0.344f*U-0.714f*V);   + d( [+ l" m# w3 V! Y3 n
B=(Y1 +1.77f*U); ) D5 f$ }# D! V7 E0 \- p
if(R<0) R =0;
/ w7 t1 K: ?) ?- Tif(R>255) R=255;- @: w- `" T' `: ?& X1 N
if(G<0) G =0;
: ^  A# p  {3 q* o+ Hif(G>255) G=255;& Y8 r- L1 `/ O0 K- [# H" o7 S
if(B<0) B =0;
8 {: L4 ~0 U* e" h$ W+ Fif(B>255) B=255;0 ]0 {6 \) h1 ?  P
*(++RGBbuff) =     (BYTE)R;          9 }# j' C1 }% k4 ~* Z* S
*(++RGBbuff) = (BYTE)G;
* V, F5 |8 r" n" k0 \2 J* D3 W*(++RGBbuff) = (BYTE)B;5 h' l6 R5 [4 i* |' O" P+ r4 Y% a
++RGBbuff;# A4 m' J  s/ k0 u5 B$ |' k
}
' u! u5 V; d0 G% S. y) X}8 ?1 |) _. B  [  k
inline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
6 w& N& n* z! g! `4 X{2 \3 G3 m* a; v1 I! W& C! ^
//B = 1.164(Y - 16)         + 2.018(U - 128)7 v- d8 f& s+ p8 ^% Q: d& [: ]8 m1 u
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128). U+ ~. i' @1 u. v) u! A3 P
//R = 1.164(Y - 16) + 1.596(V - 128)/ K* m7 f  s" Q" d- l3 |& J9 i
BYTE *orgRGBbuff = RGBbuff;7 E6 _' [1 _' z+ b0 \8 j% A6 M
for(DWORD count=0;count<dwSize;count+=4)
; S6 O9 r- k$ K{) I9 t* M. p$ Z; {7 V* r
//Y0 U0 Y1 V0
0 h. _; q) u0 E3 Qfloat Y0 = *YUY2buff;3 U( H8 {6 z$ O0 T2 e: W% ~
float U = *(++YUY2buff);
- r1 t; h& Z" lfloat Y1 = *(++YUY2buff);
1 I* k' o& e& ?0 Tfloat V = *(++YUY2buff);
( ^" {  }) a. L9 f! j4 C; q& R- }++YUY2buff;# i+ B3 _( H* |, e2 G" K4 E
*(RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           # a. U4 o/ q7 w
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   2 M- d, p0 B" p0 c* R* i
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));        0 Z' D4 v' T! n0 \7 R: F  b, ?- G
*(++RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           
$ H8 |5 R. H: h*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   * ]* t/ |* P) _  s
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));         
) \1 ]9 G2 B* G7 l++RGBbuff;7 ^, |0 E! @' w* c$ l
$ A2 E& h7 l  d- h" z
}! Q# ^3 ~- p! |2 |$ b
}# F, S  L& E( e; ?0 Z/ x
// http://msdn2.microsoft.com/en-us/library/ms893078.aspx
. M0 [- T$ R- N8 t1 b& t: [void VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)7 W! }* @9 ]' H! M* n
{/ E1 Y/ N0 ]! {, b
//
$ Y; x! Y" P8 I. G//C = Y - 16
6 z3 w4 c+ b3 S+ D& i9 i) y. f) g//D = U - 128: D: Y) [! {* p" [+ w4 o
//E = V - 128
9 m' W9 L6 G+ g& W% B9 s//R = clip(( 298 * C           + 409 * E + 128) >> 8)3 O1 w; t+ u' R0 j$ Z# ^
//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)$ H  q$ n. B) Z9 U
//B = clip(( 298 * C + 516 * D           + 128) >> 8)7 U, _( j; A. i/ Z5 K, a
BYTE *orgRGBbuff = RGBbuff;
8 j$ Q# q: E: g* W3 L- r7 W4 C1 ~for(DWORD count=0;count<dwSize;count+=4)
4 N; [# Z: C( g- ~{, i, W5 P" N, q, C1 R
//Y0 U0 Y1 V0
$ |% P- e% w) xBYTE Y0 = *YUY2buff;+ k# N8 n( o& ~2 @& r/ L
BYTE U = *(++YUY2buff);
  z* w$ W- E& xBYTE Y1 = *(++YUY2buff);
8 j2 b; H! R3 [7 KBYTE V = *(++YUY2buff);; H2 l+ X; k; \( j% b! \$ S/ c# G
++YUY2buff;) B( k. o9 Y$ M* b( G
LONG Y,C,D,E;
/ U# P0 Q& g8 R% h/ L$ t9 MBYTE R,G,B;
# ^5 R: z) b$ f  V/ d
6 l& Q1 b7 p# a9 y: CY = Y0;
* w$ p! \, I- V+ _7 mC = Y-16;
% r0 t! B- D# r, L' iD = U-128;
/ p: |$ s/ q; @- n4 dE = V-128;
- @) w3 K- ?% u5 H7 z, NR = clip255(( 298 * C           + 409 * E + 128) >> 8);- |' z- o9 b3 }
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);* \! W6 U5 N5 t
B = clip255(( 298 * C + 516 * D           + 128) >> 8);
$ e) w) G% O5 y1 R*(RGBbuff) =   B;           ) f* R8 @! o4 A7 Y% f- |5 w
*(++RGBbuff) = G;   
% ?0 n. Y* n9 o9 L2 X8 t& s/ I! s*(++RGBbuff) = R;        
' s. U, h: |7 E0 p4 y% OY = Y1;. b1 w$ H. k& V+ @
C = Y-16;
4 N, K' y0 ~& }9 a" J( |D = U-128;
: `" ~* n% [$ v- y) G6 ME = V-128;; D( x) T, W1 j! D
R = clip255(( 298 * C           + 409 * E + 128) >> 8);
( O  x  \) G( S$ W. g1 J7 ?G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);( b1 t: E3 P  L4 s( |' F0 l; Z
B = clip255(( 298 * C + 516 * D           + 128) >> 8);
1 N* s5 J/ ]; m9 t- L1 x7 O*(++RGBbuff) =   B;           
0 `  Z- x( Q$ N: r*(++RGBbuff) = G;   
7 J* ]8 H2 H4 [6 H, z6 J*(++RGBbuff) = R;         3 r; h& J, s$ n: v% q3 ?) O
++RGBbuff;
0 I2 O8 m# z( `* G6 N: Q
) ?, i( P: _# X9 [. P}% f( Q* q$ D( P8 L
}$ h( s* e, k1 H9 Z
BYTE VC4000Graber::clip255(LONG v)  v! p, g" P) T9 K7 E. K* {, S
{
, g5 ?8 `/ T& p7 uif(v<0) v=0;! d" |7 |4 i* y
else if(v>255) v=255;; [# p1 L  w( b7 l) G7 X# ~; J2 k' d  `
return (BYTE)v;
6 M9 p- y- [! ]; K9 x$ c& p) c4 W- D}1 E% E2 R& k* Y8 I- R. N

4 p3 p: `8 t( [) J. x本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hardVB/archive/2007/10/18/1831810.aspx+ I7 I" q- _2 w6 y; \) t2 s
( [) a- v! f9 S# D5 s
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-29 17:42 , Processed in 0.018378 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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