在Python OpenCV中解码YUV图像

时间:2014-05-20 06:53:36

标签: python opencv

我有一个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 个答案:

答案 0 :(得分:1)

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

我最终使用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格式将需要对代码进行细微更改。