一 背景
最近需要把图片nv12格式转换为rgb,因为NV12格式存储占空间比较小,采集时候存储NV12格式,现在需要把NV12格式转换为RGB格式。
二 代码
1 NV12 转 RGB
python">import os
import cv2
import numpy as npdef nv12_to_rgb(nv12_path, save_path, width, height):nv12_data = np.fromfile(nv12_path, dtype=np.uint8)nv12_data = nv12_data.reshape((height * 3 // 2 , width))rgb_data = cv2.cvtColor(nv12_data, cv2.COLOR_YUV2BGR_NV12)cv2.imwrite(save_path, rgb_data)cv2.imshow('bgr', rgb_data)cv2.waitKey(-1)cv2.destroyAllWindows()if __name__ == '__main__':nv12_path = '~/test.nv12'save_path = '~/2.bmp'width = 1280height = 720nv12_to_rgb(nv12_path, save_path, width, height)
在上述代码中,需要修改图片宽高,因为你存NV12格式时候,就知道图片的大小。注意修改。
2 RGB 转 NV12
python">import os
import cv2
import shutilimport numpy as npdef RGB_To_NV12(img_path, save_path):img = cv2.imread(img_path)b, g, r = cv2.split(img)Y = (0.299 * r + 0.587 * g + 0.114 * b).astype(np.uint8)U = (- 0.1687 * r - 0.3313 * g + 0.5 * b + 128).astype(np.uint8)V = (0.5 * r - 0.4187 * g - 0.0813 * b + 128).astype(np.uint8)U = U[::2,:]V = V[::2,:]U[:,1::2] = V[:,1::2]YUV = np.vstack((Y,U))YUV.tofile(save_path)if __name__ == '__main__':img_path = '~/test.bmp'save_path = '~/test.nv12'RGB_To_NV12(img_path, save_path)