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

YUV像素和RGB之间的转换

[复制链接]
发表于 2011-5-30 09:56:44 | 显示全部楼层 |阅读模式
RGB转成YUV(RGB to YUV Conversion)
; _" x. Y" o7 j- tY  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16- y; p0 i5 _0 S/ B- r
Cr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128, l% o5 H2 Y: z6 J3 h
Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128YUV转成RGB(YUV to RGB Conversion)! z+ F4 n* k; ^. d
B = 1.164(Y - 16)                   + 2.018(U - 128)
/ Z# a$ h5 D2 C! lG = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
4 F5 [( Y6 g: h* A2 I, w  j4 _R = 1.164(Y - 16) + 1.596(V - 128)2 J( Y3 E% ^# E5 t1 J0 I, Z/ J; q' C8 W
R, G, B, Y , Cr, Cb的取值范围都是[0,255].
7 W0 ]9 M1 |! D$ T. x6 W0 X: A  O7 K* ~: K" a. Q) r- G7 p! m
原文:http://www.rosoo.net/a/200604/6049.html
3 I' `% I2 z+ H" S5 `; N
 楼主| 发表于 2011-5-30 17:08:39 | 显示全部楼层

YUY2视频转化RGB格式

//YUY2视频转化RGB格式 by hardy 2007-10-17" `9 M2 Y3 J: t, F" s) L& x) x
//http://www.fourcc.org/fccyvrgb.php6 \# U$ O7 L8 F; @4 N9 u) Q$ R
inline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
: x( v: U* K) @$ N% Q; q{
' Z9 z( r: F' U' J//B = 1.164(Y - 16)         + 2.018(U - 128), k3 S# j& m# ^8 u% b
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)1 A0 U' |' B4 p! _% ]! x1 C/ e# e7 m
//R = 1.164(Y - 16) + 1.596(V - 128)4 T6 L& L0 @6 s  i" V: y! H
BYTE *orgRGBbuff = RGBbuff;
+ d3 U  l. l' i9 |- R2 c- ifor(DWORD count=0;count<dwSize;count+=4)7 M" z+ S2 ^- j$ N) N
{3 R& l  ~* F9 U. \) `- g: I
//Y0 U0 Y1 V0
  s7 W4 a# j5 Afloat Y0 = *YUY2buff;8 e7 H8 ?8 @: e& S7 D6 e
float U = *(++YUY2buff);3 }" p' a( F0 a% G
float Y1 = *(++YUY2buff);
7 p) X) c: P( s4 M& efloat V = *(++YUY2buff);& F! c+ e  L$ r& i! Z
++YUY2buff;6 k5 M! h6 E1 g0 M
*(RGBbuff) =   (BYTE)(Y0 + (1.370705 * (V-128)));           5 s( X* M" R1 [% b
*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
! }  _, l; f. u: T3 t/ A& }! v*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));        
+ t7 a. D! R8 p# \4 ^0 i9 i*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));           
, ?! t5 W7 c) T' O*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   6 [! _: m+ a& {3 ]' T: k
*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));         
; h* [2 e: j. D, b7 g++RGBbuff;
) {5 t( L/ [  W/ s" x& A}4 X( o5 \) [: c5 E; A6 c
}& R) F  x/ c, R5 T; N6 X# o
inline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
6 d8 ?$ F* O7 F. V{. l% k/ Y# c; {, E
//R = Y + 1.14V
" _" @6 f5 f1 j9 L//G = Y - 0.39U - 0.58V
3 s# V" e1 ]; E6 S3 C% ^1 G//B = Y + 2.03U
, t" c- S, _) H// R = Y + 1.403V'
' O) |2 k8 M; A( t+ B' c//G = Y - 0.344U' - 0.714V'% A$ T; Y$ m  s8 m; k9 a; p
//B = Y + 1.770U'( f$ _: r* M+ z# W- d( v& \
BYTE *orgRGBbuff = RGBbuff;; r- u' x, ]- ~3 `8 X
for(DWORD count=0;count<dwSize;count+=4)" O% u$ u. M' c
{( R/ U+ B2 W- g5 s
//Y0 U0 Y1 V0$ e# C- [9 d+ G6 x  B# I% y: M2 j
float Y0 = *YUY2buff;
8 \1 K# A7 R% b) B7 bfloat U = *(++YUY2buff);
) {- L) }" i5 o! n; i  k. k& T  zfloat Y1 = *(++YUY2buff);% S  y5 _' ^  i
float V = *(++YUY2buff);
1 o+ u( B: e) e: H5 O$ \+ N++YUY2buff;
; _/ x  ]8 N2 w( A0 dfloat R,G,B;
" L$ S( r8 P# I9 ^4 _4 l
! x0 b1 K: _5 a$ L% GR = (Y0 + 1.14f*V);
/ M, f4 K# j+ H6 pG=(Y0 - 0.39f*U-0.58f*V);   3 z  C" {7 q4 w% e0 b) |5 m  u
B=(Y0 +2.03f*U);
! c/ R4 y* \( T6 @if(R<0) R =0;% s' r2 t9 Z) _0 Z+ z' `3 r2 p. Y/ P
if(R>255) R=255;. T# {0 {" i6 K5 O! g
if(G<0) G =0;
" j/ }2 G- s& d; R( \if(G>255) G=255;) {! r& n! {' i) V, k1 D  H+ `
if(B<0) B =0;. ^' G+ L& X2 H( O
if(B>255) B=255;. {- ^8 F0 @, C- D
*(RGBbuff) =     (BYTE)B;         
9 m0 C/ G5 C; x/ T+ {4 U0 L4 i5 ]2 C*(++RGBbuff) = (BYTE)G;5 D4 m7 F" l, Z# J2 ~! I
*(++RGBbuff) = (BYTE)R;$ p- q/ |, Y: c8 s$ Y) T! l) T3 P
R = (Y1 + 1.14f*V); $ h2 Q6 p6 p+ V, y2 I3 @9 Y
G=(Y1 - 0.39f*U-0.58f*V);   
7 L. V2 Z* H" X4 o8 r4 rB=(Y1 +2.03f*U)   ;
: k% [) e- R* Oif(R<0) R =0;7 Z( {- }+ @1 P6 |" @
if(R>255) R=255;' T3 Y7 a8 O; }& u) s" C9 }3 m
if(G<0) G =0;
- v9 O0 J0 N+ Y' S% K  M% s* Pif(G>255) G=255;4 l" Y2 s- v1 }1 q7 v2 r
if(B<0) B =0;
+ @6 H8 P* L+ m* _1 a+ l+ {if(B>255) B=255;- k7 S# K* Y9 c1 Q7 h0 H
*(++RGBbuff) =     (BYTE)B;          & z8 m  C7 }/ F" `$ u5 _
*(++RGBbuff) = (BYTE)G;
; F7 b6 Q+ z. m' U) v: o*(++RGBbuff) = (BYTE)R;% z1 Q. [0 K" e
++RGBbuff;3 B  S3 d2 y4 x
}
/ |( V8 _' l/ A}
+ f1 ]; P9 Q% e3 \  N  G9 Binline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
, n: y) s' A/ U5 V{
4 a, }9 A5 j+ k; ]  ~4 {& x) m- y% h+ l1 R; V' W; C9 o
// R = Y + 1.403V'6 j. K/ B+ W" a7 {0 k
//G = Y - 0.344U' - 0.714V'
$ R$ _* E1 c. ]( a# L//B = Y + 1.770U'
  s' d: K& a6 o6 O. PBYTE *orgRGBbuff = RGBbuff;
1 u% r' _; t& c: nfor(DWORD count=0;count<dwSize;count+=4)
9 j0 X; ]; Y4 e+ D  c8 b7 v+ c{
. i2 L1 C7 h0 Z//Y0 U0 Y1 V0  a/ ^2 |# b5 x2 B0 x0 Y& W3 V8 D
float Y0 = *YUY2buff;
+ ?* R& ~; T; H3 |! Ifloat U = *(++YUY2buff);- _4 i+ `- [% l% `- q2 n8 K
float Y1 = *(++YUY2buff);9 g" F0 p+ N4 e4 ]6 i, y+ P, b2 y
float V = *(++YUY2buff);
' |! N5 y- x$ r; m* y++YUY2buff;1 z& ]1 \! |* @! k5 u
float R,G,B;
8 X3 o: b* D8 p+ m/ B4 e. ^/ H/ |+ U: k% K9 r: T! f
R = (Y0 + 1.403f*V); 4 ~; p3 z* y3 |7 T' u! v* f
G=(Y0 - 0.344f*U-0.714f*V);   7 k  y3 B' R$ i. X; n
B=(Y0 +1.77f*U); % ~" s: @+ o( n; S; ?6 l# Y0 @( h
if(R<0) R =0;
% p5 P4 |$ u) J( H3 a7 _if(R>255) R=255;
& _! ?! [8 Q9 X) i* _. Z: aif(G<0) G =0;
, }" u! d% R" o) J) yif(G>255) G=255;) S" ~  v, Z$ ^- |% h" d
if(B<0) B =0;7 U7 a: H1 U- E( n2 W% ^+ K. z! Y
if(B>255) B=255;
. f0 g: r! @0 |5 T" p. M*(RGBbuff) =     (BYTE)R;          $ k' |  v$ L; D7 \& Z
*(++RGBbuff) = (BYTE)G;  i: u/ ^: Y1 Z
*(++RGBbuff) = (BYTE)B;5 f' E+ g/ V! a& Q. u! g
R = (Y1 + 1.403f*V);
& m+ h( b  X, X6 T, D7 |  o9 wG=(Y1 - 0.344f*U-0.714f*V);   1 T' v; T- Y3 t9 B' v' b! r
B=(Y1 +1.77f*U);
. }% O* n. f( @: o; U" @if(R<0) R =0;
" {9 n2 O, C2 x8 Y4 ]6 I) v6 Nif(R>255) R=255;
9 Z7 R; q6 c" s9 F8 ^if(G<0) G =0;. h* ~6 m4 O# z" t/ S! O
if(G>255) G=255;+ u: b& o' }8 W9 H2 W" P! V5 O6 g' Y% D
if(B<0) B =0;
/ N6 Y( \+ {) K+ B5 {if(B>255) B=255;' X" G! w% N. k' n/ ~( E
*(++RGBbuff) =     (BYTE)R;         
( R7 y+ P% d2 e# G( c# K6 E*(++RGBbuff) = (BYTE)G;1 U  {4 P8 W8 F
*(++RGBbuff) = (BYTE)B;
: d; a) \. y6 y+ P++RGBbuff;
$ }6 U9 U4 q/ ?/ v% N1 M}
  g2 D+ }9 e# l2 t6 T}1 G/ q; I" w) E* a
inline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
4 m5 J) m' k: m$ V/ G8 Z7 m9 }9 S{
: U+ t' X: y2 I/ ~% H! }/ e# l//B = 1.164(Y - 16)         + 2.018(U - 128)6 o- N: u, ^3 e+ J/ P5 ^  a1 |2 b; d
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
! {8 g) c) P5 l1 ^8 z! P//R = 1.164(Y - 16) + 1.596(V - 128)7 h2 x6 _, {, C4 {" A
BYTE *orgRGBbuff = RGBbuff;
; V" y* h) g2 ?( }7 V% V5 Pfor(DWORD count=0;count<dwSize;count+=4)
0 ~2 M6 b# V/ W% L6 j) n- f& _{0 k0 W1 f2 S5 m! P; J
//Y0 U0 Y1 V0! l" L1 `. K2 D% O
float Y0 = *YUY2buff;3 S, t4 z2 V  g' E8 {
float U = *(++YUY2buff);
) h; l( N$ D$ H6 J% Kfloat Y1 = *(++YUY2buff);
# {* W, B9 [3 a7 q; f+ E1 E2 r: ?float V = *(++YUY2buff);+ D9 V) m; f, ]$ H3 `+ O5 ~
++YUY2buff;+ W% U; P7 Y3 y$ a: I5 u! s
*(RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           
* `- N! X0 d+ L*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   ! V* f0 H  q! r/ o" i# P
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));        + e+ U/ B1 [+ p" M5 M
*(++RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           * a# N( m/ i1 }! ^% _
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   / V! |/ x5 A1 s9 f$ S
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));          ' X8 j# `5 c0 B
++RGBbuff;
2 V+ B/ K1 H  }! J  R
7 G& h0 }3 V) V# v+ y& c2 b6 E5 @' S}
8 Q( b- S% ?  t( h% v1 X}; ~$ L  ]' l* z. u+ m0 D
// http://msdn2.microsoft.com/en-us/library/ms893078.aspx6 j. r( w+ t2 G" n
void VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)  \! u/ W  K7 V( s" [! ?
{
4 E  q" q0 j5 J/ Y//
$ ~+ G" @8 M' y4 G( `% @! b; B//C = Y - 16$ C. U' }7 j! G5 ?5 b& |3 b( A& }
//D = U - 128
  u  W  V5 T3 o7 O0 i' A, Q//E = V - 128
; f' G3 {3 X3 U: J//R = clip(( 298 * C           + 409 * E + 128) >> 8)
# Z1 D$ a: P8 ?/ q1 a, t, e2 B: k6 y8 M//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
+ V  ?0 B: ]7 w% H//B = clip(( 298 * C + 516 * D           + 128) >> 8)0 w1 J; }: J3 }' l) s- @. w
BYTE *orgRGBbuff = RGBbuff;
" j9 s/ N1 z6 Q6 ~9 q8 `" Xfor(DWORD count=0;count<dwSize;count+=4)
0 ?0 [0 u1 h1 _% T$ C( L{
& p/ Z# x: [; c9 m) n. ?8 C//Y0 U0 Y1 V0
# a6 |) |( [, H8 H, M6 Q. jBYTE Y0 = *YUY2buff;
5 A# Z3 x6 n& g% o* MBYTE U = *(++YUY2buff);
0 B1 O' [- _0 |& L8 `3 t* v- d. dBYTE Y1 = *(++YUY2buff);
4 k7 }  t( H- \  I# K- F5 xBYTE V = *(++YUY2buff);9 c3 z3 W+ k; X" U* P& C
++YUY2buff;
' I) u( a: j) |! e7 w1 A' {3 t8 p; ULONG Y,C,D,E;6 w/ G% z- `. `. ~! j9 f) }
BYTE R,G,B;
8 r9 x" r+ A0 e: ^/ j! `2 Q4 p8 M; O& N( @! C- p0 ^+ p
Y = Y0;
3 O+ G+ M  q3 R6 w3 f! M! N, R' b! sC = Y-16;
' S" g( R' i1 [* w. Y5 mD = U-128;
1 X, v: w  |- ]E = V-128;
# @& Y# a" g: r6 OR = clip255(( 298 * C           + 409 * E + 128) >> 8);
) c0 {3 X( ]6 GG = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);8 ^; z4 F- c+ Y* |% t
B = clip255(( 298 * C + 516 * D           + 128) >> 8);
1 _, u: j) D+ C6 J  I+ N*(RGBbuff) =   B;           
, h' U/ J# b3 c1 d9 {*(++RGBbuff) = G;   
& @1 g1 W+ r) m$ B7 s8 P: r( ?% G*(++RGBbuff) = R;        
% [4 _1 ?; x# z& CY = Y1;6 e( J6 v9 |/ M% o- b1 _
C = Y-16;, {4 A- p# _; s; N
D = U-128;
0 G# V7 x, s: j2 VE = V-128;8 B# s8 o8 Q" o  A3 B
R = clip255(( 298 * C           + 409 * E + 128) >> 8);+ @9 c: I" }  _0 f
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);# o- o! W2 e8 F) \# T# k9 h
B = clip255(( 298 * C + 516 * D           + 128) >> 8);
2 {) B& [) v, f  @% Z0 Y*(++RGBbuff) =   B;           1 z% m" s' _( A! D7 D6 t
*(++RGBbuff) = G;   4 q2 x% ?6 M- ^7 I5 F; p( b
*(++RGBbuff) = R;         
' _# N2 v9 l- r% O++RGBbuff;6 Y1 Z% D# b  j2 a$ j3 ^- u

. d4 V0 O3 e4 X' q4 B}5 y) k% D' g$ B. G2 O7 x
}7 h/ f% {$ `: \7 l3 i
BYTE VC4000Graber::clip255(LONG v)
& X5 {7 v1 X- ]9 V- [{- M9 b- t3 r9 e- a" u
if(v<0) v=0;) @' N5 [; O! D$ R
else if(v>255) v=255;
" e4 l8 L9 E( }' L2 q, j8 Preturn (BYTE)v;' N3 k8 I/ J+ }7 f# E( H! w5 u
}
8 i: h( h; v/ ~: L1 ^' A
) r' y1 P. ?4 ?* i本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hardVB/archive/2007/10/18/1831810.aspx! r. G' v4 B/ O' L- `
+ a+ S9 T# t0 b8 ?: ?% {
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-14 14:43 , Processed in 0.018578 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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