2016-12-26 6 views
0

Я делаю приложение для Android, которое отправляет изображения экрана предварительного просмотра через Интернет. байты изображения YUV отправляются. Я хочу преобразовать это изображение YVV NV21 в цветовое пространство RGB. Я посмотрел на функцию преобразования по этой ссылке http://www.41post.com/3470/programming/android-retrieving-the-camera-preview-as-a-pixel-array. И написал код python, выполняющий samethinng. Вот код python.Преобразование из YUV420sp в RGB в python

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 связанного кода.