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

YUV像素和RGB之间的转换

[复制链接]
发表于 2011-5-30 09:56:44 | 显示全部楼层 |阅读模式
RGB转成YUV(RGB to YUV Conversion)& p4 C0 p5 f8 z3 x6 n( |
Y  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16. x' t0 g" C4 _: ^/ o2 j& S
Cr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128, g2 F8 ^) K- n, H8 W
Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128YUV转成RGB(YUV to RGB Conversion)
' N% E! k! T' m3 m9 CB = 1.164(Y - 16)                   + 2.018(U - 128). K' K8 O: u8 E: a& U, X8 W; o
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
" `( G, O5 i# \R = 1.164(Y - 16) + 1.596(V - 128)* k; j8 ~4 |7 w
R, G, B, Y , Cr, Cb的取值范围都是[0,255].7 T% O  R8 w' O6 ~% k8 \" w* V
0 N) |1 h) n3 t' D) ?# t
原文:http://www.rosoo.net/a/200604/6049.html" O9 Z# p  G- l  u4 Z
 楼主| 发表于 2011-5-30 17:08:39 | 显示全部楼层

YUY2视频转化RGB格式

//YUY2视频转化RGB格式 by hardy 2007-10-17
& B4 W9 ~7 {& N$ v//http://www.fourcc.org/fccyvrgb.php
& U: {+ [% U+ V3 _2 _/ n$ K3 Ninline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)" `7 e- i( f, [* p
{: e3 W0 e4 ?" T) C0 p* w3 d6 r
//B = 1.164(Y - 16)         + 2.018(U - 128)
/ D( [1 S% x7 j/ d9 [& ?//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
$ \* l$ f( |, _1 Z( f" o//R = 1.164(Y - 16) + 1.596(V - 128)
3 w, r& s7 c8 I$ N9 CBYTE *orgRGBbuff = RGBbuff;& t1 g4 ?+ t7 S; Y6 w' k% ~
for(DWORD count=0;count<dwSize;count+=4)
: o7 A; ?& U; Z$ v9 z/ H7 E; A{
1 v$ s- V; _: T) z! D//Y0 U0 Y1 V0
, O9 r3 f& b1 Cfloat Y0 = *YUY2buff;5 m- E5 |6 R0 \. L
float U = *(++YUY2buff);7 [$ F+ _+ j: r: \6 J# }8 L) B
float Y1 = *(++YUY2buff);/ k( d* E) S! G8 X" M- T" ?- C
float V = *(++YUY2buff);
0 O! ^, h. ?- J( y, m++YUY2buff;1 B, T1 j5 T9 \- i
*(RGBbuff) =   (BYTE)(Y0 + (1.370705 * (V-128)));             z, w( t+ K1 k5 I  T9 {) T
*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
# J1 }& @' q+ h) D# R. L*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));        
! k& @- |& b6 w: d  n  j+ f* y4 Y*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));           * ]: d: u4 {8 K% w
*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   6 P+ F1 n8 o% s* \, O- A7 [# Y
*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));         
# j; ]4 A" H% d( L, x3 a$ I5 s. `++RGBbuff;
' J5 v! L+ Y6 x2 g! r/ g}
1 M3 T8 L& ]1 ^! X5 S! ~2 X( I}
9 ^: r+ z+ N$ Z$ ?: z* T7 Iinline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)0 A2 U+ x/ @. d; ^/ k
{- q* r5 H. {4 D2 i
//R = Y + 1.14V1 L# o7 k) @! p# h
//G = Y - 0.39U - 0.58V
1 r8 n4 b$ {7 x! ]1 u//B = Y + 2.03U7 F7 f( O7 c" _0 S7 C
// R = Y + 1.403V'
: N& n  c# l5 P9 r$ p4 H! t$ ]//G = Y - 0.344U' - 0.714V'
( Q* X  y8 N- C9 Y: ~" M9 N3 o: E//B = Y + 1.770U') }& D6 G, \& Y2 N
BYTE *orgRGBbuff = RGBbuff;
6 H* d) ?) M5 a% s* R1 x. p5 nfor(DWORD count=0;count<dwSize;count+=4)
* q. G6 u8 A! L; l3 f$ p{
4 [: x( v% J7 D9 \/ Y$ `# F% o2 d. E: O3 o//Y0 U0 Y1 V0
% d+ _5 r8 N# Y; g( ^9 Z& Ffloat Y0 = *YUY2buff;4 f! @. ^7 ?0 P" p7 e
float U = *(++YUY2buff);
/ Z( w9 g( [3 }( X9 V% efloat Y1 = *(++YUY2buff);# e* E' e4 V7 Z% H" W# E: r0 q: Z1 w2 j
float V = *(++YUY2buff);/ g$ I3 U; N( E$ K- [6 A* H
++YUY2buff;. O0 V. R/ W7 |9 S6 `# |8 y
float R,G,B;$ T) {3 M! L* R9 S' f8 g/ m
+ C- W- K4 r# C5 M. x
R = (Y0 + 1.14f*V); $ @+ m. w1 c! Y6 U3 N" @- V0 \
G=(Y0 - 0.39f*U-0.58f*V);   ( B: A1 g' W+ R' O9 v, B( f+ `
B=(Y0 +2.03f*U);
: Y5 h8 ]/ f& V/ Z. B4 [if(R<0) R =0;
! F( _; f( {2 d0 b+ a1 u; Nif(R>255) R=255;
) y; O( H% |' K' j8 `4 p# Bif(G<0) G =0;
5 z7 h& n2 }7 ?! q( Xif(G>255) G=255;/ D% L3 P4 Y8 M- z& ]3 `
if(B<0) B =0;( _% ?3 m3 p/ P% R
if(B>255) B=255;- P  X; c& W4 X0 }) s
*(RGBbuff) =     (BYTE)B;         
* x# D  V. d0 ?*(++RGBbuff) = (BYTE)G;5 C- L. \9 ^" M. v
*(++RGBbuff) = (BYTE)R;! e, I3 H7 h  p1 t4 h0 f. l
R = (Y1 + 1.14f*V);
* E$ |- d! N2 O  `G=(Y1 - 0.39f*U-0.58f*V);   
7 m! c% v, u+ j+ @0 zB=(Y1 +2.03f*U)   ;
) F. j1 O( S$ I0 d. b! j. Qif(R<0) R =0;3 i/ e9 l, O" p3 r
if(R>255) R=255;) [# }  p) Z3 I9 p7 a3 `7 k
if(G<0) G =0;
0 {8 Q1 W" G! [, l0 L/ s6 jif(G>255) G=255;# `; \! p) U& R! V0 r
if(B<0) B =0;! w" u: M1 N0 q& i. _) @
if(B>255) B=255;) g7 c- r, p- ]+ t6 ^
*(++RGBbuff) =     (BYTE)B;         
; Z  H. w, }+ |, {9 N*(++RGBbuff) = (BYTE)G;
1 V$ R- c+ X, F0 P. I*(++RGBbuff) = (BYTE)R;  R4 k, Z: c2 U0 i6 G
++RGBbuff;2 C7 c$ K5 I, a6 `8 ?# J7 |% K
}
2 P; {# ?- r& E0 P' q}
$ C' [$ o* M5 j# t; Y* I2 w% Uinline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
! U# A0 n, A( }6 x! B% w! E{/ S& @2 D  Y7 ~
; x' W, C3 `1 ]* P6 {# q. e& X0 z2 Z
// R = Y + 1.403V'( D; k) `9 Z' S
//G = Y - 0.344U' - 0.714V'
) x7 E( j+ j3 ]$ U  D+ b9 Q2 v//B = Y + 1.770U'2 G- _! N. B$ c, r/ c
BYTE *orgRGBbuff = RGBbuff;( ?0 ?4 T: g6 G5 d  W- I, o7 J8 ]
for(DWORD count=0;count<dwSize;count+=4)
( f+ d8 p8 d/ w: v' l{0 c8 [5 U  I+ h" C
//Y0 U0 Y1 V0
& _+ c( h$ U  X2 Z0 i5 Rfloat Y0 = *YUY2buff;3 ^) Z9 G: ~$ I  }  [
float U = *(++YUY2buff);* O2 b; ]$ g$ V# f# F
float Y1 = *(++YUY2buff);7 l$ Q9 A) `6 k3 v
float V = *(++YUY2buff);/ A; l' ]) y; ?" ]' ?+ |: G
++YUY2buff;9 W) v+ c. m; b4 q
float R,G,B;# q: o; u8 Y/ O: d: _; W# V5 z+ U, a+ A
/ X+ s3 [/ m7 U$ ^' {, @& {' O
R = (Y0 + 1.403f*V);
! u  n( N& j; o8 k4 X" jG=(Y0 - 0.344f*U-0.714f*V);   8 k, z9 H# M$ Z% z/ l' x( U
B=(Y0 +1.77f*U); 5 F7 |5 |4 N5 G% t7 Q
if(R<0) R =0;7 h" A7 A7 y" r) i
if(R>255) R=255;& V4 _6 Y$ t! T5 y) O
if(G<0) G =0;
0 K3 V3 o& O& @/ \if(G>255) G=255;
! Z6 |" V( T2 Z$ ?) H/ {- Pif(B<0) B =0;
, A1 p4 X7 Q& g1 E) q! `: P( gif(B>255) B=255;; i# V0 Q8 j: C! K
*(RGBbuff) =     (BYTE)R;         
, x$ {. i. f; g  O$ [/ [0 d*(++RGBbuff) = (BYTE)G;5 s2 n2 h- k! A% x" w) i
*(++RGBbuff) = (BYTE)B;
: q6 w2 M9 n9 L5 ^! u. |/ u& K5 p0 O0 m9 ~R = (Y1 + 1.403f*V);
" Q, s3 S3 A. XG=(Y1 - 0.344f*U-0.714f*V);   
/ d4 \# x2 V6 R# N3 ZB=(Y1 +1.77f*U);
" @  M+ y" G/ ^* x8 }& Wif(R<0) R =0;/ {3 ], r6 Y( \9 ~
if(R>255) R=255;- Z& b9 b7 Y; Z7 T
if(G<0) G =0;, O3 Y5 ?2 K- q6 m2 J
if(G>255) G=255;
& ]/ g  {8 K' {4 C6 n1 Xif(B<0) B =0;
" K7 ^6 l! }& a! Gif(B>255) B=255;
, f4 }# ?/ ?6 n5 F3 O1 Z*(++RGBbuff) =     (BYTE)R;         
3 c- a; @8 j1 Q  |*(++RGBbuff) = (BYTE)G;4 f2 H. w! y7 f# o" X) G  G1 B
*(++RGBbuff) = (BYTE)B;0 \; M) U5 |" ~- N) _
++RGBbuff;
8 a% A, i( i* s* M! W}" r3 c7 a& ?. Z( E2 L1 ]
}
' l, _; \5 I" a, x1 L% K, U! |2 Ginline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
; n1 v. g8 c8 \{
/ T/ s- n3 w: _. }' n. X//B = 1.164(Y - 16)         + 2.018(U - 128)
- {( g% b) d- y+ @//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)- o9 E3 R% T, r" o9 V9 z
//R = 1.164(Y - 16) + 1.596(V - 128)
3 M) c9 f, O- _7 TBYTE *orgRGBbuff = RGBbuff;) j% K% y/ N2 @5 j1 p5 t7 N
for(DWORD count=0;count<dwSize;count+=4)5 ~" i3 ^/ U. ?# R* b0 W0 N
{
5 g# q9 z8 J5 i' m//Y0 U0 Y1 V02 o& }8 ~; o# f7 y. U: w4 ~7 B
float Y0 = *YUY2buff;
1 e1 g9 D% `; Y3 w& V' ifloat U = *(++YUY2buff);
) s. ]- w" ?4 L6 y8 c! L' vfloat Y1 = *(++YUY2buff);
4 u$ o* c, |6 @$ h1 R& z9 Nfloat V = *(++YUY2buff);
! u  d$ K/ Q! q5 N++YUY2buff;
) k, s' ?: C. O, `: u, o*(RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           
  I6 [' J8 i) t/ f- Y*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   + X. A+ u, g# N3 z# z
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));        
  M- V- `% s* f- B  q*(++RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           
. Z1 R" c+ H$ t*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   ( e" q7 t# \; d" @/ d6 w: X: [
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));          4 |& M; g3 _- Y1 l
++RGBbuff;
- x$ n, [; S% G1 c) M
" L$ P' q( Z# Z& Z5 @}
( M  L) K; u) k# ]1 _7 h}/ Y: i4 f) E  @( {$ E( i
// http://msdn2.microsoft.com/en-us/library/ms893078.aspx
+ I- n+ G/ U' R1 B  H8 ^6 Fvoid VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)9 p* n4 K- i4 p' i# U( o. e
{' ?' d( W. k' x3 J- R; R
//% u+ o1 i/ |6 }$ r" c/ M% R6 @
//C = Y - 16" h9 V' i: @% W: R6 f2 H
//D = U - 128
3 w" C9 d- r5 Q: H/ D1 {0 ^% h% B//E = V - 1286 n0 w4 l0 t! g
//R = clip(( 298 * C           + 409 * E + 128) >> 8)7 j% e4 H7 I# e' f+ E; G
//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8). f6 }/ }2 M' S8 Q  q0 i! Y
//B = clip(( 298 * C + 516 * D           + 128) >> 8)
5 X& F. _7 G% a4 ]' L6 c: c4 J. HBYTE *orgRGBbuff = RGBbuff;
  e  k% o& L1 k+ W2 B: G% K0 afor(DWORD count=0;count<dwSize;count+=4)
' ]4 v+ O1 k! L{  _- Z! t9 h$ E& u) a
//Y0 U0 Y1 V0
& B* H* P4 U# Z& v6 sBYTE Y0 = *YUY2buff;& N' v) j' M! i7 n$ {( G
BYTE U = *(++YUY2buff);( Y$ K" E: @4 T2 r9 H/ g
BYTE Y1 = *(++YUY2buff);
4 a) z  _# r/ U5 ~9 {( ~BYTE V = *(++YUY2buff);7 @0 E% l# x6 t' Y
++YUY2buff;
/ y" `" L: Y6 y7 d0 N: y- VLONG Y,C,D,E;
: k5 N( K1 E1 z4 c% O  [BYTE R,G,B;
! ?' c5 R' N9 G0 K' ?" p, }# n# ?
( a# E2 k0 K; i) S  AY = Y0;
( S! j6 L2 T" gC = Y-16;+ ~8 B5 i' V* U8 w; j. c5 p0 L
D = U-128;2 w. D# B# L* h- e7 c1 l
E = V-128;+ b# b/ C7 @& e& A/ b  D
R = clip255(( 298 * C           + 409 * E + 128) >> 8);
% @! q' t' d4 q9 k+ t: o7 YG = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);* Y: S- w( X- j/ R
B = clip255(( 298 * C + 516 * D           + 128) >> 8);
4 g' Y7 E$ N1 {*(RGBbuff) =   B;           
# D9 d8 Q/ \$ O3 o, s*(++RGBbuff) = G;   
! @1 X; c% j; t# O*(++RGBbuff) = R;        
8 i9 ~) m& A+ w* `/ M+ Z2 jY = Y1;
1 }4 q/ d+ I' I# T6 C( w0 PC = Y-16;
6 ^) s- L# q- |% Y* ?/ DD = U-128;
3 O- E: e# ], U/ ^E = V-128;
% Q* O) r" }; X# hR = clip255(( 298 * C           + 409 * E + 128) >> 8);
: f- O! J3 ?' UG = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);
1 X4 _" i# A3 @  @6 O+ s8 }; vB = clip255(( 298 * C + 516 * D           + 128) >> 8);9 G1 U4 C2 n( x' y2 B
*(++RGBbuff) =   B;           
: P# E9 K2 o$ I: `*(++RGBbuff) = G;   * n3 A- _. h' O) G9 J' i# F  J
*(++RGBbuff) = R;         2 u7 w& S$ ^/ Y$ h+ e$ ~! q
++RGBbuff;7 \9 z' B. d* S0 X1 J' Z

" z7 V9 }, h3 i2 b}2 h. v6 r) {6 q$ V. `
}
! ~$ q+ W' X, h( D- e% O# BBYTE VC4000Graber::clip255(LONG v)4 {8 L# X* n. u. j4 r! S
{
7 a9 T, E$ d7 v, ]3 _if(v<0) v=0;
# i" J: \7 H7 q! g- uelse if(v>255) v=255;
" |5 x& S5 Y# n' S2 G( Q3 Jreturn (BYTE)v;
9 z' y+ {- O" A/ z/ ~& T}& N# N% t$ ]$ n% k2 G

/ x4 }/ }; D' }4 j; Q, W本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hardVB/archive/2007/10/18/1831810.aspx
* I4 h' L4 C4 a2 O- T% N5 f6 x/ G# r: _6 ^; k$ Q3 W
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-14 14:44 , Processed in 0.019165 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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