nv12, yuv420, yuv444转换关系

nv12, yuv420, yuv444转换关系

对于宽高为(w,h)的图像

  • yuv444

    yuv444的排列顺序:[y, y, y, y, …, y, u, u,u,u,…u, v,v,v,v,…v], shape:(h, w, 3).
    乘以一个3*3矩阵可以转换为RGB, opencv已经提供了这种函数:cv2.cvtColor(yuv444, cv2.COLORYUV2RGB).

  • yuv420

    排列顺序: [y, y, y, y, …, y, u, u, u, …u, v, v, v, …, v], shape:(h*3/2, w),
    其中前[:h, :]为y, [h : h * 3/2, :]为u和v,先u,再v. cvtColor转换flag:cv2.COLORYUV2RGB_I420.

  • nv12

    排列顺序:[y,y,y,y,…,y, u,v,u,v,…], shape和yuv420一样:(h*3/2, w),
    前[:h, :]为y, 剩下部分u,v间隔排列。与yuv420唯一区别是uv顺序, cv2.COLORYUV2RGB_NV12.

    nv12toyuv转换方式:

    def convert_nv12_to_yuv444_naive(width, height, nv12_data):
        yuv444 = np.zeros((height, width,  3), nv12_data.dtype)
        yuv444[:, :, 0] = nv12_data[:width * height].reshape(height, width)
        uv_start = width * height
        import math
        for j in range(height):
            for i in range(width):
                uv_idx = uv_start + (width * math.floor(j / 2)) + (math.floor(i / 2))*2
                u = nv12_data[uv_idx]
                v = nv12_data[uv_idx+1]
                yuv444[j, i , 1:] = u, v
        return yuv444
    

    yuv444不够的uv要从nv12的uv上重复采样。

参考:

http://paulbourke.net/dataformats/nv12/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值