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

YUV像素和RGB之间的转换

[复制链接]
发表于 2011-5-30 09:56:44 | 显示全部楼层 |阅读模式
RGB转成YUV(RGB to YUV Conversion). ^, \6 U2 L% L3 h2 f( o
Y  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16, i1 f, |9 K& D/ Q
Cr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
: v1 `! c+ d$ f3 }7 w9 b9 bCb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128YUV转成RGB(YUV to RGB Conversion)
/ S9 S0 g" }3 q) _0 P6 oB = 1.164(Y - 16)                   + 2.018(U - 128)/ z4 Q# `, B' k* L2 H% {, }& {
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
2 F+ f' r$ T. KR = 1.164(Y - 16) + 1.596(V - 128)
" _$ S: s5 n0 }7 ?3 c+ g7 xR, G, B, Y , Cr, Cb的取值范围都是[0,255].
7 k* a) ~* V& e0 r  m" |3 h5 @5 D7 w/ O9 Y3 B  C0 D
原文:http://www.rosoo.net/a/200604/6049.html
: K' {6 @4 L. p
 楼主| 发表于 2011-5-30 17:08:39 | 显示全部楼层

YUY2视频转化RGB格式

//YUY2视频转化RGB格式 by hardy 2007-10-17
/ a8 b# {: y2 q6 A  P0 @//http://www.fourcc.org/fccyvrgb.php( R+ h; ^/ [0 U
inline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)# y9 x+ C( K0 a, p4 a" g) i
{
6 d5 u6 w) }8 \  B//B = 1.164(Y - 16)         + 2.018(U - 128); A! {4 a8 u7 u  f& G8 g/ \+ x5 H
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
+ L; W$ A& [" {4 L9 L! n//R = 1.164(Y - 16) + 1.596(V - 128)
' Y6 N4 z# \! KBYTE *orgRGBbuff = RGBbuff;
" g& J* |" n# P6 X- y6 o1 wfor(DWORD count=0;count<dwSize;count+=4)
5 y7 s. m' l" k: r{6 {5 v  z2 K2 j9 L( i$ e% {
//Y0 U0 Y1 V0
7 x; b. `( O) }" Z8 n+ |, j+ mfloat Y0 = *YUY2buff;
' E  P9 k8 y% i- d( E/ T' |5 E) ^float U = *(++YUY2buff);
% a6 p( j$ L1 @# x# Q. `4 bfloat Y1 = *(++YUY2buff);
% j: c% q' k' C8 N1 Y4 O6 E# v2 Yfloat V = *(++YUY2buff);7 K* F/ D1 U# w- ^
++YUY2buff;
. G& @& a& e6 o+ U- h) w*(RGBbuff) =   (BYTE)(Y0 + (1.370705 * (V-128)));           
% a# p6 d" [( ?* ]3 C*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
) ]7 ~8 [) L% f3 ]/ K3 Q* x! }*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));        2 s& i8 X* I9 s
*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));           
; c3 H2 `  t5 @2 ~3 l9 K*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
3 x: [% q" e! P) s*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));         
2 e! J7 z# h. Q& w: s++RGBbuff;
& B9 C* y+ m# o' B# R) F+ o+ V+ [}* }! r; m$ U( d
}
# E( _$ n: j; ^. L% K$ ainline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)0 [2 [4 T; Z8 I2 k* k
{
4 f% r, h. F* j& @0 y//R = Y + 1.14V$ M) C' N, `" _$ a+ }' z  d5 F* B
//G = Y - 0.39U - 0.58V9 M& r$ m4 f$ x, k
//B = Y + 2.03U$ L; M& Z  ^8 |2 d* j* `) P) F
// R = Y + 1.403V'8 i- Q, |6 n4 u! a2 |' ?
//G = Y - 0.344U' - 0.714V'
) Z9 R3 B& ~; @8 E  N1 o- e//B = Y + 1.770U'* R( h% q) v( K8 z4 f2 t$ l
BYTE *orgRGBbuff = RGBbuff;/ v- U7 `/ _- I0 b* [. u
for(DWORD count=0;count<dwSize;count+=4)
& S0 d! y* ^. U8 L! V9 _+ o' K{
1 N! E$ _" f/ d) w% R9 D3 o//Y0 U0 Y1 V0
/ r# }# G% `& O& B) R. v# _float Y0 = *YUY2buff;
3 K) _0 U. I0 C  r: yfloat U = *(++YUY2buff);& l( M8 F. Z& j5 ?7 C) }4 l, \# f
float Y1 = *(++YUY2buff);+ a, ?# J/ y- R! _* ]! t6 W
float V = *(++YUY2buff);% @# P% }. l, v# k1 j+ a; m
++YUY2buff;. M7 Z8 r6 `) a4 M1 [) b$ P) K
float R,G,B;
/ [6 k1 j+ w1 ?
" E$ ]5 D( W3 c9 D+ g) ]! W2 vR = (Y0 + 1.14f*V); 4 m: A$ w6 Q" i+ r1 u& ]+ B( s
G=(Y0 - 0.39f*U-0.58f*V);   
3 b( K2 x! K5 o, K6 Y8 OB=(Y0 +2.03f*U); 3 f) ~: Q/ t1 @& y7 Q
if(R<0) R =0;
9 N. Q& _& j' C: _6 j; ?if(R>255) R=255;) H' F9 u/ v1 h) C1 h& k
if(G<0) G =0;
0 D$ y* m6 w" x- x5 bif(G>255) G=255;; s7 S- \# T5 F: D$ ?: e5 u& o7 O; `
if(B<0) B =0;
8 x$ {" ?0 g5 U3 C+ Pif(B>255) B=255;) J: N4 l- N, `. X, r/ c. P4 P
*(RGBbuff) =     (BYTE)B;            T/ s; ]8 |6 W2 ^9 C8 Z' I2 c
*(++RGBbuff) = (BYTE)G;
* J  L/ i# h2 ~*(++RGBbuff) = (BYTE)R;# Z/ t3 K' `8 ?+ l/ W0 E7 _
R = (Y1 + 1.14f*V); + W; B! D  l8 D3 `1 A! A3 E5 X
G=(Y1 - 0.39f*U-0.58f*V);   6 s, \! _  X1 N- ?# o) o
B=(Y1 +2.03f*U)   ; 8 k9 H% X6 \: x) e" h0 D: E; `* o
if(R<0) R =0;
: [/ S% @4 z+ r6 {) `, vif(R>255) R=255;/ P1 |8 A  h; m5 L. _9 _! E, P
if(G<0) G =0;' O. [) g  ^! A0 I4 V- G
if(G>255) G=255;
  ?8 B) O6 y6 C6 Hif(B<0) B =0;
8 h( ^2 L4 n, b8 Gif(B>255) B=255;
* G! {6 @* e4 `- z3 A+ P*(++RGBbuff) =     (BYTE)B;         
8 z! W% c6 R# G9 K! ~! d- k* f*(++RGBbuff) = (BYTE)G;
- x4 I& T' O" F+ K, p*(++RGBbuff) = (BYTE)R;
2 \2 o! o+ N1 W0 r+ S++RGBbuff;
- @+ o" Y5 w9 W4 j5 B$ N6 N6 {}/ D* f5 w& i0 V$ b; X6 ?
}
7 u% n! h! V( L  ^inline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
" k" L# r, b5 D4 e& E: d6 F  C2 E{
: I! _" H/ G0 P4 H: o5 b7 S1 `8 |! x' _
// R = Y + 1.403V'2 c( P8 H+ L3 U& _& [3 h. s9 l
//G = Y - 0.344U' - 0.714V'/ _$ L% k2 x" c4 _+ Y0 z
//B = Y + 1.770U'
" T9 i7 z1 x; F- {0 b. \& ABYTE *orgRGBbuff = RGBbuff;
5 |- {0 ^  e" }0 bfor(DWORD count=0;count<dwSize;count+=4), S4 p1 V, T0 q
{" A" f' O- D. A  p: F
//Y0 U0 Y1 V0. c  A- }" R( I3 w9 N/ D2 H0 K
float Y0 = *YUY2buff;0 V: R8 V, E: e* a2 d; _
float U = *(++YUY2buff);
& D. ?9 p4 B8 z& k+ o5 Q2 F! wfloat Y1 = *(++YUY2buff);$ O8 K% a0 c0 y6 H' X8 a
float V = *(++YUY2buff);
7 z0 _4 n5 y5 z  v+ ^++YUY2buff;, {- J- @) Q" v0 A2 A
float R,G,B;, [7 a' A% ?3 x* Y0 O, A
3 t9 I4 c, @6 @; Y
R = (Y0 + 1.403f*V);
+ O" G. a- `5 Y5 M3 `G=(Y0 - 0.344f*U-0.714f*V);   7 [: I9 ~& V! M% s
B=(Y0 +1.77f*U); : G8 f7 C8 x/ ?& ~) R/ ^2 H
if(R<0) R =0;# y2 L* X3 l# D% r' E4 X
if(R>255) R=255;
. ^0 Q! C  c$ l, L. [/ _if(G<0) G =0;8 _8 I/ k7 D( X# M4 m0 A7 a- k
if(G>255) G=255;3 Z! \* a/ ~  p( M5 w
if(B<0) B =0;3 l- H, f" P+ j: ]9 l& Z
if(B>255) B=255;# J) p, g: a- p, L, q1 ?+ O
*(RGBbuff) =     (BYTE)R;            q4 z) V1 K+ Y4 j' S4 i
*(++RGBbuff) = (BYTE)G;
- L+ d4 A% L: L4 A*(++RGBbuff) = (BYTE)B;1 R) H( z& Q7 j& ?
R = (Y1 + 1.403f*V); : e1 u+ s$ F; Y2 C" Z
G=(Y1 - 0.344f*U-0.714f*V);   
  w  ]6 p6 ?# W# `8 A2 @! }0 sB=(Y1 +1.77f*U); 6 [  Y; l; r( @6 L
if(R<0) R =0;  q3 ~' L1 ?$ r# L- Z
if(R>255) R=255;  P/ U8 A) f0 g2 h/ O! E( S5 t
if(G<0) G =0;/ ?! T5 r8 W/ W. O
if(G>255) G=255;
& l$ _+ `0 Z$ f+ s3 H7 Fif(B<0) B =0;
2 u' {- g# W9 v; t4 V. c: S" lif(B>255) B=255;
' S3 a& [6 x) N- I" A( x*(++RGBbuff) =     (BYTE)R;            b. ], z$ ?( ~8 v0 Q; ]0 \
*(++RGBbuff) = (BYTE)G;# }5 O0 O3 i$ e
*(++RGBbuff) = (BYTE)B;; ?) k& K: j4 i+ `
++RGBbuff;
8 |' Q( R  I! Z% Z5 w}9 p) ^0 e: O, b4 T: b: R
}
$ c/ X- A% k1 h- T$ }- {inline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize), u" @$ M$ P9 `7 K0 K
{4 D5 m; q8 s' h( y2 k) I! g. X
//B = 1.164(Y - 16)         + 2.018(U - 128)
; [* d$ v6 K- N3 C7 {" b//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)6 `2 A6 W' ]4 I0 S0 ~
//R = 1.164(Y - 16) + 1.596(V - 128)
5 L& r: x7 ?2 }: c4 IBYTE *orgRGBbuff = RGBbuff;! K0 ?' [; F$ T( x( k( M
for(DWORD count=0;count<dwSize;count+=4)2 }  e4 ~4 i9 w! j
{
3 j6 `: ^" _5 n1 i6 W6 I$ Y2 Y* R//Y0 U0 Y1 V0
: {9 Q; [- g' J2 o% a* afloat Y0 = *YUY2buff;; U. r' |5 h. c
float U = *(++YUY2buff);" T4 u& j$ j( z4 L8 N# t( x% R- Q  |( p
float Y1 = *(++YUY2buff);
/ Z0 ?  p4 F. J- K$ mfloat V = *(++YUY2buff);
# _7 X- ~& p$ W: N5 }# r++YUY2buff;: G7 y( w4 }- v* Z! F
*(RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           8 k/ z& [  i- c8 k. }+ t2 m
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   & \: l$ K% z% w
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));        " _6 \; |' B5 O0 ]! X( X7 e
*(++RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           
% U9 z4 z! D9 J! I* }; x*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   
/ `0 U1 Q) E* Z  M7 p+ _*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));          % {; l" M1 T* l) s' F) {& y
++RGBbuff;
& _/ |- N8 Z. d1 O
% W  B* O0 f& W+ E1 ~! E- }% v" K}
7 n2 O' D$ t3 f+ Q- J2 B: Y6 P$ K6 b}
9 i" P0 M& W+ \1 o) J- @// http://msdn2.microsoft.com/en-us/library/ms893078.aspx
2 s/ N! z  o& _2 t5 `% vvoid VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
2 ?2 |, i  F2 b) V+ v- R! R$ P{3 ^3 W+ D' g* t0 D+ ^; Q
//
3 z) l* y3 h1 P; u//C = Y - 16/ y  U) N5 G4 k6 U* C! s( u
//D = U - 128# y, d4 ^+ p# z7 X6 `
//E = V - 128
0 ~( p( g$ |. `- ]" j8 g7 _//R = clip(( 298 * C           + 409 * E + 128) >> 8), F2 }; a3 R+ t6 Z, U2 N* K
//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
  f- O* M; [7 r; Y  K5 z  P4 Y//B = clip(( 298 * C + 516 * D           + 128) >> 8)' J. ?1 {9 K/ @* n, u( S( j
BYTE *orgRGBbuff = RGBbuff;2 G' D. v& m  J: a) |5 g. j
for(DWORD count=0;count<dwSize;count+=4)9 w: ]/ \( i( V) i
{7 j1 [2 d  u9 \: f6 T$ R8 F
//Y0 U0 Y1 V0- x# c2 g5 D' |' c- J- k
BYTE Y0 = *YUY2buff;% Q+ @' }8 `% V7 X2 H
BYTE U = *(++YUY2buff);
( |/ e! P9 w4 N/ E  xBYTE Y1 = *(++YUY2buff);
1 C% S9 a. X8 B2 L5 g7 R0 jBYTE V = *(++YUY2buff);
2 B1 |4 R$ R+ d: U++YUY2buff;& H! u* L% E2 V) t! _
LONG Y,C,D,E;$ P* |0 C! S2 D' k- Q" W$ H( x
BYTE R,G,B;
# Z$ j2 N8 \" d0 l1 D! M2 e) n- K) M' \$ _5 s# w4 i* |
Y = Y0;
0 f5 S5 {3 a. v3 _C = Y-16;
: O) e, Y8 L) ID = U-128;5 N. e+ v7 ?! \" Z; s
E = V-128;5 z' e4 Q2 {% }  k! J( d3 k
R = clip255(( 298 * C           + 409 * E + 128) >> 8);
3 C) `  f" ^8 d1 b" V' A; lG = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
) V6 ?0 ?' P0 f1 l+ [B = clip255(( 298 * C + 516 * D           + 128) >> 8);
( v1 Z2 F; Q1 I) |*(RGBbuff) =   B;           , R4 ^, r0 x% ~- i
*(++RGBbuff) = G;   
6 `' B6 G: i$ s8 L*(++RGBbuff) = R;        
& W4 m! A' n8 }& J( I8 DY = Y1;
! L3 f1 k7 T' j/ f# NC = Y-16;
& I2 h5 S+ t' c7 QD = U-128;
& |6 x! |( a) }5 U5 {E = V-128;
* i# A7 C6 Y$ g# W1 x; rR = clip255(( 298 * C           + 409 * E + 128) >> 8);! b$ R& |& |$ b6 x- Q
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
! e% Z, |5 ^, o7 ^# X. m3 HB = clip255(( 298 * C + 516 * D           + 128) >> 8);$ ^4 Y6 G6 V+ j4 b- Z
*(++RGBbuff) =   B;           
/ x# q8 c8 A; U. t+ d*(++RGBbuff) = G;   
, O$ I$ l/ \. O: w8 i5 d*(++RGBbuff) = R;         
4 p( M  Z9 F, N0 m++RGBbuff;3 Q4 d3 D/ {% o2 A

0 Z3 |! x( ]; t" X7 K. \}% A5 s, ~. I/ N/ S# r6 R: G1 @
}
) N( l) h1 F/ e* B( B) J2 Y0 u" I  ?BYTE VC4000Graber::clip255(LONG v)' E* o" y, S' `& h- I; F4 e, U
{) m4 ]) g% G+ m8 R, p0 J" ]5 _* K
if(v<0) v=0;0 I% }, ^7 {& `" R! @4 T  l1 k! J
else if(v>255) v=255;6 u3 C: J+ V9 k: k, B/ F
return (BYTE)v;
. x* P7 V$ i& N5 C' G' y- N7 t}
! o' r0 _' b+ P9 r) ?- v3 J& [+ p/ \, q" c3 l0 ^6 S: `- H/ |6 g
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hardVB/archive/2007/10/18/1831810.aspx
; l- j3 d; P, O  F4 |( W! H  u! B- F$ ?- r! d! C3 P& d7 A* Y
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-2 10:21 , Processed in 0.019391 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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