在Python OpenCV中解码YUV图像

3 投票
1 回答
10591 浏览
提问于 2025-04-18 07:04

我有一张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格式可能需要对代码做一些细微的调整。

撰写回答