Android Camera视频流格式转换(YUV420SP–RGB)

时间: 2012-04-02 / 分类: 资料积累 / 浏览次数: 2,656 views / 1个评论 发表评论

         Android允许用户实时捕获摄像头的视频流,这在利用摄像头的AR应用中非常有用。可以利用摄像流实时做画面图像的分析,并做出许多有用的应用。比如人脸识别,条码识别,特定图像替换等等.

        不过大多数图像处理软件在处理时是需要RGB格式的图像,而默认的视频流是压缩的YUV格式,Android下也只能得到编码为YUV420SP的视频流。这就需要把YUV420SP的视频流转换成RGB格式的图像,用于图像识别。

特贴出一个YUV420SP转RGB的格式转换函数,方便大家使用。

代码如下:

  1.  /** 
  2. *:YUV420SP解码的方式 
  3. *yuv420sp[]为原始的数据 
  4. *width为图片位图长,height为图片位图高 
  5. *rgbBuf[]是用于存贮原始数据经过解码后的r g b三元色数据 
  6. */  
  7. static public void decodeYUV420SP(byte[] rgbBuf,byte[] yuv420sp,int width,int height) {     
  8.               //定义单通道数据长度  
  9.         final int frameSize = width * height;     
  10.              //如果传进来的rgbBuf 为空,则抛出空指针异常  
  11.     if (rgbBuf == null)     
  12.         throw new NullPointerException("buffer 'rgbBuf' is null");      
  13.        //如果传进来的rgbBuf 为比三通道数据长度小,则抛出异常,并打出相应信息  
  14.     if (rgbBuf.length < frameSize * 3)     
  15.         throw new IllegalArgumentException("buffer 'rgbBuf' size "    
  16.                  + rgbBuf.length + " < minimum " + frameSize * 3);     
  17.        //如果传进来的yuv420sp 为空,则抛出空指针异常  
  18.     if (yuv420sp == null)     
  19.         throw new NullPointerException("buffer 'yuv420sp' is null");     
  20.       //如果传进来的rgbBuf 为比三通道数据长度的一半小,则抛出异常,并打出相应信息  
  21.     if (yuv420sp.length < frameSize * 3 / 2)     
  22.         throw new IllegalArgumentException("buffer 'yuv420sp' size " 
  23.                     + yuv420sp.length" < minimum " + frameSize * 3 / 2);     
  24.            //经过上面的叛断,我们正式进行解码了  
  25.         int i = 0, y = 0;     
  26.         int uvp = 0, u = 0, v = 0;    
  27.                //r g b 三元色初始化   
  28.         int y1192 = 0, r = 0, g = 0, b = 0;     
  29.              //下面的两个for循环都只是为了把第一个像素点的的R G B读取出来,就是一行一行循环读取.  
  30.         for (int j = 0, yp = 0; j < height; j++) {     
  31.              uvp = frameSize + (j >> 1) * width;     
  32.              u = 0;     
  33.              v = 0;     
  34.             for (i = 0; i < width; i++, yp++) {     
  35.                  y = (0xff & ((int) yuv420sp[yp])) - 16;     
  36.                 if (y < 0) y = 0;     
  37.                 if ((i & 1) == 0) {     
  38.                      v = (0xff & yuv420sp[uvp++]) - 128;     
  39.                      u = (0xff & yuv420sp[uvp++]) - 128;     
  40.                  }     
  41.                      
  42.                  y1192 = 1192 * y;     
  43.                  r = (y1192 + 1634 * v);     
  44.                  g = (y1192 - 833 * v - 400 * u);     
  45.                  b = (y1192 + 2066 * u);     
  46.                    //始终持 r g b在0 - 262143  
  47.                 if (r < 0) r = 0else if (r > 262143) r = 262143;     
  48.                 if (g < 0) g = 0else if (g > 262143) g = 262143;     
  49.                 if (b < 0) b = 0else if (b > 262143) b = 262143;     
  50.                    //安位运算,分别将一个像素点中的r g b 存贮在rgbBuf中  
  51.                  rgbBuf[yp * 3] = (byte)(r >> 10);     
  52.                  rgbBuf[yp * 3 + 1] = (byte)(g >> 10);     
  53.                  rgbBuf[yp * 3 + 2] = (byte)(b >> 10);     
  54.              }     
  55.          }     
  56.        }    
  57.   

转载http://m-ittrue.iteye.com/blog/758410



.

*******************************************************************

上面是广告! 真的是广告!! 真的真的啊!!!

  1. 说明一件事情: 其实YUV里面的Y分量 就是0~255的灰度图,如果为这个 转换RGB的话 没有这个必要

-----------------------------------------------------Copyright © 2011-2012--浙ICP备12011997---------------------------- ---------------------- ------------------------

无觅相关文章插件,快速提升流量