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

YUV像素和RGB之间的转换

[复制链接]
发表于 2011-5-30 09:56:44 | 显示全部楼层 |阅读模式
RGB转成YUV(RGB to YUV Conversion)/ I, J; [- {2 t& l( ^6 @
Y  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16" g# k1 I5 {; S0 t/ L" C3 N4 p
Cr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
1 I6 f- W) o$ @3 BCb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128YUV转成RGB(YUV to RGB Conversion)5 f5 v$ e# R2 [. v7 x5 X
B = 1.164(Y - 16)                   + 2.018(U - 128)- y% s5 v5 @9 e% m: w
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
% z6 b: I( [  pR = 1.164(Y - 16) + 1.596(V - 128)$ e; W! ~, ?1 U# R: u5 y' U  q. j2 v
R, G, B, Y , Cr, Cb的取值范围都是[0,255].5 ~( }/ |( x0 O& S4 c$ C3 {
, D" v: N  q5 B* C+ E2 `
原文:http://www.rosoo.net/a/200604/6049.html1 N+ T+ ^3 X* Y1 N8 n- k
 楼主| 发表于 2011-5-30 17:08:39 | 显示全部楼层

YUY2视频转化RGB格式

//YUY2视频转化RGB格式 by hardy 2007-10-170 v' c! e' R# `6 s
//http://www.fourcc.org/fccyvrgb.php
! X( N& q; ?0 L9 iinline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
( h' H' n( X& t3 A5 f7 a{' Y, ~/ {5 V" g8 p7 [# ?
//B = 1.164(Y - 16)         + 2.018(U - 128)
# s9 E5 N1 U, e5 L1 i7 p6 Y  q: I//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
) x! @4 u+ X" Z& b3 H- M//R = 1.164(Y - 16) + 1.596(V - 128)
* _2 Y/ a1 V5 k  ]' IBYTE *orgRGBbuff = RGBbuff;* \& z- Q$ N& J* e6 q
for(DWORD count=0;count<dwSize;count+=4)
4 L6 T0 n! b3 x, L1 g- }0 k{
3 c9 t7 E; f; z$ K//Y0 U0 Y1 V0
% w8 P+ |/ d3 J: }float Y0 = *YUY2buff;
4 k' [& u: n. zfloat U = *(++YUY2buff);
# |: \5 g: r7 v4 r# P( Dfloat Y1 = *(++YUY2buff);
6 b6 ?. A$ `# vfloat V = *(++YUY2buff);
! C7 W/ r' `( F++YUY2buff;
. m! t6 ^6 j9 ]# M8 ~9 G*(RGBbuff) =   (BYTE)(Y0 + (1.370705 * (V-128)));           1 U# \( e' H  H3 V
*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
" W; b3 P: @: E$ a1 ^9 ^*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));        * x5 U& C2 K) I7 J: F; n
*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));           
0 n# @1 u' b( Z1 Q( h*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   * X& C1 X1 ^- E& F
*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));         
5 ^( S+ u6 ~( V; j* u- L++RGBbuff;
- r: y! }( [7 O" J4 I& x  R" A}
+ X# t1 I0 g: n- u; B5 B! Z4 @8 j}, r1 B# w  _2 Q$ ]/ P
inline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
6 |/ D- q! F+ n! Z, g) j5 h4 P4 y{: C$ v3 p2 t5 z* r! ]/ P
//R = Y + 1.14V" g2 p' T5 M0 A3 Z4 j
//G = Y - 0.39U - 0.58V+ a, K" `$ {) D
//B = Y + 2.03U
1 R7 l6 o8 H' b$ n4 b7 S// R = Y + 1.403V'% F6 J- K" T# l
//G = Y - 0.344U' - 0.714V': Z# F2 }1 A' i  A; Q; ~2 w" N
//B = Y + 1.770U'
+ J" t3 |& O/ B- j5 [BYTE *orgRGBbuff = RGBbuff;
! y2 L3 B1 \6 b# n( nfor(DWORD count=0;count<dwSize;count+=4)4 m, T) f) u9 u2 c' Q' |
{
) f$ ~1 m: n- l7 N. I; u- y  n//Y0 U0 Y1 V08 O% t9 y4 @( R7 F! i* k  f
float Y0 = *YUY2buff;
3 _1 N/ _' Q8 p3 Mfloat U = *(++YUY2buff);
. @; O  X; q- s! i+ J: {6 lfloat Y1 = *(++YUY2buff);' O0 C  ~# `' {! p0 n/ O
float V = *(++YUY2buff);
8 ~# m  D: T1 k++YUY2buff;, w% u8 m. W1 q& N( W4 @: @4 @
float R,G,B;
; Z  \1 B# s  t1 u( W6 M- R, c# k3 w( V/ y4 t6 [$ O
R = (Y0 + 1.14f*V); 4 j! L1 b7 P( m! |. t) s& n
G=(Y0 - 0.39f*U-0.58f*V);   
7 T: C  X& Y6 N  N2 Y5 K0 PB=(Y0 +2.03f*U); & F+ J6 a& Z2 W2 Y5 s3 ^1 w5 ~: x
if(R<0) R =0;
: @" g( v3 ?* H% `5 O! v' k$ ?! oif(R>255) R=255;7 E( Z* w" I% y4 d& c: h
if(G<0) G =0;
! L8 }* z. M! ^5 ^8 q' Vif(G>255) G=255;* |- _  I  ]% l  u; Y( M( A
if(B<0) B =0;, z8 X$ ~% L8 v0 n$ u3 T1 n* p
if(B>255) B=255;
( j  |( v3 n$ @$ F*(RGBbuff) =     (BYTE)B;          6 Z, w/ B$ n; @  Z+ Q$ Z/ [. F
*(++RGBbuff) = (BYTE)G;- c8 W* @- _8 ~; J& |; H
*(++RGBbuff) = (BYTE)R;7 L+ ]  G# Q: L% G
R = (Y1 + 1.14f*V);
( J+ [2 e# X9 q2 a, c8 K+ y0 EG=(Y1 - 0.39f*U-0.58f*V);   
3 s  y; w/ @, s9 w: ?6 }B=(Y1 +2.03f*U)   ;
5 G7 X% t) ?  H. M; T' Rif(R<0) R =0;& O) k* E% w+ N7 n3 D
if(R>255) R=255;. L; r! F" [, c1 h7 f* P3 R( O% Z
if(G<0) G =0;/ f  F. E& I3 K# O8 T( H5 A
if(G>255) G=255;, [8 {& k0 L  {5 E! K% x' H- A
if(B<0) B =0;
1 L- k6 `1 J2 p. R7 Vif(B>255) B=255;
, {) I8 t; D0 z  d% B! M*(++RGBbuff) =     (BYTE)B;          * O1 l! N* G% }
*(++RGBbuff) = (BYTE)G;! S1 I: S% i; T7 }! `
*(++RGBbuff) = (BYTE)R;5 e. Y0 M$ ~% s
++RGBbuff;
8 m- h9 T& j* _( _4 w9 T}2 s' F! M8 t, T: ~; }
}" L! W  S# B1 ?" i7 ^" @
inline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)3 ?0 b7 I: G# u% m6 U1 X$ g0 R
{
+ r- S) o# {: J1 A
" @, M/ N6 C0 ^6 `// R = Y + 1.403V'
5 S; W# I  j. w& x6 M6 }3 o6 y//G = Y - 0.344U' - 0.714V'
' p8 C# Q. d' U1 L7 |! u- `* T//B = Y + 1.770U'' o3 S( e; x- [: j3 k7 O6 D3 ^1 i6 S
BYTE *orgRGBbuff = RGBbuff;+ l/ g! C. {/ I
for(DWORD count=0;count<dwSize;count+=4)% u7 x4 S& i  T/ f5 R% U
{1 I3 T& Y& }( r+ q
//Y0 U0 Y1 V0  X/ i4 H3 h6 S; K2 Z, h
float Y0 = *YUY2buff;% r' c+ x# z5 M# k% [
float U = *(++YUY2buff);8 J! e  L8 L4 Z+ ]: ?
float Y1 = *(++YUY2buff);
5 {0 Q6 X" ~7 V  ^  R7 E: h$ ifloat V = *(++YUY2buff);
3 S! E8 @" v- t# ^; H++YUY2buff;8 Y3 F& C* ^4 e6 D/ R
float R,G,B;! s1 C& h; {6 k# {
" ~9 l- _! N* j# l( h' E
R = (Y0 + 1.403f*V); ; C# g( v1 v/ G; S8 v5 {$ J# t
G=(Y0 - 0.344f*U-0.714f*V);   ! I# Z- U/ e/ e. V  A
B=(Y0 +1.77f*U); / z5 i2 y( K) Y
if(R<0) R =0;
1 [/ v+ C8 l" l# M& y& oif(R>255) R=255;
8 H& v7 O$ L5 g) I% ^/ O9 bif(G<0) G =0;
& S$ H: H0 |- e9 J0 M8 `  O- M7 s3 Wif(G>255) G=255;
$ o  F6 |. N( e; @* dif(B<0) B =0;
% ^. T1 v. F! tif(B>255) B=255;; k3 |+ ]2 U2 D5 M; t  v5 k2 T6 K
*(RGBbuff) =     (BYTE)R;         
/ V- S# T# D9 r& \' @+ \! f*(++RGBbuff) = (BYTE)G;7 {! K2 ^+ s6 n$ A) f) [0 V
*(++RGBbuff) = (BYTE)B;
9 X7 l, r: ~; z3 YR = (Y1 + 1.403f*V);
! V& m# p1 P; G8 m1 G/ C+ CG=(Y1 - 0.344f*U-0.714f*V);   
8 a, Y0 J, H( w4 D' G, n0 wB=(Y1 +1.77f*U); # s* H* J5 W9 f! n! w+ J7 P  h
if(R<0) R =0;
- i. u7 `1 Y0 V0 _6 _  V1 y# Vif(R>255) R=255;
0 _9 ]6 ^5 q) S5 ^) @0 bif(G<0) G =0;
$ I, f7 K  f; G6 oif(G>255) G=255;
3 ?: k1 t: M; i: f; E$ Zif(B<0) B =0;
* O  w7 F4 Z* Z' i' O" s) eif(B>255) B=255;- }/ E& f5 A' O5 d" F
*(++RGBbuff) =     (BYTE)R;         
; N  ?& V" f& }, T0 }*(++RGBbuff) = (BYTE)G;+ ?+ f, q' K' n1 _/ }5 c3 F' X
*(++RGBbuff) = (BYTE)B;
5 q! x; }- j2 A++RGBbuff;
$ G1 ^, u6 k( I' f, Z}& w5 |$ P% ^) _. J6 i3 p1 Y, _) L
}
9 h. x" o! \( oinline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
( T) m% U- @, C( m% h{
" S# `+ [5 M& M9 C//B = 1.164(Y - 16)         + 2.018(U - 128)
; G& M# S+ T; G7 H  P) n//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
6 G5 c) g, G; C- A: X" Y//R = 1.164(Y - 16) + 1.596(V - 128)
, o6 p* f2 i  U) _+ Z9 J2 KBYTE *orgRGBbuff = RGBbuff;7 @. t0 h- I  t; U
for(DWORD count=0;count<dwSize;count+=4)
7 p" Q$ o) d5 i{/ H/ f) n  `7 Y3 F( E; k1 B
//Y0 U0 Y1 V0
# }2 o3 W7 \: p3 s% ?+ rfloat Y0 = *YUY2buff;
2 C) I- ]; Z2 _8 P* ^* ?0 f0 Ifloat U = *(++YUY2buff);' X; t. ]9 G. {% W# b! `
float Y1 = *(++YUY2buff);
: w- G. T9 }' p+ \) ?- gfloat V = *(++YUY2buff);2 U7 L* Z2 e+ y- u2 D
++YUY2buff;
( J8 U9 Z1 z5 P*(RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           4 s# W& G& r3 e) |- R+ _: d9 T
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   
0 r5 A+ L' X) h" ]" ]' U*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));        
7 c- w  a/ ~# _*(++RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           3 O6 l: m- c4 j  w
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   
0 o/ w: r; Q  O3 A+ Z4 R) v8 E  i*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));         
4 _9 H2 U8 k* d0 k  c  C++RGBbuff;
7 N1 S( b- a7 M2 R: Y
% X4 F# s8 \2 {& C}( T- t& t" G8 R, X/ C/ j
}
: E: o( p6 S* y4 l$ K// http://msdn2.microsoft.com/en-us/library/ms893078.aspx
/ C3 m' g6 @8 U/ }$ Svoid VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
! b+ ]( B3 [- Y4 T$ }9 o. a" z{" I6 C6 @. O+ Q0 r
//
/ ?% J" h1 [3 M2 ~9 d' O//C = Y - 16( }3 g' G0 A) l+ H
//D = U - 128) n5 t" B* w' s
//E = V - 128
  R1 l8 l# Z/ r2 O9 J- B//R = clip(( 298 * C           + 409 * E + 128) >> 8)
+ }* Y) q- b9 b- N# C5 v//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8): G: }  Y0 j& V; ?# H/ D. ]1 v
//B = clip(( 298 * C + 516 * D           + 128) >> 8)
4 F% W. @9 f% [' C. \0 DBYTE *orgRGBbuff = RGBbuff;
& g7 G  h" i) c: Q# ]for(DWORD count=0;count<dwSize;count+=4): q" l; B; t3 [2 N( ~. ]5 ~: L6 M
{
' P4 E+ K% A7 \. [2 H7 a. `+ G//Y0 U0 Y1 V0
: v! T/ c6 l4 g0 m9 i( |: ?BYTE Y0 = *YUY2buff;( a0 m- i# V2 d
BYTE U = *(++YUY2buff);% P6 O# R: _# K& F1 U6 i" F8 j
BYTE Y1 = *(++YUY2buff);
& z' r# G) E& H. `BYTE V = *(++YUY2buff);
* M& o- F3 \. U* ]3 {7 ?++YUY2buff;
" v+ e  J& q0 j  _5 W- rLONG Y,C,D,E;
) Y' K- z6 k% p- a  v8 u- sBYTE R,G,B;7 ?9 ^( E* l9 L) g. P

# v, ~' e5 I* T# J/ SY = Y0;- Z; e/ D# p! X0 k
C = Y-16;6 H9 n' n8 ^" J+ i& E/ w% I
D = U-128;
( C4 M& D/ N, gE = V-128;
+ H5 z4 x$ H' ^' o; oR = clip255(( 298 * C           + 409 * E + 128) >> 8);
  ^3 \4 C& [  }3 Q7 YG = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);  H. B2 x- y; b9 b
B = clip255(( 298 * C + 516 * D           + 128) >> 8);) h- H7 `. X5 d0 n
*(RGBbuff) =   B;           ) Q' @9 R$ k' O1 O8 _
*(++RGBbuff) = G;   - A) x; Q  c3 s/ }; X! R
*(++RGBbuff) = R;        5 R- |& Q2 Y* @* H" `) y" |' x; E
Y = Y1;
8 G$ v3 h# L+ r& o& \  RC = Y-16;
: J7 y- x- f, z1 n1 l' q. k+ T! {& dD = U-128;
; H+ A9 R) J. R2 J8 ]& o# ?: kE = V-128;* \, n5 i+ Q8 z/ m# {
R = clip255(( 298 * C           + 409 * E + 128) >> 8);# g7 M+ o; a# z5 `" a6 z( I$ c0 P
G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
3 J8 S" A: \& z) W1 ~B = clip255(( 298 * C + 516 * D           + 128) >> 8);
% G1 `* r* G5 f9 n" x*(++RGBbuff) =   B;           1 B, n( M' f7 i
*(++RGBbuff) = G;   
# @) M3 ~" @. q/ n8 E' e, l+ Q*(++RGBbuff) = R;         
' l; h4 u* t0 B- o++RGBbuff;
4 H7 Q1 |7 l. }0 C4 o1 V8 n) I! ^* a0 S3 f( f/ Y3 |# Y
}% ~- @3 V2 o- s( E' E
}
- }6 z2 N" M) \* K8 }6 mBYTE VC4000Graber::clip255(LONG v)# r. t0 s' x& ]# t3 H, @
{1 A/ U" I2 f0 v2 a. e  K- g. O. H
if(v<0) v=0;
: ^% L% N3 a& p4 ~, Ielse if(v>255) v=255;/ f8 Y; u' {& ^
return (BYTE)v;
0 N6 \5 h/ {6 M}
2 [: C% j, _2 M
. o8 m9 v% m0 [( l5 p本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hardVB/archive/2007/10/18/1831810.aspx  k. n  p) |, O
+ s& Q/ Y/ s3 g8 G. f# V
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-5-2 08:54 , Processed in 0.023859 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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