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通过解析网页实现看报程序的方法
Aug 04 Python
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
Nov 05 Python
Python中atexit模块的基本使用示例
Jul 08 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
Jun 09 Python
Pandas 同元素多列去重的实例
Jul 03 Python
python多行字符串拼接使用小括号的方法
Mar 19 Python
Python字典循环添加一键多值的用法实例
Jan 20 Python
Python实战之制作天气查询软件
May 14 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
Dec 06 Python
python编写softmax函数、交叉熵函数实例
Jun 11 Python
Python中的pprint模块
Nov 27 Python
Python数组变形的几种实现方法
May 30 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 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
PHP中文URL编解码(urlencode()rawurlencode()
2010/07/03 PHP
php中的一些数组排序方法分享
2012/07/20 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
2013/06/28 PHP
ThinkPHP跳转页success及error模板实例教程
2014/07/17 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
php中smarty实现多模版网站的方法
2015/06/11 PHP
基于CakePHP实现的简单博客系统实例
2015/06/28 PHP
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
jquery实现微博文字输入框 输入时显示输入字数 效果实现
2013/07/12 Javascript
js中如何复制一个对象并获取其所有属性和属性对应的值
2013/10/24 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
2015/10/13 Javascript
开启Javascript中apply、call、bind的用法之旅模式
2015/10/28 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
2019/05/16 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
2020/03/07 Javascript
[04:03]DOTA2肉山黑名单梦之声 风暴之灵中文配音鉴赏
2013/07/03 DOTA
Python实现多态、协议和鸭子类型的代码详解
2019/05/05 Python
Python库skimage绘制二值图像代码实例
2020/04/10 Python
CSS3中的opacity属性使用教程
2015/08/19 HTML / CSS
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
html5中canvas图表实现柱状图的示例
2017/11/13 HTML / CSS
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
自我鉴定三原则
2014/01/13 职场文书
上课打牌的检讨书
2014/02/15 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
先进个人总结范文
2015/02/15 职场文书
《圆的周长》教学反思
2016/02/17 职场文书
使用springboot暴露oracle数据接口的问题
2021/05/07 Oracle
「地球外少年少女」BD发售宣传CM公开
2022/03/21 日漫