How to perform RGB->YUV conversion in C/C++?

前端 未结 2 920
闹比i
闹比i 2020-12-05 16:01

How to perform RGB->YUV conversion in C/C++?

I have some Bitmap.. RGB I need to convert it to YUV

Libs? Tuts? Articles?

相关标签:
2条回答
  • 2020-12-05 16:33

    Check this article: http://www.fourcc.org/fccyvrgb.php Conversion is quite easy so you probably could write your own function based on this

    Y  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
    
    Cr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
    
    Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128
    

    Previously answered for ActionScript

    0 讨论(0)
  • 2020-12-05 16:41

    You might also want to try these integer only calculations (should be faster than floats)

    #define CLIP(X) ( (X) > 255 ? 255 : (X) < 0 ? 0 : X)
    
    // RGB -> YUV
    #define RGB2Y(R, G, B) CLIP(( (  66 * (R) + 129 * (G) +  25 * (B) + 128) >> 8) +  16)
    #define RGB2U(R, G, B) CLIP(( ( -38 * (R) -  74 * (G) + 112 * (B) + 128) >> 8) + 128)
    #define RGB2V(R, G, B) CLIP(( ( 112 * (R) -  94 * (G) -  18 * (B) + 128) >> 8) + 128)
    
    // YUV -> RGB
    #define C(Y) ( (Y) - 16  )
    #define D(U) ( (U) - 128 )
    #define E(V) ( (V) - 128 )
    
    #define YUV2R(Y, U, V) CLIP(( 298 * C(Y)              + 409 * E(V) + 128) >> 8)
    #define YUV2G(Y, U, V) CLIP(( 298 * C(Y) - 100 * D(U) - 208 * E(V) + 128) >> 8)
    #define YUV2B(Y, U, V) CLIP(( 298 * C(Y) + 516 * D(U)              + 128) >> 8)
    
    // RGB -> YCbCr
    #define CRGB2Y(R, G, B) CLIP((19595 * R + 38470 * G + 7471 * B ) >> 16)
    #define CRGB2Cb(R, G, B) CLIP((36962 * (B - CLIP((19595 * R + 38470 * G + 7471 * B ) >> 16) ) >> 16) + 128)
    #define CRGB2Cr(R, G, B) CLIP((46727 * (R - CLIP((19595 * R + 38470 * G + 7471 * B ) >> 16) ) >> 16) + 128)
    
    // YCbCr -> RGB
    #define CYCbCr2R(Y, Cb, Cr) CLIP( Y + ( 91881 * Cr >> 16 ) - 179 )
    #define CYCbCr2G(Y, Cb, Cr) CLIP( Y - (( 22544 * Cb + 46793 * Cr ) >> 16) + 135)
    #define CYCbCr2B(Y, Cb, Cr) CLIP( Y + (116129 * Cb >> 16 ) - 226 )
    
    0 讨论(0)
提交回复
热议问题