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

YUV像素和RGB之间的转换

[复制链接]
发表于 2011-5-30 09:56:44 | 显示全部楼层 |阅读模式
RGB转成YUV(RGB to YUV Conversion)& K! Y; e+ X4 r3 V1 C4 x
Y  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
6 M: ~" M2 a! O( k9 J& W& k0 H, D9 `' rCr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 1283 n6 X& M/ ~$ X. y: x
Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128YUV转成RGB(YUV to RGB Conversion)% O' O6 [# i$ e: Q" O
B = 1.164(Y - 16)                   + 2.018(U - 128)
2 e$ L8 B; `# X6 K1 w4 G$ ]4 EG = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
) u! g8 E* v8 k6 ]4 LR = 1.164(Y - 16) + 1.596(V - 128)2 x( v4 v& v1 n4 }; e0 S/ m
R, G, B, Y , Cr, Cb的取值范围都是[0,255].) x5 }1 x! |- E9 L4 I

- {1 J$ ]$ T2 R- X* c原文:http://www.rosoo.net/a/200604/6049.html0 A7 i2 d# Y5 F+ n- k3 S, K# y. ^
 楼主| 发表于 2011-5-30 17:08:39 | 显示全部楼层

YUY2视频转化RGB格式

//YUY2视频转化RGB格式 by hardy 2007-10-17
+ _+ D( u8 `0 Y- G1 D5 k; U//http://www.fourcc.org/fccyvrgb.php
$ H5 E. ~/ T8 f* r( h" K2 U; Zinline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)' W+ {9 U9 \7 ]$ D  u/ ~! H3 @
{9 p7 e$ z: Z$ G# c/ @
//B = 1.164(Y - 16)         + 2.018(U - 128)8 n$ o( @% W* `4 V; C6 ]' L: [' o) R
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
, w5 {# E% D8 z4 V1 I& t/ h+ T//R = 1.164(Y - 16) + 1.596(V - 128)2 m1 w; K& |$ G1 {3 J6 U6 q8 @
BYTE *orgRGBbuff = RGBbuff;
) Q- e4 }5 F) A: o+ e) |for(DWORD count=0;count<dwSize;count+=4)  Z5 Y/ X- S' w- R
{# B4 Z8 o" [9 F- e2 n+ B/ g  H
//Y0 U0 Y1 V0& r% i/ P& e0 e, z, u9 }
float Y0 = *YUY2buff;
+ |% h  g/ @- Ifloat U = *(++YUY2buff);! B% M1 k; k" r
float Y1 = *(++YUY2buff);# f; g- |* `+ y7 b
float V = *(++YUY2buff);
+ Q$ W* j+ g1 V3 t. i0 Q++YUY2buff;( q$ s6 Q6 i/ F) Q
*(RGBbuff) =   (BYTE)(Y0 + (1.370705 * (V-128)));           
2 Q# @/ L& `. S+ Z) @( F*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
  v# o( N% o+ ~0 {) N* g*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));        
2 {# ~! J9 G3 O, h! C- M' ]*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));           1 Y; }0 H" n& r) B9 d
*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   8 o* q' q2 z$ g: ^7 E
*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));         # d- @: c: a6 q
++RGBbuff;
. p' @0 t  e  Q& x0 N! m}7 R/ ^+ t3 m% c9 E- L
}
/ G4 S* E$ O* l+ J+ i" Q/ Y! Iinline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)3 ]0 s! [# l- F8 Y( H, o! ~& U* ^
{
7 U4 H  F; l& n* E//R = Y + 1.14V
; R4 w) R7 |6 F2 @, T9 W2 f//G = Y - 0.39U - 0.58V, A2 E0 ]- _! F+ V
//B = Y + 2.03U
( K0 z- `* @% w8 A// R = Y + 1.403V'
7 ~- v6 t& a! {& I//G = Y - 0.344U' - 0.714V'
4 ]" m0 X0 e- S1 s8 _6 w/ n//B = Y + 1.770U'! F8 p+ [' y$ ]- u9 p4 D
BYTE *orgRGBbuff = RGBbuff;; n9 m3 \' t% L$ o
for(DWORD count=0;count<dwSize;count+=4)$ U8 H/ Z5 Q# U7 N% V' g+ _$ z
{; d9 m9 q3 L. p( N" b7 J
//Y0 U0 Y1 V0
8 r* U9 J5 F& N, R5 g) t: Mfloat Y0 = *YUY2buff;0 t# }3 c, E7 {+ T. V. b  f
float U = *(++YUY2buff);
: C9 h: A' z9 Q& p: r+ \& r# p1 `float Y1 = *(++YUY2buff);$ |2 l. P/ _* z  I* O9 e  t2 }# m
float V = *(++YUY2buff);
* C8 S' }1 z4 G& l9 k7 J% ]++YUY2buff;( u) W' M7 ?7 _3 [8 l7 }
float R,G,B;
. @. |7 H# m5 S8 d4 M3 |( L' I. ~  P
R = (Y0 + 1.14f*V);
: H; x! ^" Y1 e, o& nG=(Y0 - 0.39f*U-0.58f*V);   
% ?1 D4 D% z/ m1 m! T; dB=(Y0 +2.03f*U); 4 }, V* j  Y0 n) Y, L% L% i: n! l$ g
if(R<0) R =0;
" g0 Y# P4 ~. F  O' z- [- y% L# ]% mif(R>255) R=255;
6 f% f/ N( a, Z7 O8 z+ sif(G<0) G =0;& m% k  ?  L: _/ t
if(G>255) G=255;
  I8 N1 S, L: Tif(B<0) B =0;: z5 C* H$ Q( N+ I1 ^
if(B>255) B=255;
6 M6 b$ J' q# ~  h7 x9 v*(RGBbuff) =     (BYTE)B;         
/ d; }  S% C$ P1 \9 M  i*(++RGBbuff) = (BYTE)G;2 M5 I. Q; s, {4 A, W2 _
*(++RGBbuff) = (BYTE)R;
5 z6 C" h; M+ G2 N( p: I# XR = (Y1 + 1.14f*V);
, M' S, z" M( e- [/ U9 {& oG=(Y1 - 0.39f*U-0.58f*V);   3 A- [: j5 ?$ M( q1 Z9 B
B=(Y1 +2.03f*U)   ; 5 z+ U" t' r/ v8 c
if(R<0) R =0;, H( O) i% L( @' y4 K) p8 M
if(R>255) R=255;
& B: r1 B$ O1 w8 l; h4 Z/ ]1 uif(G<0) G =0;8 J' W# s& C8 |6 c
if(G>255) G=255;" J& f8 c, {' ]# @, g
if(B<0) B =0;
" K' L0 L) L% D' P; Xif(B>255) B=255;% T6 h( w2 I) ~( v- _3 f- l
*(++RGBbuff) =     (BYTE)B;          & I+ n* f/ y4 C; K, V( U
*(++RGBbuff) = (BYTE)G;
! H: Q; D% D3 Y: O4 n*(++RGBbuff) = (BYTE)R;
- P0 B0 r5 l4 H5 W3 n++RGBbuff;# K/ \" O4 O/ t. k+ i2 F1 n
}8 e+ f4 C/ k0 b- m2 Z% x
}
6 f% @6 ]* f  G1 U1 uinline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize), r, B" p1 g7 V8 D
{
& M! ~8 {2 A% c% e1 {/ M, S) V
: K2 t3 R5 K" ?1 |5 o; @- C// R = Y + 1.403V'
$ Y+ d7 x- _; G& I//G = Y - 0.344U' - 0.714V'
  X9 Y5 |0 A* j& S0 d//B = Y + 1.770U'
) N8 X1 x* J; j$ b1 G  ABYTE *orgRGBbuff = RGBbuff;
- C1 I$ l+ ]. f! d6 ^4 M- Q5 q9 a' ifor(DWORD count=0;count<dwSize;count+=4)4 Z& k; s# I, f* x
{
. c; j1 f- O$ S0 v3 ]//Y0 U0 Y1 V0/ y7 Z, r1 x: I
float Y0 = *YUY2buff;
3 z0 S, _* a+ @# b" r5 r% S5 Qfloat U = *(++YUY2buff);
+ H+ L  f! \( m' Jfloat Y1 = *(++YUY2buff);: |2 v/ ~  W, l! M# Q1 V* X0 S
float V = *(++YUY2buff);' z0 V0 Z% u* f- I6 s" i; X6 Z# l
++YUY2buff;2 D1 {# n& D5 f; f3 n
float R,G,B;3 v& K2 n: P9 M/ L
+ u* s7 O8 n! I5 i/ U
R = (Y0 + 1.403f*V);
6 B2 a! C: [! @G=(Y0 - 0.344f*U-0.714f*V);   * g- S8 }4 e5 I8 l
B=(Y0 +1.77f*U);
- `* n  A6 K# `if(R<0) R =0;) ]/ U0 I0 F; y' v7 [
if(R>255) R=255;/ [) m) x( W" t3 H7 Z: K
if(G<0) G =0;7 A. m! j3 ^' ^
if(G>255) G=255;
* s7 S3 K8 A2 r! I. [* ^, qif(B<0) B =0;0 e" G  I2 d9 ]# w4 _
if(B>255) B=255;! N5 \" Y& Z( G# j$ p5 c% l1 K
*(RGBbuff) =     (BYTE)R;         
( @) Z3 ^; L. r8 q/ G9 [% m*(++RGBbuff) = (BYTE)G;
) R+ T( o. q! K/ }! h' @*(++RGBbuff) = (BYTE)B;+ V/ S- S/ R  K% H
R = (Y1 + 1.403f*V);
/ |' p. `' Q  p" g- o  u2 n, fG=(Y1 - 0.344f*U-0.714f*V);   , e9 Q4 A9 S# e9 J2 P
B=(Y1 +1.77f*U); " x" s2 W0 `( i1 j! \5 @+ F0 D
if(R<0) R =0;
0 I- h4 x9 I7 K; kif(R>255) R=255;* Y8 x' q- F! y/ z
if(G<0) G =0;* R* T9 h' T* c% h7 `2 x  U% \
if(G>255) G=255;! E' x3 m2 j# |1 E2 x% T2 \1 N0 @" g
if(B<0) B =0;
0 \& W# C( h' o$ L& H& hif(B>255) B=255;
+ l; H3 M3 b+ c6 Y: }; s) y  z*(++RGBbuff) =     (BYTE)R;         
1 M* L/ A) y; r; x4 ^3 P6 N, X4 |*(++RGBbuff) = (BYTE)G;" \- O) O; ?" ^# p1 Z- `. N
*(++RGBbuff) = (BYTE)B;  m* i: L! g/ i# H  {2 l6 a
++RGBbuff;. `1 b. t4 G) q0 ]4 p) `5 Y/ [# d
}/ z7 k2 Y; o. [" c% Q6 j0 j% V
}
+ G5 k3 m* L4 }6 R+ xinline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
" R' E) I1 ~  m6 T3 c) ^{
. N( u9 J7 Z5 s' _! R8 ^& H. `//B = 1.164(Y - 16)         + 2.018(U - 128)% u  W/ n. y& p. V3 k3 g" x
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
7 ~7 u' ~# F6 N5 w$ C0 B- T$ y//R = 1.164(Y - 16) + 1.596(V - 128); X$ l. b% H9 e  T7 H1 R' k$ T( t# ?
BYTE *orgRGBbuff = RGBbuff;, l, V% C0 h" {9 y0 r# V
for(DWORD count=0;count<dwSize;count+=4)
# u! ^' |( ^1 k{
1 F( p5 _/ v  h$ E# V- f8 |/ Y$ Q//Y0 U0 Y1 V0
$ Y3 c' S. G: E; o5 }+ |float Y0 = *YUY2buff;& d5 J0 G+ @" d4 r; b3 a$ q
float U = *(++YUY2buff);
6 v9 t8 m5 r+ \float Y1 = *(++YUY2buff);; l/ ~8 y; |1 r$ d2 x/ x+ Y; e$ C
float V = *(++YUY2buff);
$ ~" @8 i  J; z' m- R++YUY2buff;" w, k1 K* g- w% R: W; k
*(RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           
" F1 w* z7 D7 X( n' r; m*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   4 `/ q- _9 O! o7 s' k
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));        
& ~- h$ `/ J, g5 \* D*(++RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           ( t/ v: n: m  N8 E
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   3 H. v1 l7 N: M  L0 [8 T0 d* C! g
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));         
( ^) U6 z/ Y5 i) }++RGBbuff;" D, u$ @% Y5 z: N
* ?4 E$ N: R. C2 l5 E# a, M/ Z0 z
}2 x- F+ J6 P+ X9 n: t( E+ }
}
: p& u1 g. t# s  X& y3 y// http://msdn2.microsoft.com/en-us/library/ms893078.aspx
$ Q) M& I! v: ?- c, p* v2 _void VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
5 l+ z3 m2 {8 z0 F& E) {{5 O; w# C9 s6 e( W/ Q' p7 Y
//
9 h8 f9 N) h# r4 K6 m4 O: o//C = Y - 16) X2 ?# V% q. H& {0 n+ Q
//D = U - 128: c' @5 _& ^; A" l! g
//E = V - 128& I: r8 A2 {, l1 L! M( `
//R = clip(( 298 * C           + 409 * E + 128) >> 8)
7 H- j$ X0 r8 s//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)0 ?* g+ o1 e$ G( O
//B = clip(( 298 * C + 516 * D           + 128) >> 8)
% h; ]$ `4 u6 `& l3 ^. u- {+ WBYTE *orgRGBbuff = RGBbuff;0 u' F# [* {& u: k: ?
for(DWORD count=0;count<dwSize;count+=4)
+ i  D! y3 V" l1 D{9 J& [' t5 C- H7 I
//Y0 U0 Y1 V0
# `  h( ^. M6 t0 R( yBYTE Y0 = *YUY2buff;1 g" k  \0 Q, R# @# ^3 R
BYTE U = *(++YUY2buff);
% P$ e0 T& M5 f) U" `2 TBYTE Y1 = *(++YUY2buff);
- k! E5 T9 q+ F! ?5 [, gBYTE V = *(++YUY2buff);. w9 |; B9 _9 e, }" ]! V0 _# O; z% Y
++YUY2buff;/ ~- I4 S; P* }' k0 {
LONG Y,C,D,E;
) V$ v: g6 x* jBYTE R,G,B;
/ W! T% t( G2 U3 Q/ k  P8 {
5 B. W( D, c# m6 ?: u, K8 qY = Y0;
4 Y0 U' N6 T( R0 i" qC = Y-16;2 r+ v0 I' B! Q' ^+ b7 S
D = U-128;
* W' P; x1 I: e6 FE = V-128;
: x, E2 i& v# D9 O3 j% A% ?R = clip255(( 298 * C           + 409 * E + 128) >> 8);4 n  u  v- M3 g! U' B% W6 d/ p7 G: v
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);! J) }3 B/ Q5 e9 a& J7 W
B = clip255(( 298 * C + 516 * D           + 128) >> 8);
0 e" W) q6 p8 \1 n6 \# q*(RGBbuff) =   B;           ' G1 W: {: t2 o  T
*(++RGBbuff) = G;   
, R2 p: g- D* n9 L" p, D*(++RGBbuff) = R;        1 g/ S+ J: ~5 I# B! _
Y = Y1;
1 k5 Z! z3 f! O, H5 j; ]C = Y-16;
  Z# K0 W+ p* ED = U-128;+ z" v9 p. C4 Z  c6 ~; [. R$ J
