只需配置以下:

    • YVU_DIR = “../higway_nv12”#yuv文件路径
    • RGB_DIR = “rgb”#转rgb图像.jpg保存路径
    • IMG_WIDTH = 1024
    • IMG_HEIGHT = 512 ```python import os import cv2 import shutil from glob import glob import numpy as np

    YVU_DIR = “../higway_nv12”#yuv文件路径 RGB_DIR = “rgb”#转rgb图像.jpg保存路径

    IMG_WIDTH = 1024 IMG_HEIGHT = 512 IMG_SIZE = int(IMG_WIDTH IMG_HEIGHT 3 / 2)

    Y_WIDTH = IMG_WIDTH Y_HEIGHT = IMG_HEIGHT Y_SIZE = int(Y_WIDTH * Y_HEIGHT)

    U_V_WIDTH = int(IMG_WIDTH / 2) U_V_HEIGHT = int(IMG_HEIGHT / 2) U_V_SIZE = int(U_V_WIDTH * U_V_HEIGHT)

    def from_I420(yuv_data, frames): Y = np.zeros((frames, IMG_HEIGHT, IMG_WIDTH), dtype=np.uint8) U = np.zeros((frames, U_V_HEIGHT, U_V_WIDTH), dtype=np.uint8) V = np.zeros((frames, U_V_HEIGHT, U_V_WIDTH), dtype=np.uint8)

    1. for frame_idx in range(0, frames):
    2. y_start = frame_idx * IMG_SIZE
    3. u_start = y_start + Y_SIZE
    4. v_start = u_start + U_V_SIZE
    5. v_end = v_start + U_V_SIZE
    6. Y[frame_idx, :, :] = yuv_data[y_start : u_start].reshape((Y_HEIGHT, Y_WIDTH))
    7. U[frame_idx, :, :] = yuv_data[u_start : v_start].reshape((U_V_HEIGHT, U_V_WIDTH))
    8. V[frame_idx, :, :] = yuv_data[v_start : v_end].reshape((U_V_HEIGHT, U_V_WIDTH))
    9. return Y, U, V

    def from_YV12(yuv_data, frames): Y = np.zeros((frames, IMG_HEIGHT, IMG_WIDTH), dtype=np.uint8) U = np.zeros((frames, U_V_HEIGHT, U_V_WIDTH), dtype=np.uint8) V = np.zeros((frames, U_V_HEIGHT, U_V_WIDTH), dtype=np.uint8)

    1. for frame_idx in range(0, frames):
    2. y_start = frame_idx * IMG_SIZE
    3. v_start = y_start + Y_SIZE
    4. u_start = v_start + U_V_SIZE
    5. u_end = u_start + U_V_SIZE
    6. Y[frame_idx, :, :] = yuv_data[y_start : v_start].reshape((Y_HEIGHT, Y_WIDTH))
    7. V[frame_idx, :, :] = yuv_data[v_start : u_start].reshape((U_V_HEIGHT, U_V_WIDTH))
    8. U[frame_idx, :, :] = yuv_data[u_start : u_end].reshape((U_V_HEIGHT, U_V_WIDTH))
    9. return Y, U, V

    def from_NV12(yuv_data, frames): Y = np.zeros((frames, IMG_HEIGHT, IMG_WIDTH), dtype=np.uint8) U = np.zeros((frames, U_V_HEIGHT, U_V_WIDTH), dtype=np.uint8) V = np.zeros((frames, U_V_HEIGHT, U_V_WIDTH), dtype=np.uint8)

    1. for frame_idx in range(0, frames):
    2. y_start = frame_idx * IMG_SIZE
    3. u_v_start = y_start + Y_SIZE
    4. u_v_end = u_v_start + (U_V_SIZE * 2)
    5. Y[frame_idx, :, :] = yuv_data[y_start : u_v_start].reshape((Y_HEIGHT, Y_WIDTH))
    6. U_V = yuv_data[u_v_start : u_v_end].reshape((U_V_SIZE, 2))
    7. U[frame_idx, :, :] = U_V[:, 0].reshape((U_V_HEIGHT, U_V_WIDTH))
    8. V[frame_idx, :, :] = U_V[:, 1].reshape((U_V_HEIGHT, U_V_WIDTH))
    9. return Y, U, V

    def from_NV21(yuv_data, frames): Y = np.zeros((frames, IMG_HEIGHT, IMG_WIDTH), dtype=np.uint8) U = np.zeros((frames, U_V_HEIGHT, U_V_WIDTH), dtype=np.uint8) V = np.zeros((frames, U_V_HEIGHT, U_V_WIDTH), dtype=np.uint8)

    1. for frame_idx in range(0, frames):
    2. y_start = frame_idx * IMG_SIZE
    3. u_v_start = y_start + Y_SIZE
    4. u_v_end = u_v_start + (U_V_SIZE * 2)
    5. Y[frame_idx, :, :] = yuv_data[y_start : u_v_start].reshape((Y_HEIGHT, Y_WIDTH))
    6. U_V = yuv_data[u_v_start : u_v_end].reshape((U_V_SIZE, 2))
    7. V[frame_idx, :, :] = U_V[:, 0].reshape((U_V_HEIGHT, U_V_WIDTH))
    8. U[frame_idx, :, :] = U_V[:, 1].reshape((U_V_HEIGHT, U_V_WIDTH))
    9. return Y, U, V

    def yuv2rgb(Y, U, V): bgr_data = np.zeros((IMG_HEIGHT, IMG_WIDTH, 3), dtype=np.uint8) for h_idx in range(Y_HEIGHT): for w_idx in range(Y_WIDTH): y = Y[h_idx, w_idx] u = U[int(h_idx // 2), int(w_idx // 2)] v = V[int(h_idx // 2), int(w_idx // 2)]

    1. c = (y - 16) * 298
    2. d = u - 128
    3. e = v - 128
    4. r = (c + 409 * e + 128) // 256
    5. g = (c - 100 * d - 208 * e + 128) // 256
    6. b = (c + 516 * d + 128) // 256
    7. bgr_data[h_idx, w_idx, 2] = 0 if r < 0 else (255 if r > 255 else r)
    8. bgr_data[h_idx, w_idx, 1] = 0 if g < 0 else (255 if g > 255 else g)
    9. bgr_data[h_idx, w_idx, 0] = 0 if b < 0 else (255 if b > 255 else b)
    10. #print(bgr_data[h_idx, w_idx, :])
    11. return bgr_data

    if name == ‘main‘: if not os.path.exists(RGB_DIR): os.mkdir(RGB_DIR) yuvs = glob(os.path.join(YVU_DIR, “*.yuv”)) yuvs.sort() nums = len((yuvs))

    1. for yuv in yuvs:
    2. yuv_path, yuv_name = os.path.split(yuv)
    3. print("processing:", yuv_name)
    4. #img_out_dir = os.path.join(RGB_DIR, yuv_name[:-4])
    5. frames = int(os.path.getsize(yuv) / IMG_SIZE)#1
    6. with open(yuv, "rb") as yuv_f:
    7. yuv_bytes = yuv_f.read()
    8. yuv_data = np.frombuffer(yuv_bytes, np.uint8)
    9. Y, U, V = from_NV12(yuv_data, frames)
    10. rgb_data = np.zeros((IMG_HEIGHT, IMG_WIDTH, 3), dtype=np.uint8)
    11. for frame_idx in range(frames):
    12. bgr_data = yuv2rgb(Y[frame_idx, :, :], U[frame_idx, :, :], V[frame_idx, :, :])
    13. if bgr_data is not None:
    14. cv2.imwrite(os.path.join(RGB_DIR, "{}.jpg".format(yuv_name)), bgr_data)

    ```