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

YUV像素和RGB之间的转换

[复制链接]
发表于 2011-5-30 09:56:44 | 显示全部楼层 |阅读模式
RGB转成YUV(RGB to YUV Conversion)
; F* U) j, Q) |$ DY  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 161 _- x6 a8 _" ]
Cr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
7 U) n) S* j+ h( V. H. JCb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128YUV转成RGB(YUV to RGB Conversion)
5 f3 A3 k' a3 U' }1 W, WB = 1.164(Y - 16)                   + 2.018(U - 128)1 X6 S5 S; S% P# Q. n# I
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)0 Y( V* \9 K4 i" B' l. S
R = 1.164(Y - 16) + 1.596(V - 128)" A% A, Q- b# _0 m. Q
R, G, B, Y , Cr, Cb的取值范围都是[0,255]., _5 y- V7 I* h
: ?7 `' C) I: a6 B! M% K
原文:http://www.rosoo.net/a/200604/6049.html
& W3 H' `( ]3 t7 c( h0 Q* }
 楼主| 发表于 2011-5-30 17:08:39 | 显示全部楼层

YUY2视频转化RGB格式

//YUY2视频转化RGB格式 by hardy 2007-10-17' V/ `; Y  K! D* P
//http://www.fourcc.org/fccyvrgb.php; v3 i' j. O1 J( T3 F9 a8 @
inline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
+ S! R9 p+ @! C- i% L" K{
$ X" G) Y2 v4 ^; B  v6 \4 m6 ]//B = 1.164(Y - 16)         + 2.018(U - 128)- [# j0 @  k& h" w) Q- H" `. g, M
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128). J0 X8 s7 b, }  k
//R = 1.164(Y - 16) + 1.596(V - 128)
2 }/ p( g; T: U6 MBYTE *orgRGBbuff = RGBbuff;
  Z9 @) t* o- j6 Gfor(DWORD count=0;count<dwSize;count+=4)9 C) t( W5 x. [7 v% \# Z
{8 X4 t8 x6 S# E9 n
//Y0 U0 Y1 V0: Q4 Q0 n9 y- @$ z9 {
float Y0 = *YUY2buff;+ Z3 w5 X4 J. I: H
float U = *(++YUY2buff);
, O0 s) v/ ~" w* j2 ^, Efloat Y1 = *(++YUY2buff);9 {; K3 e6 H) \
float V = *(++YUY2buff);
( y' U9 P. j, p: r1 G++YUY2buff;6 m* y$ L5 l7 |( N# g5 e
*(RGBbuff) =   (BYTE)(Y0 + (1.370705 * (V-128)));           
. ~; @" S! x/ P9 q$ K*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   0 n: e5 X  W3 v% f/ ~% @# t# c
*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));        6 G1 S0 M0 Y: E7 R9 U
*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));           2 I) q: [9 ^" l8 U
*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   : P, h- Q; e) ], `/ L4 \  T% A( q
*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));         , b% x" f/ e) `$ I; ^9 m) }( `2 m
++RGBbuff;
4 E; a; Y3 _) Y6 t5 @! H}
/ f' x: d5 f) U}) D, A. Z- h1 m: i2 n- K
inline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
9 B9 w2 E( G; I6 j7 u8 [0 g{! u5 U! d: H) t
//R = Y + 1.14V
5 x. v( s9 Q7 ^3 _$ [//G = Y - 0.39U - 0.58V, N" ?5 |/ B9 }& {
//B = Y + 2.03U
, R! F1 @9 C- Z4 _/ b& X( E+ d// R = Y + 1.403V'6 P! I/ G, ^) y' ?) j1 J: `7 m
//G = Y - 0.344U' - 0.714V'3 J. L' [! |  v8 f4 f  v# }
//B = Y + 1.770U'  P/ S/ S, \% Y$ ?: @) q
BYTE *orgRGBbuff = RGBbuff;
7 B# x! y* L1 ?7 yfor(DWORD count=0;count<dwSize;count+=4)! W' ?+ P) O' ~2 d' N1 h
{
5 N2 p, `8 @. Y//Y0 U0 Y1 V0
4 b0 V6 d5 X6 H$ K6 i- x- S/ y9 |. m5 Dfloat Y0 = *YUY2buff;' I0 S4 b$ B' C0 b- d. K5 l+ H9 M8 q. F
float U = *(++YUY2buff);
+ \2 j4 d# e7 \, B) a/ sfloat Y1 = *(++YUY2buff);
8 G1 m5 d+ G3 W* V$ o! z$ U. nfloat V = *(++YUY2buff);
, F  h, n7 F, M++YUY2buff;2 i$ J+ B4 W& r) O- M
float R,G,B;
* D! e4 X; O0 a0 D$ A5 m! r! [' v
. j2 o+ _- o" n) p. FR = (Y0 + 1.14f*V); & J5 Z; Y: E0 M) ?# l: J9 @
G=(Y0 - 0.39f*U-0.58f*V);   + e5 n: c! w8 t) f( Q
B=(Y0 +2.03f*U); $ r: S+ {# S3 U  L/ u2 a) W) n
if(R<0) R =0;9 Q5 @% t$ a3 R- A$ r( r" e' p" a  }
if(R>255) R=255;) ^6 j0 B- Y6 [* W
if(G<0) G =0;
$ P' k+ T1 Q# d& ]if(G>255) G=255;
! ]' e# B, a# t, B7 J. mif(B<0) B =0;7 s, b6 |" x( b2 C% W7 g' E
if(B>255) B=255;4 q3 O0 N6 Z( ~! d# W
*(RGBbuff) =     (BYTE)B;         
- N9 h$ ^- G6 N) x0 p# U0 N2 }*(++RGBbuff) = (BYTE)G;
# [; C* Z$ ?0 t2 h' V*(++RGBbuff) = (BYTE)R;" @0 i' d& e* J! g1 `' v
R = (Y1 + 1.14f*V); $ C1 G2 ?/ t* ]- A
G=(Y1 - 0.39f*U-0.58f*V);   
( v. v' c) m& I5 E( x% EB=(Y1 +2.03f*U)   ;
3 @* f7 y4 |. ~: nif(R<0) R =0;2 D  H; Z4 @' l" N" ?2 \; c: p
if(R>255) R=255;
: K! G  _. V" W: @% x8 u8 K! wif(G<0) G =0;
, L) Q5 ~# u) V3 R/ Oif(G>255) G=255;
- u- ~& `! ?$ p& d; T" nif(B<0) B =0;1 d) D5 w  T* {& h$ W; C3 F: V
if(B>255) B=255;
  q1 v- `2 T1 F3 q*(++RGBbuff) =     (BYTE)B;         
/ @0 _; E9 g7 E7 {*(++RGBbuff) = (BYTE)G;
) ^8 e+ q7 ?0 J*(++RGBbuff) = (BYTE)R;
# N) [! Q1 m9 F. S& W0 Z. q6 I++RGBbuff;
8 I0 ?4 U7 T/ p" X}
3 H* t* G; M' D& @% H}
4 Y% O# \* S! j* y% Zinline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)- J" I% T) i; G3 R0 K
{3 i. I- g' Y5 a- a5 M
# ?* Q+ Y8 Z/ A1 x. T
// R = Y + 1.403V'% j6 v$ `( F: X
//G = Y - 0.344U' - 0.714V'
' v0 ^+ E% o" k6 E* z; z//B = Y + 1.770U'
0 d! S7 t& }8 K' |) E, LBYTE *orgRGBbuff = RGBbuff;
, k; }) o2 M) Afor(DWORD count=0;count<dwSize;count+=4): w+ N$ \- D  l' O
{
$ y: e! C: B4 ]% ^% Q, E//Y0 U0 Y1 V0
% d+ J. U  l  C2 Z/ \* K& Hfloat Y0 = *YUY2buff;
+ s4 F& Z; A% u8 Yfloat U = *(++YUY2buff);1 q4 V7 ?  G; s) f( ]  j: H
float Y1 = *(++YUY2buff);" K/ z3 j- Q0 _# s$ _7 [2 R! D" w
float V = *(++YUY2buff);* Z2 o( n! a" q  f2 y9 |7 w3 _$ ~8 K
++YUY2buff;, G2 K# ^, D* |! F; r0 }" P% p; j
float R,G,B;/ k3 k! n8 T: a3 z; a

4 Q$ ^# d$ c+ _5 I' x% D( U/ cR = (Y0 + 1.403f*V); $ s" {; `3 l1 O! R
G=(Y0 - 0.344f*U-0.714f*V);   
( [- s" [: L1 o* i  o# c' uB=(Y0 +1.77f*U); 3 Z, k. Y  `! q+ R6 K
if(R<0) R =0;
; P/ V$ N6 Z( R1 v1 M0 hif(R>255) R=255;
0 r: x3 v& H6 N) sif(G<0) G =0;; P3 N7 u) G- e% Y' l5 s5 n
if(G>255) G=255;; y6 C: f( B& O8 A% Z# {( O% u
if(B<0) B =0;
/ J% }' f: i( a. Gif(B>255) B=255;
. R% u  Q& {4 T; R8 z*(RGBbuff) =     (BYTE)R;         
1 I  W7 ]' R7 M; t) _*(++RGBbuff) = (BYTE)G;
& t: N4 @! A- Z, }* e*(++RGBbuff) = (BYTE)B;
1 p& k) I# O. x" o5 sR = (Y1 + 1.403f*V); ! Z% J% {3 c( m
G=(Y1 - 0.344f*U-0.714f*V);   ; h& s' Q# q0 y' s1 j
B=(Y1 +1.77f*U); 2 {. f1 F) h, I
if(R<0) R =0;
/ g6 q  C+ l. z5 u* Pif(R>255) R=255;! {7 w' z* S0 r
if(G<0) G =0;& b3 X0 _# W# W
if(G>255) G=255;: `7 D0 @/ K$ y4 v! m0 }  g# r8 S8 `3 F
if(B<0) B =0;
; `2 u, E! G" l- t1 I  s9 Sif(B>255) B=255;
  h2 a/ e) [$ y: U5 X# s*(++RGBbuff) =     (BYTE)R;          * @' x( r1 P) ]) ~: I
*(++RGBbuff) = (BYTE)G;
+ j0 B, Y2 y; I( |7 u4 [+ L5 Y*(++RGBbuff) = (BYTE)B;
, u9 n) B, L. A4 x: y4 q9 b  K1 y, j++RGBbuff;5 x0 E' s* {& Y1 s
}
1 g9 I9 O+ F9 R4 i: ]}! K1 G1 g1 y1 n: H
inline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)$ [. i. e8 W, n' V
{
7 B3 \# a; r3 q# p0 X//B = 1.164(Y - 16)         + 2.018(U - 128)+ K3 O- m. a% y4 I) R0 t7 _! W
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
1 z2 n, Y2 k. B1 f! K! E//R = 1.164(Y - 16) + 1.596(V - 128)+ E- Z# M% c) H: Z/ E% G
BYTE *orgRGBbuff = RGBbuff;
; l+ |+ ^2 \2 l1 T3 z, Qfor(DWORD count=0;count<dwSize;count+=4)2 A4 }; r6 V0 Z- n4 W, A
{4 G" m8 N9 [6 l" a0 [' ^
//Y0 U0 Y1 V0
5 i8 F; f# i, F/ [, A, \float Y0 = *YUY2buff;9 ?. N1 r# W( O8 P
float U = *(++YUY2buff);/ m1 P* S5 N" H2 M# Q
float Y1 = *(++YUY2buff);
' a$ m; D! k3 D/ bfloat V = *(++YUY2buff);4 K: Q9 |& x4 y# f* j
++YUY2buff;
$ \1 u$ J' t$ W$ a*(RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           : d* A2 B7 d4 B8 o5 A) y
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   5 D2 @; T  q$ `
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));        
! [& k: \2 K( l8 R9 z*(++RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           2 M6 {! z3 p9 H& h. C9 w# B
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   
1 B3 C9 O) w: n3 x*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));         
1 O9 _% s* u6 N++RGBbuff;
8 Y$ z6 U: y# `6 [& d( f
1 V6 \0 L+ u/ s0 C+ f9 {- J. q! C}
' F4 e9 ], ^. [$ ]( [}& @/ t; X. a: A# W: |" c
// http://msdn2.microsoft.com/en-us/library/ms893078.aspx
7 |( E  B) `# m7 |; U1 ^! b! Q7 Ovoid VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
2 h5 B- a2 z  C) w8 f/ U$ q) w{
% k, A7 D5 B: U3 x4 ~5 ^//
( e: Q0 l! w8 Z" K2 K  _8 E6 ~//C = Y - 16& S7 ?5 ~( ~* f* y& q( R
//D = U - 128! `. J0 ]' v3 `& Q2 R
//E = V - 128) S" s/ O0 E! J9 J( x
//R = clip(( 298 * C           + 409 * E + 128) >> 8)
& _) C' k" _+ d' G! l4 `) L//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
% |! g* a) o8 O# \//B = clip(( 298 * C + 516 * D           + 128) >> 8)
0 X( p, j2 N$ J9 k: HBYTE *orgRGBbuff = RGBbuff;
6 E' k+ a0 c4 M8 J5 }for(DWORD count=0;count<dwSize;count+=4)
2 {6 t9 D! @& _% K{
9 l3 m% @3 [' I9 @//Y0 U0 Y1 V0
/ w. x* g. k" @  n3 u" c( l4 c" SBYTE Y0 = *YUY2buff;: H+ H6 A" Q; [9 n! b
BYTE U = *(++YUY2buff);
' H- z. F7 z6 D4 u8 S1 E# ^' q# Q2 DBYTE Y1 = *(++YUY2buff);8 B$ h- @1 S% c  ]
BYTE V = *(++YUY2buff);
3 ^( Q" H+ q* ]9 `* e2 _++YUY2buff;
, _+ C/ X" `) PLONG Y,C,D,E;
2 N# A6 h+ c7 HBYTE R,G,B;2 U$ L& @- g, }8 M- m( y# y6 ?
& ^) ]9 I5 `7 ~+ |* c% @! g3 V
Y = Y0;
* Z4 j' Y6 p* i( Q- u- `% |( X9 RC = Y-16;7 a% F. n2 r; v% O5 R& X9 \4 n( A( w
D = U-128;$ i1 J8 y- J- _2 s" g/ w
E = V-128;
1 B, V9 M+ `+ \' m" PR = clip255(( 298 * C           + 409 * E + 128) >> 8);
' W9 q3 @/ v  m( WG = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);& ]! w' E% y& o* e
B = clip255(( 298 * C + 516 * D           + 128) >> 8);
) Y/ [8 e3 m6 ]9 h8 P*(RGBbuff) =   B;           8 Q5 @8 O" S! ]& P3 y8 q  ?
*(++RGBbuff) = G;   3 E2 o3 s6 ~* v/ Z! P4 R5 O
*(++RGBbuff) = R;        
6 E; `% l3 c; EY = Y1;
, w, M* a7 Q! n* `5 E; tC = Y-16;' c" m3 j1 }1 E( {
D = U-128;! T) j( B; [1 Q+ e
E = V-128;
& K! G3 t; ~! {+ rR = clip255(( 298 * C           + 409 * E + 128) >> 8);% B. T' i* f: W% N! D3 K
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);) p7 e1 G  P, ?3 Q; E: c4 h, _# N" x
B = clip255(( 298 * C + 516 * D           + 128) >> 8);7 }- y, B" I6 r, X" E' T7 w
*(++RGBbuff) =   B;           
" Y2 N# O' o8 b/ u*(++RGBbuff) = G;   
1 X. l9 m- S+ x9 S6 Y, W*(++RGBbuff) = R;         
+ A- {4 t* Y  U  q5 c++RGBbuff;
' d/ S% E* @: |0 u/ {# r1 D9 F) H1 R* j/ j8 P
}% J3 G" `8 {* t9 g
}7 _/ V2 l  ~) k% ^# i+ o$ M
BYTE VC4000Graber::clip255(LONG v). P. \) A  e& c$ Z" K/ v2 M4 n
{; \) r! J0 Z( I2 `5 |% K
if(v<0) v=0;+ z* p" X# c9 p) k( q# ^6 l
else if(v>255) v=255;! J6 x$ [) h3 w- A9 `
return (BYTE)v;
- n3 J4 `* f/ j+ b6 u}! c. {' a8 d+ v. ^! G9 y
, u7 j2 m7 b( b' p/ C
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hardVB/archive/2007/10/18/1831810.aspx
) a; t- D5 V* H$ I' h' X" p$ f6 Z/ n
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-2 07:38 , Processed in 0.020248 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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