E = V-128;' J0 x% z: N, B  b
R = clip255(( 298 * C           + 409 * E + 128) >> 8);4 q8 o% `1 t7 C% j! z% x7 D  ^
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);; d/ |' I" v6 H5 ]. j% Q
B = clip255(( 298 * C + 516 * D           + 128) >> 8);9 ]( Z' _9 [* B: N* t. ^3 ?1 S
*(++RGBbuff) =   B;           2 n) g2 t+ }& q/ c/ n
*(++RGBbuff) = G;   8 D) P, s# @5 R0 Q' R" v
*(++RGBbuff) = R;         % O2 \* |+ A$ F
++RGBbuff;' ~" ^; q* R- F! f5 N& U3 M

% r9 A2 u8 _) A0 j: L& X}
. h( `1 G( A* X, f& L3 [: K}
* l4 R5 |7 U& k, `) I$ m2 y! J  GBYTE VC4000Graber::clip255(LONG v)- f' E# C: w. s* j2 p$ |; e
{8 J: W" t3 c- I1 p7 A( K5 P1 E
if(v<0) v=0;7 G) S- @$ ]8 g9 s
else if(v>255) v=255;
$ ^1 M0 ^$ l0 ^6 d# d! preturn (BYTE)v;$ o2 C% S$ ]3 N  s5 O, f- b
}2 @  p' K- k3 Z' K7 o

" Q' }& Z! w& y' i本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hardVB/archive/2007/10/18/1831810.aspx9 g' _/ _3 a; U+ \6 L
3 y8 |# K& S& @
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-19 03:31 , Processed in 0.016909 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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