我有一个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()
,但也失败了,可能是因为我错过了使用它。
答案 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格式将需要对代码进行细微更改。