在Python OpenCV中解码YUV图像
我有一张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格式可能需要对代码做一些细微的调整。