Преобразование из YUV420sp в RGB в Python

Я делаю приложение для 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

Но эта функция где-то кажется неправильной, потому что я получаю странный вывод. образ

Спасибо за помощь:)

1 ответ

Я думаю, что вы забыли увеличивать yp с каждой итерацией. Обратитесь к строке 88 кода, который вы связали.

Другие вопросы по тегам