2016-12-26 169 views
0

我正在制作一个Android应用程序,通过互联网发送预览屏幕的图像。 YUV图像的字节被发送。我想将此YUV NV21图像转换为RGB色彩空间。我看了这个链接的转换函数http://www.41post.com/3470/programming/android-retrieving-the-camera-preview-as-a-pixel-array。并写了一个Python代码,做同样的事情。这是python代码。在Python中将YUV420sp转换为RGB

import numpy as np 
from struct import unpack 

def nv21torgb(byarray,width,height): 
    img = np.ndarray(shape=(height,width,3),dtype=np.uint8) 
    xra = range(height) 
    yra = range(width) 
    frameSize = width*height 
    yp = 0 
    for j in xra: 
     uvp = frameSize + (j >> 1)*width 
     u = 0 
     v = 0 
     for i in yra: 
      y = unpack('B',byarray[yp])[0] - 16 
      if i & 1 is 0: 
       v = unpack('B',byarray[uvp])[0] - 128 
       uvp = uvp + 1 
       u = unpack('B',byarray[uvp])[0] - 128 
       uvp = uvp + 1 
      y1192 = 1192 * y 
      r = y1192 + 1634*v 
      g = y1192 - 833*v - 400*u 
      b = y1192 + 2066*u 
      if r<0: 
       r = 0 
      elif r>262143: 
       r = 262143 
      if g < 0: 
       g = 0 
      elif g>262143: 
       g = 262143 
      if b<0: 
       b = 0 
      elif b>262143: 
       b = 262143 
      r = ((r<<6)&0xff0000)>>16 
      g = ((g>>2)&0xff00)>>8 
      b = ((b>>10)&0xff) 
      img[j][i] = [r,g,b] 
    return img 

但是这个函数似乎错了某处,因为我越来越奇怪的输出。 image

感谢您的帮助:)

回答

0

我想你忘了增加YP与每个迭代。请参阅您链接的代码的第88行。