Python-OpenCV_读取YUV422图像并转换为RGB显示

参考:

python实现YUV422转RGBhttps://blog.csdn.net/amateur_hy/article/details/89641479icon-default.png?t=L892https://blog.csdn.net/amateur_hy/article/details/89641479


相机拍摄的原始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)

运行:

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值