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

YUV像素和RGB之间的转换

[复制链接]
发表于 2011-5-30 09:56:44 | 显示全部楼层 |阅读模式
RGB转成YUV(RGB to YUV Conversion)
1 M; [$ @. u9 G5 y7 {9 A+ MY  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
7 S# Y& L* i8 c$ QCr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
* j  W  t- |% k$ ~$ NCb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128YUV转成RGB(YUV to RGB Conversion)7 n% z! v* S+ e' H( \
B = 1.164(Y - 16)                   + 2.018(U - 128)
, V) s9 F; P4 H' b' fG = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
: K: k6 O5 B! n( o- vR = 1.164(Y - 16) + 1.596(V - 128)
6 O; x( I+ ?, O2 Q" X! e6 }( TR, G, B, Y , Cr, Cb的取值范围都是[0,255].
4 k* X7 f. @  Q" p% t) r
% N1 F' X2 L* M1 t/ y7 Z原文:http://www.rosoo.net/a/200604/6049.html
9 d1 Q, j' C, R, u* A7 ~
 楼主| 发表于 2011-5-30 17:08:39 | 显示全部楼层

YUY2视频转化RGB格式

//YUY2视频转化RGB格式 by hardy 2007-10-17
* K" L0 J2 a4 |5 V//http://www.fourcc.org/fccyvrgb.php
! a( ^3 t8 E! g; N( Ginline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)1 d, V, t- e( g+ ^% Q
{) x0 R, t& e; e; O5 |3 [
//B = 1.164(Y - 16)         + 2.018(U - 128)/ i+ t1 D9 l- m) ~2 S: @$ o
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
% \3 \( \0 U8 n0 r//R = 1.164(Y - 16) + 1.596(V - 128)
5 K" B- Q) [# F' n4 oBYTE *orgRGBbuff = RGBbuff;1 w+ W' v# t  w6 \# b: U1 M
for(DWORD count=0;count<dwSize;count+=4)% A9 ~* e" r* ?
{; g4 |0 }* |$ `1 }; y
//Y0 U0 Y1 V0
! ^& o7 h+ E# @9 w, s3 rfloat Y0 = *YUY2buff;+ q$ X, Q$ J( G/ t9 k$ ~9 d
float U = *(++YUY2buff);
) b2 y# W9 t& D1 Rfloat Y1 = *(++YUY2buff);7 {) [6 V: B4 h- |- U  @; E
float V = *(++YUY2buff);0 r& d5 A, L; D( {* }# u$ N' b
++YUY2buff;, l" R; l4 v3 H# D& O, N1 n
*(RGBbuff) =   (BYTE)(Y0 + (1.370705 * (V-128)));           # y! a4 i$ a  B9 d8 P
*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
0 ?/ q6 \& P5 p2 ^*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));        
. e5 E3 @4 ^# ?7 l4 N*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));           
! a. k" m. M7 [. T# q) a0 z' X* i*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   : \* g, I& w, Z
*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));         5 g0 s0 U$ ]8 E6 V; d8 U
++RGBbuff;6 n  C8 `* S% d" m+ r2 l/ I
}! x+ ], I  A# x. v4 B; I
}- l3 d1 N* C! A; z: f+ H5 k
inline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
" p% k+ m: j! a$ V# r! Q{9 C9 Y( Y  \) r) X) e: {
//R = Y + 1.14V+ @& V% f; y5 p1 G% U  `
//G = Y - 0.39U - 0.58V6 Z( t% c1 ?6 `6 X/ j! k& e; [
//B = Y + 2.03U
6 G! n. v' m" ^# h2 L// R = Y + 1.403V'6 R7 h0 t' G6 M7 t" I
//G = Y - 0.344U' - 0.714V'* Y3 R. h6 X4 G* m% l( z! j
//B = Y + 1.770U'
3 W! r6 W1 g  R/ I, W/ T! f) MBYTE *orgRGBbuff = RGBbuff;
3 s3 A( o1 F( }# dfor(DWORD count=0;count<dwSize;count+=4)
& K3 b& ]& R" z6 M) f* N2 }+ F# z{  T. w0 v, t2 P- z
//Y0 U0 Y1 V0/ u: M$ l6 l4 [
float Y0 = *YUY2buff;
6 J  t& n5 H: S- c0 t& u% _float U = *(++YUY2buff);
; x$ c0 d5 r3 g# B' ]$ |float Y1 = *(++YUY2buff);6 G5 z: B( Q. }( n" [( m
float V = *(++YUY2buff);
% d6 e$ [+ U, @4 e* G# l$ a++YUY2buff;/ b' c/ Y; K1 W1 X7 u
float R,G,B;
- ~( _7 {( s* @! w: S% R7 N0 u* T
$ j% b7 J; E8 v, n' d, uR = (Y0 + 1.14f*V);
, ?) @+ s. f3 r8 P% \G=(Y0 - 0.39f*U-0.58f*V);   
$ B% X# F9 U' X4 y, tB=(Y0 +2.03f*U);
- T# f& _+ s% ^( Iif(R<0) R =0;
( ?. r7 n  w' f: h: _: mif(R>255) R=255;, i1 l5 _8 p% H' P: X3 a9 K% H
if(G<0) G =0;
& j8 {% [- y$ O8 t0 Bif(G>255) G=255;
  h; a/ H3 H8 g& G& I! [% tif(B<0) B =0;/ z% i) m% X' L
if(B>255) B=255;
! y8 e4 @9 t4 ]& w7 ?- y. C9 U& g; }*(RGBbuff) =     (BYTE)B;         
; {( d* d; [8 V8 h6 b/ i# x9 N' @*(++RGBbuff) = (BYTE)G;
" V+ j, O1 d/ _0 ]5 Q, g*(++RGBbuff) = (BYTE)R;
' M0 v) Y  |: C9 U+ s- n! @3 O8 }R = (Y1 + 1.14f*V); ( ~# l$ ?2 g2 E& ]
G=(Y1 - 0.39f*U-0.58f*V);   0 d4 R7 i" d# L: J1 O( ]7 R% X& T
B=(Y1 +2.03f*U)   ;
1 c9 h9 }, v# b) `3 sif(R<0) R =0;
( I0 k5 _! F7 Q. Z; rif(R>255) R=255;7 Z$ |7 u6 a) `; @) l
if(G<0) G =0;
1 Z; _5 S+ }) l" x! w- I$ C3 cif(G>255) G=255;
$ J7 e$ d' Q4 D, B+ Kif(B<0) B =0;
0 J5 Q! I% V4 @7 l. \1 i$ `if(B>255) B=255;
0 P4 s6 j+ ^: P5 J/ i" `; ]*(++RGBbuff) =     (BYTE)B;         
& b( l- s) b" G: y- R) v*(++RGBbuff) = (BYTE)G;
! i( Y# N$ q' C" o( g. L$ q- }# X*(++RGBbuff) = (BYTE)R;8 K, _& K3 C/ D3 X$ ~8 q
++RGBbuff;
6 g) B* {+ d1 U  r5 @}4 |1 ?7 ?, o2 f& A
}) y% l4 j/ u$ {/ `& Q& @6 ^4 q6 C
inline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
) `6 ^9 a; L) N* T/ b0 W{
: A) Q' V$ U) Y4 q+ i; l; _# b. X- P. D  A- C' o5 u
// R = Y + 1.403V'$ B6 X" T1 K$ n. }+ C6 @$ ]+ M
//G = Y - 0.344U' - 0.714V'
/ c  K! a( K. E5 U1 s4 w//B = Y + 1.770U'
. e4 O0 T9 U2 u2 _* c7 mBYTE *orgRGBbuff = RGBbuff;
% W% p" t" E5 T% E8 H; ffor(DWORD count=0;count<dwSize;count+=4)% ^, U7 H' R# D8 H# K3 i
{; U1 A9 ~( L. f
//Y0 U0 Y1 V0
5 `1 N" d0 M% h5 vfloat Y0 = *YUY2buff;
: A+ |' n+ c4 \5 ?- f" O1 v* V3 _float U = *(++YUY2buff);0 D6 P7 B" E  U9 U7 F0 W/ w8 u* G, p
float Y1 = *(++YUY2buff);8 j0 T. {/ q# p+ f
float V = *(++YUY2buff);
/ R1 ]5 C7 ~! s++YUY2buff;
2 V+ N6 s; |9 M, bfloat R,G,B;
" J3 B9 Q4 F; o  ]$ c) ^
! g& _% Z1 p; f$ N! FR = (Y0 + 1.403f*V);
( @8 f+ B$ \1 I/ HG=(Y0 - 0.344f*U-0.714f*V);     w7 [0 b+ Y: U; q- @2 l
B=(Y0 +1.77f*U); % A7 z0 g; I. B0 g- R5 C, P5 A
if(R<0) R =0;
; _9 ?( r0 w8 c  bif(R>255) R=255;
) V. [& r) ^! N8 o1 ?# t3 X1 N/ o' wif(G<0) G =0;: r3 e5 Y8 A) l& |/ u0 N
if(G>255) G=255;
) G- b" l- C) S" u8 gif(B<0) B =0;
9 G1 ~, k" H) Q; _- rif(B>255) B=255;1 A8 j; z2 q, G0 F. o1 c
*(RGBbuff) =     (BYTE)R;          : S$ u4 e, V) r( E" w$ r
*(++RGBbuff) = (BYTE)G;
3 m0 V  T+ c+ s' O3 S/ O1 M5 n*(++RGBbuff) = (BYTE)B;3 G! v  Z" U( U; Q' L. T4 {: Q
R = (Y1 + 1.403f*V);
  p9 z4 F$ m( i/ @; s7 b, KG=(Y1 - 0.344f*U-0.714f*V);   
4 i% L7 Q" j, N- B, ~B=(Y1 +1.77f*U);
. f, J6 D8 ^/ {* O4 @/ Pif(R<0) R =0;
  ^, J3 X9 |4 P, \/ H4 [% a' gif(R>255) R=255;
+ `2 ^0 f6 L2 v. @; q* kif(G<0) G =0;
: H( M. U5 Y% ]if(G>255) G=255;
  }* X2 c' ?% }( r4 o9 Aif(B<0) B =0;# G. B1 }9 b8 T  C' m
if(B>255) B=255;
+ l3 D1 X  K5 x7 J( Q! f0 t3 o: m( m/ L*(++RGBbuff) =     (BYTE)R;         
4 P" i( L7 F! E- |8 U$ ~( D$ C*(++RGBbuff) = (BYTE)G;. r) z' g0 x2 _% Y0 l! k/ k, U. |
*(++RGBbuff) = (BYTE)B;
' @# }: ?  m- q% b++RGBbuff;. e. ?6 c$ n3 i" Z
}
6 Z, A4 r) m& {- D0 N9 N}
. ?3 T5 p8 y/ n8 }& y  ]inline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
6 \5 ?- P2 j. H2 h6 V7 t{! u% R2 K: g, [8 Y7 w3 b! @
//B = 1.164(Y - 16)         + 2.018(U - 128), a6 n' q/ ?; B5 x& ]8 Q  J
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
" K/ f# h" }" k# B4 S* P//R = 1.164(Y - 16) + 1.596(V - 128)3 L9 U$ t4 f# y- H, l5 u: n( U
BYTE *orgRGBbuff = RGBbuff;
7 e( c7 s) W: i5 n! {; Wfor(DWORD count=0;count<dwSize;count+=4)
, `- T; w3 d, O8 n! q{' Q; r$ |( L% [, Q4 U& K6 V
//Y0 U0 Y1 V0
* y- b! e& f6 H. m, c/ E7 f, Mfloat Y0 = *YUY2buff;
4 Z( ^. w( x& [  W) Z' w" Hfloat U = *(++YUY2buff);
: u: }0 S2 y5 A0 \2 M9 Y# i5 c6 G* Nfloat Y1 = *(++YUY2buff);' s% m* F% A+ M5 T
float V = *(++YUY2buff);8 b" V% v, y; }/ d+ _" @+ R
++YUY2buff;
% A" a& G' Y2 C: D% L$ E( ^*(RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           ( {( l" x/ j0 h2 F$ m; U$ L
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   
! Y- [: p1 k: u) n& `9 E& y% I*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));        
, a; O4 \+ P9 v) K*(++RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           
+ x6 |% w# t2 Z  X. b*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   3 F) Q( P7 ]" Y8 D( [& x
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));         
9 \4 u1 A+ C" r" r" ?: J1 q++RGBbuff;" s3 }4 y3 t+ K2 c$ a
% ]7 ]; ~; P- y& x. v; M8 w0 @) \
}
) x7 k5 x7 C1 k1 F}$ t0 o' [4 e1 W! U, w& X
// http://msdn2.microsoft.com/en-us/library/ms893078.aspx' h9 \; t9 r5 w0 q4 U$ B
void VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
% D9 A! {4 D! G: R3 Y2 q{8 ]9 g, N7 k, G4 c; x1 F: S- n% f
//
9 A- R$ W0 O& |//C = Y - 16
! x0 F: T' |4 t: o//D = U - 128
/ u2 u( k' i- q/ ^- s//E = V - 128/ M1 q& m, Q4 \- L
//R = clip(( 298 * C           + 409 * E + 128) >> 8), D$ q. V. r1 v: F
//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
0 \" y1 ]$ G+ x4 X3 Q" c- Q8 }//B = clip(( 298 * C + 516 * D           + 128) >> 8)! G' m2 @7 b% u
BYTE *orgRGBbuff = RGBbuff;
2 K$ v- L" q% v% Hfor(DWORD count=0;count<dwSize;count+=4)
5 J8 ]- b0 a* f& i; }{, W6 \2 s- j5 h/ ?/ a: U
//Y0 U0 Y1 V0) X4 p  `% f5 |" P8 k* u: v
BYTE Y0 = *YUY2buff;: W8 M' p3 e& u: \3 V, h
BYTE U = *(++YUY2buff);
; R5 N% j3 `( d4 Z5 l0 oBYTE Y1 = *(++YUY2buff);' Z& G# ^* @5 p; c& Y! ]
BYTE V = *(++YUY2buff);
. |5 t  a! r  ^* @++YUY2buff;, P8 j- t: e: R2 L/ F* {! e
LONG Y,C,D,E;! X, }1 q1 ^8 H) s& Y' f
BYTE R,G,B;! ~7 D4 J# I7 L- V  x+ o
7 m9 Z9 N9 t4 c) y
Y = Y0;9 L3 I. ?% [" g' @" y, ~! u; |
C = Y-16;" b  T- P7 x5 H( X6 r
D = U-128;
* L: {) k2 I# O$ \7 d0 F; _9 S" JE = V-128;
' ^4 q; W# t7 E  vR = clip255(( 298 * C           + 409 * E + 128) >> 8);/ s- K  A' t9 s+ ?# h
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);* v6 q8 g; u2 z6 P( ^: q# |
B = clip255(( 298 * C + 516 * D           + 128) >> 8);  H2 `' a8 n6 L% f
*(RGBbuff) =   B;           
9 \7 R3 N6 m2 @, I- L8 n% p3 a*(++RGBbuff) = G;   
7 a4 O0 f# O- ~*(++RGBbuff) = R;        
/ I# C- E! b0 P$ aY = Y1;
: D0 D: {9 }# z5 l( u/ \+ x' _C = Y-16;
. Q/ d* Y1 |5 y' [# \" HD = U-128;/ l) m$ H0 p& ?- `3 E) E
E = V-128;
) y' t7 }$ f: o6 J! j! v; J+ D, V9 DR = clip255(( 298 * C           + 409 * E + 128) >> 8);+ H; v) B! I5 f9 c7 m9 z+ _
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
* o7 Q* o, L- H' eB = clip255(( 298 * C + 516 * D           + 128) >> 8);0 |0 ]% |: Z; N4 v5 q( ?- s
*(++RGBbuff) =   B;           
0 U' `2 O4 {2 X# L9 |*(++RGBbuff) = G;   % k: Z! ?4 U2 X& o
*(++RGBbuff) = R;         
3 |, n7 I+ y% v2 @5 c) K: y++RGBbuff;( L- a. V6 J: A1 N! y, q
5 H" k! C$ t; R7 M2 d' `0 Q
}
' V- v" }8 c! H8 }, L: Y}, u7 s; h, _& m% ~. W; c
BYTE VC4000Graber::clip255(LONG v)
  ^: o' l6 [9 O3 P{2 O, r* [+ h, q
if(v<0) v=0;
9 {) D# @9 M5 |4 u* jelse if(v>255) v=255;
% z7 L  P  y* E. E$ R4 Wreturn (BYTE)v;
9 s5 _8 M7 T0 g' `4 l1 J}5 p1 ~* [! O  ]; t* B- }

7 `: W- J+ R9 h# X本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hardVB/archive/2007/10/18/1831810.aspx; A+ N7 ]7 {9 L* `1 w4 k9 y

( t$ K( z; N* n) t# G
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-10-1 23:12 , Processed in 0.018249 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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