参考:
相机拍摄的原始YUV422格式数据,排列方式为YUYV
读取及转换代码:
alive_progress和alive_it是执行循环时显示进度条用的,电脑太卡了一个for循环要遍历一万年等的无聊
import cv2
import numpy as np
from alive_progress import alive_it
#读取YUV格式图像文件
def read_yuv422(image_path, rows, cols):
"""
:param image_path: 待转换的.yuv图像文件路径
:param rows: 图像行数
:param cols: 图像列数
:return: y,u,v分量
"""
# 创建y分量
img_y_1 = np.zeros((rows, int(cols/2)), np.uint8)
img_y_2 = np.zeros((rows, int(cols / 2)), np.uint8)
img_y = np.zeros((rows, cols), np.uint8)
# 创建u分量
img_u = np.zeros((rows, int(cols / 2)), np.uint8)
# 创建v分量
img_v = np.zeros((rows, int(cols / 2)), np.uint8)
# 读取内存中数据
with open(image_path, 'rb') as reader:
for i in alive_it(range(rows)):
for j in alive_it(range(int(cols/2))):
img_y_1[i, j] = ord(reader.read(1))
img_u[i, j] = ord(reader.read(1))
img_y_2[i, j] = ord(reader.read(1))
img_v[i, j] = ord(reader.read(1))
for i in alive_it(range(rows)):
for j in alive_it(range(int(cols/2))):
img_y[i, 2*j] = img_y_1[i, j]
img_y[i, 2*j+1] = img_y_2[i,j]
return img_y, img_u, img_v
#把YUV格式数据转换为RGB格式
def yuv2rgb422(y, u, v):
"""
:param y: y分量
:param u: u分量
:param v: v分量
:return: rgb格式数据以及r,g,b分量
"""
rows, cols = y.shape[:2]
# 创建r,g,b分量
r = np.zeros((rows, cols), np.uint8)
g = np.zeros((rows, cols), np.uint8)
b = np.zeros((rows, cols), np.uint8)
for i in alive_it(range(rows)):
for j in alive_it(range(int(cols/2))):
r[i, 2 * j] = max(0,min(255,y[i, 2 * j] + 1.402 * (v[i, j] - 128)))
g[i, 2 * j] = max(0,min(255,y[i, 2 * j] - 0.34414 * (u[i, j] - 128) - 0.71414 * (v[i, j] - 128)))
b[i, 2 * j] = max(0,min(255,y[i, 2 * j] + 1.772 * (u[i, j] - 128)))
r[i, 2 * j+1] = max(0,min(255,y[i, 2 * j+1] + 1.402 * (v[i, j] - 128)))
g[i, 2 * j+1] = max(0,min(255,y[i, 2 * j+1] - 0.34414 * (u[i, j] - 128) - 0.71414 * (v[i, j] - 128)))
b[i, 2 * j+1] = max(0,min(255,y[i, 2 * j+1] + 1.772 * (u[i, j] - 128)))
rgb = cv2.merge([b, g, r])
return rgb, r, g, b
img_yuv=read_yuv422("test.yuv",480,640)
cv2.imshow("YUV_Y",img_yuv[0])#显示从文件提取出的Y分量
img_rgb=yuv2rgb422(img_yuv[0],img_yuv[1],img_yuv[2])
cv2.imshow("RGB",img_rgb[0])
cv2.waitKey(0)
运行: