我正在创建一个Android应用程序,通过互联网发送预览屏幕的图像。发送YUV图像的字节。我想将这个YUV NV21图像转换为RGB色彩空间。我查看了此链接http://www.41post.com/3470/programming/android-retrieving-the-camera-preview-as-a-pixel-array中的转化功能。并写了一个python代码做同样的事情。这是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 :(得分:0)
我想你忘了每次迭代都增加yp。请参阅您链接的代码的第88行。