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

YUV像素和RGB之间的转换

[复制链接]
发表于 2011-5-30 09:56:44 | 显示全部楼层 |阅读模式
RGB转成YUV(RGB to YUV Conversion)
9 k: A3 ^8 E7 S" o/ x! o$ jY  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
2 _. Y$ m# }4 J: ?& y' XCr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128) r' L# j# v! e- [5 h: n' J) I5 z
Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128YUV转成RGB(YUV to RGB Conversion)2 T8 g4 [4 a  i; h
B = 1.164(Y - 16)                   + 2.018(U - 128)
3 ^7 P" G. J( O# mG = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)  S( V$ D3 _, R
R = 1.164(Y - 16) + 1.596(V - 128); W" T9 X7 J% q6 {( j5 A* K
R, G, B, Y , Cr, Cb的取值范围都是[0,255].
4 g. ?2 x% c) ^) [# X
6 v. A. A; L1 w  D5 p7 c6 \: P原文:http://www.rosoo.net/a/200604/6049.html
" l1 \: X9 j! Q& d: f/ l
 楼主| 发表于 2011-5-30 17:08:39 | 显示全部楼层

YUY2视频转化RGB格式

//YUY2视频转化RGB格式 by hardy 2007-10-171 |8 B" @; s0 P* b$ u! h
//http://www.fourcc.org/fccyvrgb.php
3 U1 N/ L. R9 R5 pinline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)$ Z2 l1 d$ e8 _# w( {$ I  r
{) {% e% w5 S2 {3 w
//B = 1.164(Y - 16)         + 2.018(U - 128)
* K8 @4 T" x* i//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)4 g8 B6 z$ Y' F+ H3 j- u  i
//R = 1.164(Y - 16) + 1.596(V - 128): d9 j. e9 B: P
BYTE *orgRGBbuff = RGBbuff;
# m! h! r5 l: T+ Z, Hfor(DWORD count=0;count<dwSize;count+=4): w' r2 w- m- d; h
{9 ~# \9 x& W9 h& p3 M9 q
//Y0 U0 Y1 V0
$ J9 n3 S, \" A  i+ Z% zfloat Y0 = *YUY2buff;7 g+ a( X4 k) j+ S$ }4 U- n
float U = *(++YUY2buff);* q( ]' \3 }* ^7 t' S- m) h1 s
float Y1 = *(++YUY2buff);0 j7 I) n6 H6 T8 s/ C9 R
float V = *(++YUY2buff);$ p' `; x  B2 Z. u
++YUY2buff;
$ ]& f7 Q1 A4 x1 `, N*(RGBbuff) =   (BYTE)(Y0 + (1.370705 * (V-128)));           8 \9 D4 N1 k* F
*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
6 O9 H8 |; i: R6 z# }: O*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));        
4 J6 H, I; j+ d+ s% C*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));           4 |7 C/ S% |. d
*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
7 @$ e& m+ B' g( ~*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));         % R6 R" B9 o9 D1 N
++RGBbuff;
$ `+ O7 b; x3 d}
3 ]! b2 m5 v9 `0 [' k# P$ F}
) t# {! H' H+ o: L% d) Zinline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
) f, D: h+ e9 S, [& L5 S. [- I{1 M( c! `4 @; }  L$ z8 w9 d
//R = Y + 1.14V
% @' `  k2 c4 B1 s6 y, }//G = Y - 0.39U - 0.58V0 l  Z: L  i* b
//B = Y + 2.03U/ }" d. S1 X6 C7 |/ `! n, C' r) b
// R = Y + 1.403V'
, e0 m; E  V3 j- `% x; X: w$ ]//G = Y - 0.344U' - 0.714V'+ e$ K4 I! s2 m) t: e0 t
//B = Y + 1.770U') J5 _& @. \  X4 l2 f, x
BYTE *orgRGBbuff = RGBbuff;2 N" E9 V% @" o, y# ^
for(DWORD count=0;count<dwSize;count+=4)
3 d2 K# w+ A; `" |{  M* v5 t4 {; r5 t
//Y0 U0 Y1 V0
+ p6 u/ n  J7 B! x$ W6 L$ Yfloat Y0 = *YUY2buff;/ ]* x/ L! C8 U% d% `* z7 M2 S$ Z3 H
float U = *(++YUY2buff);! [) ]4 R+ x4 l) v3 P
float Y1 = *(++YUY2buff);  D" N6 n8 {. H( t
float V = *(++YUY2buff);7 v3 F4 F/ f5 W* ~9 T
++YUY2buff;
  g* q) w  X# i( a0 A' \float R,G,B;
: |# C8 Y4 t% p. i3 W5 ~3 ]7 a& ~" X2 Q' R5 d- a3 P8 _
R = (Y0 + 1.14f*V); % G) z+ N/ K+ x( V% y5 y
G=(Y0 - 0.39f*U-0.58f*V);   ( c& e6 F- g# S7 i/ W; S/ ?) Q% l
B=(Y0 +2.03f*U); 4 |0 j3 j4 m, X$ p
if(R<0) R =0;4 P+ _, k% N) I8 Y" D3 t& U. I9 e/ i( ?
if(R>255) R=255;
2 ?) P3 b2 B' Y8 w; b) Q4 }8 n3 iif(G<0) G =0;
4 v' a4 \: @2 g, B* I  Pif(G>255) G=255;
2 k" J4 V$ M" y; zif(B<0) B =0;
9 p! N; Q4 D7 f& v5 Yif(B>255) B=255;) w+ H' w" \+ `& k3 M! x
*(RGBbuff) =     (BYTE)B;          + `' |" j3 C! ~  ^4 g
*(++RGBbuff) = (BYTE)G;
. L9 R  M8 }8 ]' x8 I- b* u*(++RGBbuff) = (BYTE)R;
8 {7 u# U) B- r9 {% U# TR = (Y1 + 1.14f*V); / I! G) y, V% @, z: Q
G=(Y1 - 0.39f*U-0.58f*V);   
8 ?% G  h$ }; l+ a* E1 H+ ~B=(Y1 +2.03f*U)   ;
1 Y( u* F9 f$ K3 |6 P9 \# Kif(R<0) R =0;
% N* }* y/ M) {4 F8 W8 wif(R>255) R=255;
+ Y  D0 @2 L1 S1 @+ g2 U2 ]  @if(G<0) G =0;/ B% O, i3 y$ v; d
if(G>255) G=255;
1 K+ G+ w: C; ^& L$ xif(B<0) B =0;
# x, |( S. ]7 \7 s* c5 \# yif(B>255) B=255;9 v( R6 ]% P8 ]
*(++RGBbuff) =     (BYTE)B;          0 {, ]. K# J$ l$ J$ v; ]+ ?
*(++RGBbuff) = (BYTE)G;, k! T2 x$ W8 A2 H
*(++RGBbuff) = (BYTE)R;
4 Y0 b8 w5 b; a  |: K  M) c++RGBbuff;9 o: W) O' F8 e
}
3 X  r& ]: a4 Y}
  J/ f7 O* ^" \4 oinline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)9 V0 R0 y/ S, `& [$ x
{
9 ?( W) k( {, M8 [. N9 W/ j
. s" i$ `6 ?5 ]  p& D// R = Y + 1.403V'
- g3 ?; q5 f0 e: C3 C" X6 P//G = Y - 0.344U' - 0.714V'
4 J1 i" h6 m& P- s5 |) [9 U1 R0 M//B = Y + 1.770U'  B- `7 W& \- l  B
BYTE *orgRGBbuff = RGBbuff;
- U7 X3 T+ R* ^5 Z. j/ v; Zfor(DWORD count=0;count<dwSize;count+=4)
# r! ~" c; }$ k4 u: N6 e8 B{, m  }4 L& h1 S9 V; G
//Y0 U0 Y1 V09 Q" e9 E$ S* |* I7 _% x3 f3 R
float Y0 = *YUY2buff;5 h2 t' W$ Y) z* @) A- p$ f
float U = *(++YUY2buff);
. h+ K3 i2 g/ j1 g& yfloat Y1 = *(++YUY2buff);7 m. ?# i  }; y- Q9 t
float V = *(++YUY2buff);  T( Q) H" J. A. k4 W
++YUY2buff;) K% Y* }( l. f% b, V
float R,G,B;: f" F3 y5 }5 n
$ c) d: @0 A* ~8 M. z( X
R = (Y0 + 1.403f*V);
6 k5 w" B0 z; D' h( S2 u2 WG=(Y0 - 0.344f*U-0.714f*V);   
/ ^' B) {2 l  e( iB=(Y0 +1.77f*U);
" ?& @, A# X) r" i3 J" H) Qif(R<0) R =0;/ V$ o+ v, t# l% c" h3 U
if(R>255) R=255;" N6 X0 w- p+ h& ]# u- P5 q
if(G<0) G =0;4 f' |" j" S5 c2 p2 p% k  {* f3 s
if(G>255) G=255;
6 D; B+ ^& b' tif(B<0) B =0;( B# _6 z" b( f) I  J
if(B>255) B=255;7 p# \' i4 l( [' b2 z: U. g( S
*(RGBbuff) =     (BYTE)R;          ( W, w) U) G; R8 c( ]5 s8 P
*(++RGBbuff) = (BYTE)G;
, e6 e- `) m% U) a; {$ W2 ?9 j: s*(++RGBbuff) = (BYTE)B;1 }1 |7 E4 M4 g% _* |/ M
R = (Y1 + 1.403f*V); % s& C9 w0 v, I1 R; o
G=(Y1 - 0.344f*U-0.714f*V);   6 g, J3 @: D$ v6 R
B=(Y1 +1.77f*U);
: N& _+ m, N+ D2 r9 O! J4 c/ |: Uif(R<0) R =0;  i  F; |, n; \/ u% _2 g7 [, M
if(R>255) R=255;, y% i- E$ |& r# G9 ?% L/ i" m
if(G<0) G =0;: M: K( Z) {- M# ~4 j- p9 \
if(G>255) G=255;+ r% r: X5 E0 E" h& c
if(B<0) B =0;
8 ^+ N' T" j- Y3 R+ W2 ~3 Qif(B>255) B=255;4 v) W4 d6 V: ?! Z7 x
*(++RGBbuff) =     (BYTE)R;            L+ s$ c8 D, ~: i2 s5 v- P
*(++RGBbuff) = (BYTE)G;6 u( c+ \; R; R: Y7 [3 F
*(++RGBbuff) = (BYTE)B;
4 ^/ L6 G# D$ [++RGBbuff;$ Y1 [" ?: r5 t# P  |
}/ C7 k  _# |% v. F# J% a) J
}! b+ D6 ~4 E* [. I$ d# d. p9 f2 U
inline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)8 A0 }5 u% U5 B; R
{
4 o) a5 ?* Q: y" ]//B = 1.164(Y - 16)         + 2.018(U - 128)
6 a7 m# Z0 W9 b! c6 r4 U6 `//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)0 y9 o; b7 K& [
//R = 1.164(Y - 16) + 1.596(V - 128)( x  L/ k, y; W- W$ m* \. Z- m
BYTE *orgRGBbuff = RGBbuff;4 B7 U7 H, L6 W
for(DWORD count=0;count<dwSize;count+=4)
! E0 p' f( R/ `( l( [/ N+ v{9 k' L$ f5 x5 N! f
//Y0 U0 Y1 V0" B# x7 h) a' l( l
float Y0 = *YUY2buff;
# z/ C6 ]$ R7 H: q  L; ~" w1 Efloat U = *(++YUY2buff);6 k/ v1 z' l; @; b3 t
float Y1 = *(++YUY2buff);
' \$ Y. _1 B  t; f/ w6 Jfloat V = *(++YUY2buff);& g6 Y& a# T: H5 L: ~3 i9 a6 l
++YUY2buff;
. I5 k* ^6 A% Q7 N*(RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           5 D8 {0 T. g4 m- ?5 a
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   9 Z% x( F* E+ L* \7 U6 y8 O, c% J5 M
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));        . q# q( }( R0 S1 j' t
*(++RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           " N8 h8 v  I; E' k( _
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   
: `7 s2 I0 L; n& M! `3 J*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));         
4 e3 B; j% w8 E* o2 q++RGBbuff;
6 L: ^: l1 S% S4 `# Z3 N2 b* ~
* f2 w9 _( s0 S! k1 A}/ P0 j# ~6 j! j0 }+ p1 q
}. U2 y& M1 A- p; ?' P# J
// http://msdn2.microsoft.com/en-us/library/ms893078.aspx1 M& B: d) ?4 R5 p+ H  }/ C
void VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)6 Q: f( k5 {* c  E* b, m3 f* W6 W
{# h9 }0 e% G  K2 D( e/ @5 y
//
4 _+ ], ]) ]+ X1 ]2 N//C = Y - 166 Y" Q7 J* T6 W: O3 `! b
//D = U - 128
8 R( y. s0 |) `+ _: j9 q//E = V - 1281 O, l0 w4 ~6 G
//R = clip(( 298 * C           + 409 * E + 128) >> 8)
2 {6 ]! W# `8 h3 L: `( h//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)6 p1 g; V/ ]. Z  H  p' L
//B = clip(( 298 * C + 516 * D           + 128) >> 8)
5 P7 j  g1 [7 K, {9 w4 h# n! m! NBYTE *orgRGBbuff = RGBbuff;, v" R, z! Y$ m4 v  w
for(DWORD count=0;count<dwSize;count+=4)
# W/ j, k! l- ]  [{
5 \- A& G+ {& r1 t4 r* f7 S//Y0 U0 Y1 V0
  \2 D: S) {/ Z3 Y1 I1 V  D9 u+ [( LBYTE Y0 = *YUY2buff;* a# V: I9 v  a7 V; P% A$ U
BYTE U = *(++YUY2buff);6 U0 T8 I2 r5 K8 L
BYTE Y1 = *(++YUY2buff);+ r* h7 r0 n8 j3 [, @, o
BYTE V = *(++YUY2buff);
4 |- X4 H0 N  k+ A) A" v++YUY2buff;
% E- U. A- I  k! X1 Y% g( |LONG Y,C,D,E;% `9 W# g. F" q& B0 O5 `
BYTE R,G,B;
  n* Q4 S1 |: i
0 ^* |/ d8 U& H0 u3 z4 Y. `; s5 ZY = Y0;! r/ y5 F, h  W2 _
C = Y-16;" e  w) |$ b- R. y$ C9 I; O
D = U-128;! X5 n5 n( h0 D( E8 S$ [
E = V-128;) o% v! m5 c7 b& g
R = clip255(( 298 * C           + 409 * E + 128) >> 8);
: X& F- w% K/ p* u3 IG = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
& E6 V  a( u; @% y3 e1 bB = clip255(( 298 * C + 516 * D           + 128) >> 8);
2 z: H1 p* C+ _6 Z" L8 E) V: X*(RGBbuff) =   B;           
3 y9 M! B2 G0 E& W3 y. m" I* ]*(++RGBbuff) = G;   
. Y9 [% ^' Q) I( Q; b; F5 f$ g*(++RGBbuff) = R;        + M  }# E6 O* O( c$ |& _  z# z. B
Y = Y1;2 T. \0 D! V5 S& z. z
C = Y-16;
0 {8 b) G- D+ t% e- t/ q, mD = U-128;
" I. {* F2 [! f8 aE = V-128;- T" j# T/ @; Q; m0 U4 \
R = clip255(( 298 * C           + 409 * E + 128) >> 8);# w. [, F+ W4 ]5 ~
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);2 x  I2 m' u! P4 }
B = clip255(( 298 * C + 516 * D           + 128) >> 8);
/ D: ]3 A- ]+ s% n( _; I0 k6 K: t( Z* y*(++RGBbuff) =   B;             J* U6 W( Z7 o: l# a/ n
*(++RGBbuff) = G;   6 e4 T; E6 V' M! t: t9 M
*(++RGBbuff) = R;         $ K( S5 \  L1 K
++RGBbuff;+ |$ y9 Q0 C! Q, \. U) t& R1 ^

! s3 K0 f. ?  U, m1 @}
+ l7 ]8 \( A" K' R% Z3 U0 X3 `}
2 T# R- \3 z; \4 T/ q' N/ {BYTE VC4000Graber::clip255(LONG v)
1 {+ V( j: e% {% }+ G) ]; \{+ O+ y8 T; Z/ @, s4 N
if(v<0) v=0;
" s( v. D% u; Q, }4 h6 |else if(v>255) v=255;
' @& [3 n" d  n; b! k; R1 d- `8 |return (BYTE)v;
. s: I: l: ?* [% u0 B}) s0 e) C* l  Q5 m% S

0 _. b" Z7 @- l9 y" G; ?8 {6 P本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hardVB/archive/2007/10/18/1831810.aspx4 w6 o6 O  i! C7 M; f: \- x  Y8 q9 N
/ v5 K4 O( a* m7 s; \8 B
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-13 18:58 , Processed in 0.018547 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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