视频传输一般是YUV格式的, Y的尺寸是width*height, U,V的尺寸是Y的一半,这个数组在显示时需要处理为RGB格式的点阵,这个过程经常会有人出错。
问题只是在合并YUV三个通道的数据,调用cv2.merge时,无法merge。关键的步骤也只是把U,V用差值法扩大了一倍:
import cv2
import numpy as np
def YUV2RGB(Y,U,V,width, height):
U = cv2.resize(U, (width, height), interpolation=cv2.INTER_LINEAR)
V = cv2.resize(V, (width, height), interpolation=cv2.INTER_LINEAR)
# 将 Y、U、V 数组合并为一个 YUV 图像
yuv_image = cv2.merge([Y, U, V])
# 将 YUV 图像转换为 RGB 图像
rgb_image = cv2.cvtColor(yuv_image, cv2.COLOR_YUV2RGB)
return rgb_image
def test_YUV2RGB():
height=640
width=640
# 假设你有 Y、U、V 三个数组
Y = np.random.randint(0, 256, size=(height, width)).astype(np.uint8)
U = np.random.randint(0, 256, size=(height // 2, width // 2)).astype(np.uint8)
V = np.random.randint(0, 256, size=(height // 2, width // 2)).astype(np.uint8)
rgb_image = YUV2RGB(Y,U,V, height,width)
# 显示 RGB 图像
cv2.imshow('RGB Image', rgb_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
test_YUV2RGB()