在Python的OpenCV中解码YUV图像

3

我有一个YUV420_SP_NV21图像,它以字节数组的形式表示(没有头部),从Android预览帧中获取,并且我需要将其解码为RGB图像。 我以前在Android应用程序中使用Java和OpenCV4Android做过这件事:

convert_mYuv = new Mat(height + height / 2, width, CvType.CV_8UC1);
convert_mYuv.put( 0, 0, data );
Imgproc.cvtColor( convert_mYuv, convert_mRgba, type, channels );

我尝试用Python做同样的事情:

nmp = np.array(byteArray, dtype=np.ubyte) RGBMatrix = cv2.cvtColor(nmp,cv2.COLOR_YUV420P2RGB)

但是RGBMatrix仍然是None

我知道可以自己完成这个操作,熟悉公式,但很想用OpenCV的方式来实现。如何实现?

我还尝试了cv2.imdecode(),但它也失败了,可能是我误用了它。

1个回答

3

我解决这个问题已经有一段时间了,但我没有时间更新这个问题。

最终我使用numpy将YUV420_SP_NV21字节数组提取到完整的YUV图像(在我的情况下是1280x720),然后使用OpenCV将其转换为RGB格式。

    import cv2 as cv2        # OpenCV import
    def YUVtoRGB(byteArray):

        e = 1280*720
        Y = byteArray[0:e]
        Y = np.reshape(Y, (720,1280))

        s = e
        V = byteArray[s::2]
        V = np.repeat(V, 2, 0)
        V = np.reshape(V, (360,1280))
        V = np.repeat(V, 2, 0)

        U = byteArray[s+1::2]
        U = np.repeat(U, 2, 0)
        U = np.reshape(U, (360,1280))
        U = np.repeat(U, 2, 0)

        RGBMatrix = (np.dstack([Y,U,V])).astype(np.uint8)
        RGBMatrix = cv2.cvtColor(RGBMatrix, cv2.COLOR_YUV2RGB, 3)

我的原始数据是YUV420_SP_NV21格式的,解码方式如下:YY...YVUVUVU...VU, 但其他YUV格式需要对代码进行微调。


要实际读取文件,需要执行以下操作:with open(yuv_path, 'rb') as w: mat = YUVtoRGB(np.frombuffer(w.read(), dtype=np.uint8)) - Wojciech Walczak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接