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

YUV像素和RGB之间的转换

[复制链接]
发表于 2011-5-30 09:56:44 | 显示全部楼层 |阅读模式
RGB转成YUV(RGB to YUV Conversion)7 x9 [" I' G! n+ r& b* \
Y  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
! ?* U( r& ^! a- P1 J. A6 O3 ?Cr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128- j% g/ i% M9 e: _; B' D
Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128YUV转成RGB(YUV to RGB Conversion)
5 k7 j7 ~) X% }# m, ?" mB = 1.164(Y - 16)                   + 2.018(U - 128)
/ E4 v! T  {/ q# }% zG = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)- m, {* X2 y7 R  b% `, `3 V' V
R = 1.164(Y - 16) + 1.596(V - 128)
: p- z0 p5 e) G: bR, G, B, Y , Cr, Cb的取值范围都是[0,255].. j0 |! B' L! Y) s4 S

& g* X0 r' P  L原文:http://www.rosoo.net/a/200604/6049.html5 I$ Z8 K4 u4 a1 E% }/ r
 楼主| 发表于 2011-5-30 17:08:39 | 显示全部楼层

YUY2视频转化RGB格式

//YUY2视频转化RGB格式 by hardy 2007-10-17
* r' _6 N9 b) M" o0 ]& L3 S//http://www.fourcc.org/fccyvrgb.php' Z( O( g+ r1 ~0 \7 ~7 f
inline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
: Q' k2 A7 |) }6 ~- n! p' h+ _2 I{
) t/ q0 T- [; a1 E//B = 1.164(Y - 16)         + 2.018(U - 128)
2 O: h# x& F9 t, z6 O( Q) M//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)- F2 U+ M- O5 |7 Q2 n& z
//R = 1.164(Y - 16) + 1.596(V - 128)
. S7 x, m5 z& S. _BYTE *orgRGBbuff = RGBbuff;
1 J. x9 }( a, ^- C% i8 Q0 @for(DWORD count=0;count<dwSize;count+=4)' r9 o/ y. H0 J2 B$ R5 _8 e: \* x4 o. I" g
{% S! G2 w# O- V3 i* M
//Y0 U0 Y1 V0
* I0 ?' b( m( P) B8 gfloat Y0 = *YUY2buff;
' k. m  l$ P) i! K. _7 o+ R9 Dfloat U = *(++YUY2buff);! O& W8 s' N7 V' ]! P. a# |
float Y1 = *(++YUY2buff);
) u" |2 _2 o7 B# ?$ Q: ?2 t( sfloat V = *(++YUY2buff);( |; q9 |  m2 T" L
++YUY2buff;
, x$ g( |# `$ G* J% w% o& A*(RGBbuff) =   (BYTE)(Y0 + (1.370705 * (V-128)));             ~+ T' ]4 Q+ F  u$ H! F
*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   ' U. Y/ Z( d! m' e- p5 }
*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));        
; i$ l; e$ u- C0 `7 j*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));           & z" S  s4 R2 `4 }+ Y, Y
*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
6 x" Z% @$ d9 w9 r; P*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));         4 ?$ x/ N7 _# v! N, s  y$ T. K
++RGBbuff;4 P2 L4 q0 \0 [# N
}4 n3 t2 y, p* M3 t, \2 B
}! G: l/ y! ?) ^0 f
inline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)+ y5 e2 T5 G  X/ A; U6 V2 c
{
" M$ @( V3 j* L. A8 t//R = Y + 1.14V' l9 k  L, S3 [) c
//G = Y - 0.39U - 0.58V: r. I. ?* c! b  U2 R* r: d# r
//B = Y + 2.03U. C% C4 b& O' A9 |$ Y+ ~9 j
// R = Y + 1.403V'0 j/ A1 T* l* o! L/ w
//G = Y - 0.344U' - 0.714V'9 i; m$ O2 e9 L; I
//B = Y + 1.770U'
. [& }4 u9 b5 p* o3 L& a5 Q5 cBYTE *orgRGBbuff = RGBbuff;* y" E7 |$ C2 t0 v
for(DWORD count=0;count<dwSize;count+=4)
' M; q# |' f! Z; j7 T  G, d{
; Q" y- k% G" W//Y0 U0 Y1 V0
6 O2 U8 G: y' m/ p4 K, d/ q# W4 S! qfloat Y0 = *YUY2buff;
6 ?8 p, m2 B' y# c0 ~float U = *(++YUY2buff);
; u  h0 U0 @$ c0 V7 L; e9 cfloat Y1 = *(++YUY2buff);( |4 G8 y) n! N* x. ~# i$ z
float V = *(++YUY2buff);
' w% r0 d& R* r/ {4 y++YUY2buff;( O- y0 \! A3 L* ]) Y7 C% f7 Y
float R,G,B;
3 H+ m8 d! M, A; C7 k; [6 b8 Y+ t  R$ r, \/ i5 c
R = (Y0 + 1.14f*V); " b, i. U  {4 P' y$ d6 @# v
G=(Y0 - 0.39f*U-0.58f*V);   
8 @5 ?8 F; A7 J! H) c4 PB=(Y0 +2.03f*U);
5 R2 @" [6 U& c, a& Xif(R<0) R =0;, @# v' G0 b  b( s/ F
if(R>255) R=255;3 q8 Q+ |) Y$ Y, X# P$ }+ b5 l* Y. s
if(G<0) G =0;
( u- L7 N: Z) @- o  cif(G>255) G=255;
* j7 h' x2 m' ?& I4 `6 q- tif(B<0) B =0;4 ]/ M6 r6 @8 O, U3 ?* r
if(B>255) B=255;  K+ O! M+ P" Z9 `
*(RGBbuff) =     (BYTE)B;         
4 z. P; |2 X, Z' @*(++RGBbuff) = (BYTE)G;) g* b+ ^: ?+ b7 ^& }
*(++RGBbuff) = (BYTE)R;3 o& Z% H: V" c! H8 l* D
R = (Y1 + 1.14f*V);
( s' ^! ]  C1 Z1 rG=(Y1 - 0.39f*U-0.58f*V);   ! b1 e( A- ?! \  x. C+ \! O
B=(Y1 +2.03f*U)   ;
$ i" F$ [9 A3 q: G5 y6 R9 U4 `if(R<0) R =0;
' G% n. ^3 Z  |6 A$ m& B% `if(R>255) R=255;" x6 j# F6 P1 n5 a& v
if(G<0) G =0;! {5 T- F- i% F% W( a
if(G>255) G=255;$ W  j7 D5 a8 p$ _& Q  s
if(B<0) B =0;
# Q; A  P( L/ K( [/ J  d. _if(B>255) B=255;
% [3 i4 }( c  ~2 {% _6 `*(++RGBbuff) =     (BYTE)B;          * A/ z$ w. Z  U: [- V, p, g
*(++RGBbuff) = (BYTE)G;
, T- l# M5 A% F3 L' x, x9 P4 ~*(++RGBbuff) = (BYTE)R;" V7 K- N+ D, F! ~
++RGBbuff;; u6 ?) C, m5 w  y. _3 V  `/ f$ C
}
8 d9 {: C+ m  N1 m, d}/ M7 i" E0 D, F
inline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
$ N! k3 w' D5 V- I7 _& w2 }. D{+ v7 b" d. v! k8 [

& g+ f4 ~1 f  Q' K// R = Y + 1.403V'
  g7 J2 p+ E+ Z+ b- S! m//G = Y - 0.344U' - 0.714V'
* b- H5 f0 D' {) z3 B* g//B = Y + 1.770U'
! a- ?* |; Y8 r4 Y7 jBYTE *orgRGBbuff = RGBbuff;
0 n) U* ?( L% n& \/ m6 ?for(DWORD count=0;count<dwSize;count+=4)
1 a+ u2 g# i  r- U4 i9 s9 D# T{) H7 N+ b8 P! Z( D
//Y0 U0 Y1 V0; C9 ]  W+ }# \- l/ [
float Y0 = *YUY2buff;
/ y% r0 m3 G8 g& y, |* Hfloat U = *(++YUY2buff);
* h3 P6 U9 e, E5 D% }float Y1 = *(++YUY2buff);
+ i8 a- t+ x# R* b- ^float V = *(++YUY2buff);: D$ I% u, Y. {* w
++YUY2buff;
. v& X6 f9 c( m; Z) Nfloat R,G,B;8 H2 n% h* e4 r& h2 K! B& \$ r* n

0 h7 L" Y: m# I7 U5 A& w' }: A; F1 @R = (Y0 + 1.403f*V);
, w0 O2 Z. k) t7 ~, ~$ ~( VG=(Y0 - 0.344f*U-0.714f*V);   . j; H, U! a# [$ n1 R6 s* Q
B=(Y0 +1.77f*U); $ R. E1 ]. O. @4 A/ J, |
if(R<0) R =0;
& `' N4 y9 Y& H3 Qif(R>255) R=255;
* ^! B7 p6 N: v8 `! cif(G<0) G =0;
$ T. G# o8 J- [/ _+ |if(G>255) G=255;
7 K5 D1 q0 |/ a& Hif(B<0) B =0;
, w7 O0 v( `8 w$ L4 N4 X3 A$ Hif(B>255) B=255;+ ]! j: J8 {, u- o3 r: S
*(RGBbuff) =     (BYTE)R;          ; |8 R3 P6 i# ]
*(++RGBbuff) = (BYTE)G;* ]% X- K/ \$ @( Y7 H0 r4 h
*(++RGBbuff) = (BYTE)B;
7 J" f, s2 j/ o* \! [8 E- |R = (Y1 + 1.403f*V); 7 N1 W$ s! I6 o: y& Z3 P- A/ V
G=(Y1 - 0.344f*U-0.714f*V);   
; w0 l5 w& R! u1 UB=(Y1 +1.77f*U); 4 M+ d7 M: W9 T0 l
if(R<0) R =0;) f/ v: f" S7 ^5 _
if(R>255) R=255;
2 x: z2 G# l) K$ e( H) Y' H" s+ p; x, @if(G<0) G =0;
, s: @) }5 i+ c- G" Y5 Jif(G>255) G=255;
9 ]) {. ~4 o7 A, y8 q! Z$ Jif(B<0) B =0;
2 l# n8 L' H/ Uif(B>255) B=255;7 s( s$ M1 L1 e' @
*(++RGBbuff) =     (BYTE)R;          0 _' A% I- h% u$ [, p, x; J( y: P
*(++RGBbuff) = (BYTE)G;
7 P# K# g0 p# U- Y*(++RGBbuff) = (BYTE)B;
$ a. Z% ^6 s# u6 \++RGBbuff;
/ d7 T( @7 [* f% |  }$ u7 g}- Y* t* N6 k- I/ Z4 I! m
}
/ N( g6 g0 `/ Linline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)3 ]- `3 L% N) c9 s
{5 c! C8 t' w: ?: O% Z6 F% W
//B = 1.164(Y - 16)         + 2.018(U - 128); F9 O8 S- h6 {" C+ J+ W
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)  v) s1 K$ c5 {0 g
//R = 1.164(Y - 16) + 1.596(V - 128)+ n6 W0 }, O8 P+ x
BYTE *orgRGBbuff = RGBbuff;
& Y, A( D# H) X- [( ~for(DWORD count=0;count<dwSize;count+=4)
1 i' k$ C' x. i# ?  C$ `{
: M: |4 l0 F0 S//Y0 U0 Y1 V0( U* {% Q3 c7 q9 d
float Y0 = *YUY2buff;
) ^( O! g: @/ m/ M9 Tfloat U = *(++YUY2buff);/ d$ p* s7 q6 }) M! F  Z! c
float Y1 = *(++YUY2buff);  ^; d  Y# ?: v# N
float V = *(++YUY2buff);
3 j% t1 _6 j9 p; Z: u" n: U. x5 G++YUY2buff;) ?6 W8 g* S  U$ f8 h
*(RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           4 J$ A1 ^! [" c) r6 t5 z+ A! |
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   
. X2 q6 f( z5 Q  f( `*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));        3 l! C) E0 T% F, i% u0 c
*(++RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           
! K0 t- w6 F* j( c$ z8 k5 z: E7 k. Y*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   
* }- D+ f5 K5 d( N*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));          2 p5 _) ]1 H: S) A
++RGBbuff;: s' O4 _* {) N/ M  |

9 z; D9 K' d$ R3 v9 P/ y}
, z) t2 k+ B& q) x9 T$ v}; T7 V4 F$ N6 d( w
// http://msdn2.microsoft.com/en-us/library/ms893078.aspx) z% k  m- g4 y! i' x, B4 s; {
void VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
8 F0 i! M( B& I' L# ~5 [{8 \' c) m7 ~& {$ C* l5 j! h; W7 S
//
  \7 f6 `# f# W, r//C = Y - 16
8 h! ]; G% a+ D: w4 K& y//D = U - 128& Y! a7 y0 C4 d& [, _) a
//E = V - 1280 n8 N; ?: p- e! Z
//R = clip(( 298 * C           + 409 * E + 128) >> 8): T, {4 A; y0 Q0 [" m
//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)7 Z' Q$ f* }  o% r3 V
//B = clip(( 298 * C + 516 * D           + 128) >> 8)
, M' i9 w3 Y' vBYTE *orgRGBbuff = RGBbuff;3 N! _- B$ ?( Q5 {4 O, M/ t
for(DWORD count=0;count<dwSize;count+=4)
# `! g3 ^1 w% C5 F- r8 l; Y{
/ s5 b" H7 u: M2 W& W; P  f//Y0 U0 Y1 V0, Z: f0 ~* v) h( ]
BYTE Y0 = *YUY2buff;
6 K/ _# [/ s2 ^4 ^. k8 WBYTE U = *(++YUY2buff);
: K4 {' S* A8 c! V: WBYTE Y1 = *(++YUY2buff);
" V) b1 W7 c" A& e- U( i  g0 x5 }BYTE V = *(++YUY2buff);
$ v( o  \5 R) M1 Y9 R++YUY2buff;
: C' K. h$ p4 c7 @1 d' r/ f8 }, Y9 v) W- JLONG Y,C,D,E;
5 R: C7 A% u0 K/ ?, T7 M* `BYTE R,G,B;. ~, Y# L# p9 i* X

) I) d, _: ?/ X- pY = Y0;
+ g, C1 C5 u9 R( fC = Y-16;
& B8 Z! k  d" J5 K2 pD = U-128;
. B& e1 N8 h6 I  bE = V-128;8 Z  c  x( _( V6 B0 @) ]: e& L; q# b
R = clip255(( 298 * C           + 409 * E + 128) >> 8);7 N6 U+ t' s4 o6 _& q0 m
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
& Y3 B3 x6 Z/ i- @3 G6 x1 p  {B = clip255(( 298 * C + 516 * D           + 128) >> 8);
6 d1 q- V) \; i2 r* S! L; B# I*(RGBbuff) =   B;           2 O) v8 V; j6 R; R2 _
*(++RGBbuff) = G;   6 F/ u# [4 Y4 _# N) G
*(++RGBbuff) = R;        
# I4 v) W) I6 }! B9 _Y = Y1;* C" N, b' l1 }# a$ J
C = Y-16;9 b6 ?0 F# e  B& X/ v+ T
D = U-128;' H, R: E* C* U% z( e0 M( n$ }
E = V-128;
1 T' [5 p9 ^/ A0 X+ M8 g& dR = clip255(( 298 * C           + 409 * E + 128) >> 8);- |$ o1 u6 K0 q& E3 Q. s0 V$ J
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
7 B, S# S1 R& b9 \; v1 cB = clip255(( 298 * C + 516 * D           + 128) >> 8);
4 g# y6 D) x& l% z2 H*(++RGBbuff) =   B;           8 [6 I1 n! J! {; A. O
*(++RGBbuff) = G;   
6 d8 M' x9 b. c0 v8 E4 j*(++RGBbuff) = R;         9 [3 X4 J6 O' T7 s+ J) p% l1 J' a
++RGBbuff;7 s8 r% P0 ~$ |
$ ^9 l( y4 \9 b; G7 J6 e4 z
}
" R  y  J; e4 C& [}
$ f; b* z, P5 d  U6 C4 \BYTE VC4000Graber::clip255(LONG v)2 W4 p; {# H* ]3 i, _( E) I; u
{
, y+ b* b  l: |, J: s( ^; Fif(v<0) v=0;
+ f1 X- Q% p* V- Kelse if(v>255) v=255;) H+ P! t" k2 h: w; w1 \* t( R
return (BYTE)v;
' Z! I& y0 ]. _( N1 F7 f( E# O; M}3 S; h" P5 g! r% A5 q. L0 m

' A5 y1 f+ M) i9 e. b( m0 A) P5 \本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hardVB/archive/2007/10/18/1831810.aspx
- P, n. u0 p8 g$ Z( T0 c. B3 J; q# Q8 ^* @! s! K" N
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-6-18 06:46 , Processed in 0.019163 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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