Python 读取 YUV(NV12) 视频文件实例


Posted in Python onDecember 09, 2019

一、YUV 简介

YUV:是一种颜色编码方法,常使用在各个视频处理组件中

Y'UV, YCbCr, YPbPr等专有名词都可以称为 YUV,彼此有重叠

Y表示明亮度(单取此通道即可得灰度图),U和V则是色度、浓度

主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0

可以根据其采样格式来从码流中还原每个像素点的 YUV 值,进而通过 YUV 与 RGB 的转换公式提取出每个像素点的 RGB 值,然后显示出来

YUV4:2:0 数据在内存中的长度是 3 / 2 * heigth * width,是 RGB24(heigth * width * 3) 格式视频数据内存的一半

二、YUV420(NV12、NV21、I420、YV12)

# NV12、NV21 的存储格式为 Y 平面,UV 打包,即:Y 信息存储在一个数组中,UV 信息存储在一个矩阵中。
# 不同点在于 UV 的排列顺序
NV12: YYYYYYYY UVUV  => YUV420SP
NV21: YYYYYYYY VUVU  => YUV420SP

# I420、YV12 三个分量均为平面格式,即:分别存放在三个 Byte 型数组中
I420: YYYYYYYY UU VV => YUV420P
YV12: YYYYYYYY VV UU => YUV420P

假设一个分辨率为8X4的 YUV 图像,它们的格式如下图:

Python 读取 YUV(NV12) 视频文件实例

三、读取 YUV(NV12) 视频文件并保存

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import cv2
import numpy as np


def yuv2bgr(filename, height, width, startfrm):
 """
 :param filename: 待处理 YUV 视频的名字
 :param height: YUV 视频中图像的高
 :param width: YUV 视频中图像的宽
 :param startfrm: 起始帧
 :return: None
 """
 fp = open(filename, 'rb')

 framesize = height * width * 3 // 2 # 一帧图像所含的像素个数
 h_h = height // 2
 h_w = width // 2

 fp.seek(0, 2) # 设置文件指针到文件流的尾部
 ps = fp.tell() # 当前文件指针位置
 numfrm = ps // framesize # 计算输出帧数
 fp.seek(framesize * startfrm, 0)

 for i in range(numfrm - startfrm):
  Yt = np.zeros(shape=(height, width), dtype='uint8', order='C')
  Ut = np.zeros(shape=(h_h, h_w), dtype='uint8', order='C')
  Vt = np.zeros(shape=(h_h, h_w), dtype='uint8', order='C')

  for m in range(height):
   for n in range(width):
    Yt[m, n] = ord(fp.read(1))
  for m in range(h_h):
   for n in range(h_w):
    Ut[m, n] = ord(fp.read(1))
  for m in range(h_h):
   for n in range(h_w):
    Vt[m, n] = ord(fp.read(1))

  img = np.concatenate((Yt.reshape(-1), Ut.reshape(-1), Vt.reshape(-1)))
  img = img.reshape((height * 3 // 2, width)).astype('uint8') # YUV 的存储格式为:NV12(YYYY UV)

  # 由于 opencv 不能直接读取 YUV 格式的文件, 所以要转换一下格式
  bgr_img = cv2.cvtColor(img, cv2.COLOR_YUV2BGR_NV12) # 注意 YUV 的存储格式
  cv2.imwrite('yuv2bgr/%d.jpg' % (i + 1), bgr_img)
  print("Extract frame %d " % (i + 1))

 fp.close()
 print("job done!")
 return None


if __name__ == '__main__':
 _ = yuv2bgr(filename='xxx.yuv', height=1080, width=1920, startfrm=0)

以上这篇Python 读取 YUV(NV12) 视频文件实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现汉诺塔递归算法经典案例
Mar 01 Python
python绘制热力图heatmap
Mar 23 Python
使用Template格式化Python字符串的方法
Jan 22 Python
详解Python Matplot中文显示完美解决方案
Mar 07 Python
Django之路由层的实现
Sep 09 Python
详解python statistics模块及函数用法
Oct 27 Python
python中shell执行知识点
May 06 Python
python中sklearn的pipeline模块实例详解
May 21 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
Oct 28 Python
Python批量修改xml的坐标值全部转为整数的实例代码
Nov 26 Python
Python实现Excel文件的合并(以新冠疫情数据为例)
Mar 20 Python
python中的random模块和相关函数详解
Apr 22 Python
基于YUV 数据格式详解及python实现方式
Dec 09 #Python
Python编写一个验证码图片数据标注GUI程序附源码
Dec 09 #Python
Python内置方法实现字符串的秘钥加解密(推荐)
Dec 09 #Python
opencv-python 读取图像并转换颜色空间实例
Dec 09 #Python
opencv-python 提取sift特征并匹配的实例
Dec 09 #Python
python 多维高斯分布数据生成方式
Dec 09 #Python
使用python模拟高斯分布例子
Dec 09 #Python
You might like
使用PHP实现二分查找算法代码分享
2011/06/24 PHP
PHP中实现Bloom Filter算法
2015/03/30 PHP
PHP实现实时生成并下载超大数据量的EXCEL文件详解
2017/10/23 PHP
accesskey 提交
2006/06/26 Javascript
jquery判断RadioButtonList和RadioButton中是否有选中项示例
2013/09/29 Javascript
jquery的父子兄弟节点查找示例代码
2014/03/03 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
JQuery中DOM实现事件移除的方法
2015/06/13 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
2015/08/25 Javascript
深入对Vue.js $watch方法的理解
2017/03/20 Javascript
Vue实现回到顶部和底部动画效果
2019/07/31 Javascript
vue给对象动态添加属性和值的实例
2019/09/09 Javascript
vue实现移动端省市区选择
2019/09/27 Javascript
python opencv 图像尺寸变换方法
2018/04/02 Python
浅谈Tensorflow模型的保存与恢复加载
2018/04/26 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
html5 touch事件实现触屏页面上下滑动(二)
2016/03/10 HTML / CSS
HTML5图片预览实例分享
2014/06/04 HTML / CSS
英国高档时尚男装购物网站:MR PORTER
2016/08/09 全球购物
造价工程师个人求职信
2013/09/21 职场文书
工程质量承诺书
2014/03/27 职场文书
车队司机个人自我鉴定
2014/04/17 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
语文教研活动总结
2014/07/02 职场文书
岗位说明书标准范本
2014/07/30 职场文书
天猫活动策划方案
2014/08/21 职场文书
计算机专业自荐信
2015/03/05 职场文书
个人党性分析总结
2015/03/05 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
2015年店长工作总结范文
2015/04/08 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
宿舍卫生管理制度
2015/08/05 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
《天净沙·秋思》教学反思三篇
2019/11/02 职场文书
Python控制台输出俄罗斯方块移动和旋转功能
2021/04/18 Python
JUnit5常用注解的使用
2021/07/02 Java/Android