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

YUV像素和RGB之间的转换

[复制链接]
发表于 2011-5-30 09:56:44 | 显示全部楼层 |阅读模式
RGB转成YUV(RGB to YUV Conversion)
+ ]! {! Y- x7 Y# @0 i+ [" `Y  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16! x" K' P4 ]& e' P4 G2 H2 T7 v
Cr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
8 l1 c( @& x$ V% X' }5 t/ PCb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128YUV转成RGB(YUV to RGB Conversion)
! J# g4 q( K' d+ p- AB = 1.164(Y - 16)                   + 2.018(U - 128)8 S  Q6 [5 E$ k# G. w
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)  s. ^) s/ L2 r, N
R = 1.164(Y - 16) + 1.596(V - 128)6 ^) s* x! Y' N2 q
R, G, B, Y , Cr, Cb的取值范围都是[0,255].7 Y+ [) v# K* t- e2 y, o
! q; l, N1 y& m9 U  U9 L7 C
原文:http://www.rosoo.net/a/200604/6049.html; ~, z% f/ ~  u- H+ w
 楼主| 发表于 2011-5-30 17:08:39 | 显示全部楼层

YUY2视频转化RGB格式

//YUY2视频转化RGB格式 by hardy 2007-10-17
- E2 r0 l- Q$ n1 c1 n* w: b8 e//http://www.fourcc.org/fccyvrgb.php
# ~8 [% j- n8 \" @: Finline void YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)( W* E5 I; r3 R% F: _4 }
{
' C+ C6 i- y" K) I//B = 1.164(Y - 16)         + 2.018(U - 128)& W$ x# U0 ?" S1 K/ c
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
; a$ P; `; a- _# ^//R = 1.164(Y - 16) + 1.596(V - 128)
- o: d7 G' I- Z9 H* ]" q9 x* }BYTE *orgRGBbuff = RGBbuff;
5 z8 \/ b1 _5 t  Z* w0 ^6 n3 efor(DWORD count=0;count<dwSize;count+=4)2 J( ~! @" L. o; `7 r6 O
{
5 K6 u. J' f$ s//Y0 U0 Y1 V0: G2 B+ M. N: k& e8 @
float Y0 = *YUY2buff;
9 r- M: `2 ^$ A) @# N. ]  J' K- `float U = *(++YUY2buff);$ X! W7 g$ f8 s  {8 t& j
float Y1 = *(++YUY2buff);2 V. ?1 p. W. f
float V = *(++YUY2buff);" S1 `7 P4 w* s2 K$ T
++YUY2buff;  u: x8 k4 {0 R/ r
*(RGBbuff) =   (BYTE)(Y0 + (1.370705 * (V-128)));           
# w7 T& }* Y, [7 M*(++RGBbuff) = (BYTE)(Y0 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   
; o* M1 U# {0 C. X8 y*(++RGBbuff) = (BYTE)(Y0 + (1.732446 * (U-128)));        4 s7 e, d5 o* ^3 r
*(++RGBbuff) = (BYTE)(Y1 + (1.370705 * (V-128)));           # W- y7 i1 `: x- d# s5 ]
*(++RGBbuff) = (BYTE)(Y1 - (0.698001 * (V-128)) - (0.337633 * (U-128)));   # O# u2 m! o$ i& U+ s- t5 y
*(++RGBbuff) = (BYTE)(Y1 + (1.732446 * (U-128)));         9 x6 c5 y3 A8 i2 v5 r( |3 D! p8 j# I; J7 u
++RGBbuff;
& i# q% t6 D+ i( C1 s}8 x4 F8 U; u0 P7 ?9 l5 M. M
}; Z7 k0 q- P/ n  d2 h# t
inline void YUY2_RGB2(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
  f. L4 t3 q/ A' l: _1 ~, ]3 ~{
2 r2 c+ ]4 ~% ]9 f# B$ I4 e( ^# s//R = Y + 1.14V) t+ r2 h" ^* J8 ~" v) V, X
//G = Y - 0.39U - 0.58V, o/ g4 K( p6 n; l* K0 _
//B = Y + 2.03U
6 x* i% T6 O9 {: h// R = Y + 1.403V'
, w+ x2 y3 I6 d//G = Y - 0.344U' - 0.714V'
/ d  E7 j4 y" e% ?; f1 G2 m//B = Y + 1.770U'; H  W. O9 S9 Y; B
BYTE *orgRGBbuff = RGBbuff;
1 {& j; y3 w9 mfor(DWORD count=0;count<dwSize;count+=4); x7 v* F' {) N7 m
{
% B( T' t2 R8 g4 P//Y0 U0 Y1 V05 j% k( P+ o  c* m
float Y0 = *YUY2buff;
7 z: [2 F% ]7 ~- ~2 Bfloat U = *(++YUY2buff);
4 _* }/ \6 \" d9 @1 @1 yfloat Y1 = *(++YUY2buff);* H7 G2 Y7 S8 p, P4 G6 `
float V = *(++YUY2buff);" k! B4 ]# ^+ v9 D( h% B
++YUY2buff;
+ B2 ]" {3 k1 W0 @, xfloat R,G,B;
6 s3 D3 K! z" E5 Q/ q/ k4 T$ y, S( f: Q, F- o
R = (Y0 + 1.14f*V);
' e1 s8 _# C( b) }4 o+ r8 s" \G=(Y0 - 0.39f*U-0.58f*V);   
. k8 M. T: N( r; O) TB=(Y0 +2.03f*U);
* M' R, ~" H% Z5 T8 Nif(R<0) R =0;
- h" ^4 ]3 t4 Q2 j! @9 tif(R>255) R=255;; Y# d" n1 M, R; c+ V
if(G<0) G =0;
3 [4 ?) k5 [9 P4 @5 rif(G>255) G=255;
/ C! @! a  r, f/ w- Qif(B<0) B =0;
% r8 K. f3 J) l. q0 c% lif(B>255) B=255;/ M& |/ t' j0 O2 m9 K" p3 ^, {& G
*(RGBbuff) =     (BYTE)B;          + X' ?' H0 c/ F2 x3 {: O/ s
*(++RGBbuff) = (BYTE)G;9 i! Z$ b& X0 v/ E/ F
*(++RGBbuff) = (BYTE)R;% U9 f' L) |. Z
R = (Y1 + 1.14f*V);
0 i2 T/ M. R- n% l4 X+ g2 o% XG=(Y1 - 0.39f*U-0.58f*V);   
6 L5 L" @0 a! n* M, `- i, FB=(Y1 +2.03f*U)   ; : E# r" @: ]: ]% C# B; O
if(R<0) R =0;6 T. T, I) R  ?
if(R>255) R=255;
/ E' H! u. s0 ~) A  Q8 e* d& a; @if(G<0) G =0;
2 T! D  K" `6 Wif(G>255) G=255;, p, z7 M$ P. C8 f8 F9 Y2 a
if(B<0) B =0;% q$ ~8 ~+ v) _+ i7 y$ q
if(B>255) B=255;
' @$ `# I4 L0 I) I! p*(++RGBbuff) =     (BYTE)B;         
' s; _5 O* k0 z* @# v7 P*(++RGBbuff) = (BYTE)G;
. M1 H3 M$ Z% V2 C* |*(++RGBbuff) = (BYTE)R;0 d$ ?( I' g) L, u7 y$ H& \% @
++RGBbuff;
" e6 v6 T* c& j; F  {/ U}* s" c7 a7 g4 L+ w+ h* _
}
2 ?: V+ O- L4 {$ Qinline void YUY2_RGB4(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
9 B) i2 O4 f: c, P) u{8 K! D5 e4 M, X  M- e4 ]% Z( x! E9 i
# b3 U' i: d' d
// R = Y + 1.403V'
  H, b2 ]8 E4 F# }0 r/ l- W//G = Y - 0.344U' - 0.714V'
4 T' e  f  e% \& \& E. @1 m//B = Y + 1.770U': B0 _6 D5 R7 E# z
BYTE *orgRGBbuff = RGBbuff;" G- \+ X. k$ l  L
for(DWORD count=0;count<dwSize;count+=4)
1 z9 w3 y# h) E; F{
; Z9 Y' @0 B$ i; j8 f//Y0 U0 Y1 V0. x. Z" S/ [& m
float Y0 = *YUY2buff;
1 k4 Z* I7 S( a" Xfloat U = *(++YUY2buff);
. q% @9 E2 N+ a" e( M4 ?float Y1 = *(++YUY2buff);
3 I" N7 N8 Y8 h/ Bfloat V = *(++YUY2buff);
) S; l) `  M2 o: c+ h2 G  m++YUY2buff;
+ p5 C0 m9 T) v0 _# d, x) h# K' Lfloat R,G,B;
9 W+ R' Q) W  |  \# I2 w
6 }# a$ S& \0 q+ ^R = (Y0 + 1.403f*V);
) T1 u( i: C" ~0 N( C( T! DG=(Y0 - 0.344f*U-0.714f*V);   7 u) a) z% p' Z4 D' ^  s
B=(Y0 +1.77f*U);
* {; q- l9 f" J# tif(R<0) R =0;& w; F8 y5 |$ `! p8 g, F
if(R>255) R=255;
3 S: L8 a4 c  \8 \. Hif(G<0) G =0;
- H" @8 R5 i; p: A! n2 `0 I+ eif(G>255) G=255;
3 ^3 F  g1 i2 G* l) [3 I% y. {) R# A/ eif(B<0) B =0;$ t+ ~. U" R+ f/ ?
if(B>255) B=255;
! Z8 ?' ]. ?" U' |6 F" Q$ g+ @*(RGBbuff) =     (BYTE)R;         
+ ~/ S7 [) O% U*(++RGBbuff) = (BYTE)G;
* Y3 }& G/ A: y- B' S* U*(++RGBbuff) = (BYTE)B;
; i8 ~9 n4 y3 s9 _R = (Y1 + 1.403f*V);
1 j, M  f# V$ z: P% Z& w3 kG=(Y1 - 0.344f*U-0.714f*V);   
" M# R9 n* C6 O$ I( RB=(Y1 +1.77f*U);
* H; ]6 o8 s6 s" o9 ~' R; V6 \9 g8 Pif(R<0) R =0;; R  p) b+ g( b& a
if(R>255) R=255;( w( U$ L6 A  c3 ?# J' ?! `( ^
if(G<0) G =0;3 B; z- `, k6 f7 s
if(G>255) G=255;7 ]" }  ?3 |/ y
if(B<0) B =0;, O9 A/ S+ P) j/ }
if(B>255) B=255;/ ?- G4 p. `* d0 Z0 e$ B
*(++RGBbuff) =     (BYTE)R;         
# [1 p/ G+ S2 V" q4 `) w( h*(++RGBbuff) = (BYTE)G;
# ]( \6 t  E" a; W, Y*(++RGBbuff) = (BYTE)B;
8 _/ \0 U! O3 c# g: N* F6 \0 p& m  v++RGBbuff;; }% }6 R1 u/ E3 n! _
}
: S8 R) q# S2 b$ i9 ?) u. N. T4 G}
+ s$ ~* H0 W9 ^" h, I. S- winline void YUY2_RGB3(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
+ B# _3 \1 O" q{; f7 ?: O' E/ ]2 S$ g
//B = 1.164(Y - 16)         + 2.018(U - 128)) N2 }' w! F9 f8 E6 g) L+ r# G
//G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128): V1 h( p* Z5 P0 F% g  T
//R = 1.164(Y - 16) + 1.596(V - 128)
. b7 ^, ~: o' n) M" _% rBYTE *orgRGBbuff = RGBbuff;2 j) ]0 J* |) C9 y8 Y' w6 i
for(DWORD count=0;count<dwSize;count+=4)
- y( D3 V# v% y2 A{- E3 |+ G) {, u  V- u3 G+ }
//Y0 U0 Y1 V0
5 {) w0 S1 i/ ~float Y0 = *YUY2buff;! s+ j& P7 D* J2 l: D) L
float U = *(++YUY2buff);! x/ V6 [5 _: e% f3 Y
float Y1 = *(++YUY2buff);
! ~4 @1 C* a: T" V: L7 y5 e5 ^1 ?float V = *(++YUY2buff);1 b6 E3 ], Z& |) Y
++YUY2buff;
- ?+ \3 s3 [9 m2 I$ k  a- H*(RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           
: A  j) Z1 H; I- v*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   5 r  |8 Y2 @  y/ ?
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));        
" g* ^5 L1 B  d0 O) d! u*(++RGBbuff) =   (BYTE)(1.164f*(Y0 - 16)+ 2.018f*(U - 128));           
( j4 g! j/ h6 E1 h*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) - 0.813f*(V - 128) - 0.391f*(U - 128));   3 W6 h4 D/ @2 T. Y
*(++RGBbuff) = (BYTE)(1.164f*(Y0 - 16) + 1.596f*(V - 128));          7 M$ Y6 s: z6 G; n
++RGBbuff;; \2 `3 [2 P( R2 ^  N* D. G

9 |* d8 Y! X0 L, P, n9 u" Y}
9 p4 I0 a9 R* i# ^0 D( m! x}( M3 |: T; J+ I' U; B
// http://msdn2.microsoft.com/en-us/library/ms893078.aspx
# B1 L" |% F' W4 K& u0 D: ?void VC4000Graber::YUY2_RGB(BYTE *YUY2buff,BYTE *RGBbuff,DWORD dwSize)
- b  o' d! L! Y! ~{% O- g! L% ^& ^* B# A1 G/ v
//% `; s8 S! V5 |0 s5 O
//C = Y - 16
' W) K  w8 Z: m//D = U - 128& I( m* E' v! o8 M! I" y
//E = V - 128
: H' v4 }' s# v4 m//R = clip(( 298 * C           + 409 * E + 128) >> 8)4 E" G5 S, n5 C, C% ?
//G = clip(( 298 * C - 100 * D - 208 * E + 128) >> 8)
# @# @# f( O' o, L9 t//B = clip(( 298 * C + 516 * D           + 128) >> 8)
5 W( n' Y/ p6 U; BBYTE *orgRGBbuff = RGBbuff;
& U8 O: F0 H' ufor(DWORD count=0;count<dwSize;count+=4). C/ Q2 u0 {' ]# |9 B2 ^- j. m
{
; H8 A, F0 L% n$ w% ?; j//Y0 U0 Y1 V04 t4 q9 q, X, D9 `
BYTE Y0 = *YUY2buff;
, l- F  {+ U/ RBYTE U = *(++YUY2buff);
9 Z, l& L4 ~" Y; L& [2 eBYTE Y1 = *(++YUY2buff);
% F+ g' K" r# {2 o0 _+ Z% j* d1 Q! |1 wBYTE V = *(++YUY2buff);0 [& G2 C) B8 F; K5 n  n
++YUY2buff;
2 {% |% k/ B' V* d( ~  }# gLONG Y,C,D,E;
6 d; p! d+ ?1 {$ F  J' O' D2 JBYTE R,G,B;
- M. W* a4 M2 B; @! G
/ k0 P; {% c- W& O& a% iY = Y0;
; S! c6 E- q+ V$ z) _C = Y-16;
5 R; A6 Y/ b: [7 ]  GD = U-128;
: {# L  m9 m  N4 k8 {E = V-128;! H- `$ N+ _8 q- C! l, i, b
R = clip255(( 298 * C           + 409 * E + 128) >> 8);
/ p! M9 X; y  M3 \G = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);( i- P! n4 |& v7 R6 ^+ z
B = clip255(( 298 * C + 516 * D           + 128) >> 8);
$ [, r1 e/ r6 u, W: Z*(RGBbuff) =   B;           
% x4 k; i' i) k*(++RGBbuff) = G;   " r) P; ^0 o: j- l. _4 l! D
*(++RGBbuff) = R;        
# u( U7 s6 Z# i2 f" D  uY = Y1;: E1 B% y3 Z$ F* ^# I! s
C = Y-16;
$ |, O9 Q. n3 fD = U-128;# r! ^  m' v/ J9 d6 t( E1 F, @
E = V-128;3 ]9 ^; p" P# m9 k% t* T
R = clip255(( 298 * C           + 409 * E + 128) >> 8);
( U5 R7 S% D/ C3 C+ {/ Y% MG = clip255(( 298 * C - 100 * D - 208 * E + 128) >> 8);& [7 h3 J; ^" U
B = clip255(( 298 * C + 516 * D           + 128) >> 8);4 T6 X- J0 ^- C/ c
*(++RGBbuff) =   B;           
, T0 A) b) J' J*(++RGBbuff) = G;   % e6 F  j; @2 o% G0 ~8 W+ ^. D
*(++RGBbuff) = R;         ) A* j! T' o! ~
++RGBbuff;( ~+ T# m/ _1 T4 W# ^- |2 N% A4 _

5 S6 e3 F2 y, Y) @1 Z}
! p2 Z  e; [+ q# g; @7 _* O}
; O, U% B! _% L0 h' ?BYTE VC4000Graber::clip255(LONG v)
4 B  D9 Z  L% S, h, q# `1 n6 ]9 U{: c. b2 k4 J7 F2 Z
if(v<0) v=0;
, S( M* j9 z- r/ C, @: ?& p7 N; \else if(v>255) v=255;/ `: _% y% R# T& o: m5 a
return (BYTE)v;
) H+ [2 J& y! \: y. o}
- n  v/ }+ ]% ]5 Z% v: V
) D  K5 W( M3 n, V- V本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hardVB/archive/2007/10/18/1831810.aspx
5 x! Z! T* B" J4 u2 w& ~: W6 T9 C- I+ n9 Y
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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