YUV420SP格式图片转RGB

 

static public void decodeYUV420SP( int [] rgb, byte [] yuv420sp, int width, int height) {
     final int frameSize = width * height;
 
     for ( int j = 0 , yp = 0 ; j < height; j++) {
         int uvp = frameSize + (j >> 1 ) * width, u = 0 , v = 0 ;
         for ( int i = 0 ; i < width; i++, yp++) {
             int y = ( 0xff & (( int ) yuv420sp[yp])) - 16 ;
             if (y < 0 ) y = 0 ;
             if ((i & 1 ) == 0 ) {
                 v = ( 0xff & yuv420sp[uvp++]) - 128 ;
                 u = ( 0xff & yuv420sp[uvp++]) - 128 ;
             }
 
             int y1192 = 1192 * y;
             int r = (y1192 + 1634 * v);
             int g = (y1192 - 833 * v - 400 * u);
             int b = (y1192 + 2066 * u);
 
             if (r < 0 ) r = 0 ; else if (r > 262143 ) r = 262143 ;
             if (g < 0 ) g = 0 ; else if (g > 262143 ) g = 262143 ;
             if (b < 0 ) b = 0 ; else if (b > 262143 ) b = 262143 ;
 
             rgb[yp] = 0xff000000 | ((r << 6 ) & 0xff0000 ) | ((g >> 2 ) & 0xff00 ) | ((b >> 10 ) & 0xff );
         }
     }
}

 

考虑到需要做识别,自然得先把它转成灰度图像,经典心理公式Gray = R*0.299 + G*0.587 + B*0.114出场了,但是手机的计算速度不那么快,这样的浮点运算还是尽量避免吧~ 于是考虑Gray = (R*299 + G*587 + B*114 + 500) / 1000或者Gray = (R*30 + G*59 + B*11 + 50) / 100。但是除法总是还是不够快,用移位吧……Gray = (R*19595 + G*38469 + B*7472) >> 16,稍微小一点,用Gray = (R*38 + G*75 + B*15) >> 7

你可能感兴趣的:(YUV420SP格式图片转RGB)