正常RGB 转 NV21思路:
1:RGB转YUV(与系数矩阵相乘,具体可百度)
2:YUV转NV21(此时YUV的行数是RGB的1.5倍,后1-1.5倍行的UV需要调整,NV21先V后U)
3:写NV21数据
存在问题:python的for循环挨个写入太慢了,一张4K*3K的JPG图转YUV需要10S以上;
快速实现RGB 转 NV21思路(4K*3K图仅需0.3S):
1:利用CV2自带的BGR转I420(I420的格式排列请咨询百度,与NV21很相似)
yuvData = cv2.cvtColor(rgbData, cv2.COLOR_BGR2YUV_I420)
2:I420转NV21,利用numpy矩阵加速运算
height = rgbData.shape[0]
width = rgbData.shape[1]
uData = yuvData[height: height + height // 4, :]
uData = uData.reshape((1, height // 4 * width))
vData = yuvData[height + height // 4: height + height // 2, :]
vData = vData.reshape((1, height // 4 * width))
uvData = np.zeros((1, height // 4 * width * 2))
uvData[:, 0::2] = vData
uvData[:, 1::2] = uData
uvData = uvData.reshape((height // 2, width))
nv21Data = np.zeros((height + height // 2, width))
nv21Data[0:height, :] = yuvData[0:height, :]
nv21Data[height::, :] = uvData
3:本地写入NV21数据
对于一张4656*3492分辨率的图,耗费时间由12秒左右提升至0.3秒,效率提升40倍。