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使用PythonMagick将jpg图片转换成ico图片的方法
Mar 26 Python
python实现汉诺塔递归算法经典案例
Mar 01 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
Apr 15 Python
python机器学习理论与实战(一)K近邻法
Jan 28 Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 Python
python3.6+django2.0开发一套学员管理系统
Mar 03 Python
Python装饰器用法实例总结
May 26 Python
django模板获取list中指定索引的值方式
May 14 Python
python pymysql链接数据库查询结果转为Dataframe实例
Jun 05 Python
python实现每天自动签到领积分的示例代码
Aug 18 Python
Selenium关闭INFO:CONSOLE提示的解决
Dec 07 Python
pygame面向对象的飞行小鸟实现(Flappy bird)
Apr 01 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 md5下16位和32位的实现代码
2008/04/09 PHP
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
2011/10/29 PHP
PHP版 汉字转码的实现详解
2013/06/09 PHP
php中用memcached实现页面防刷新功能
2014/08/19 PHP
ThinkPHP查询语句与关联查询用法实例
2014/11/01 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
CodeIgniter配置之SESSION用法实例分析
2016/01/19 PHP
PHP批量去除BOM头内容信息代码
2016/03/11 PHP
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
js parseInt("08")未指定进位制问题
2010/06/19 Javascript
让ie6也支持websocket采用flash封装实现
2013/02/18 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
Angular动态添加、删除输入框并计算值实例代码
2017/03/29 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
关于vue单文件中引用路径的处理方法
2018/01/08 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
全面了解python中的类,对象,方法,属性
2016/09/11 Python
python定位xpath 节点位置的方法
2019/08/27 Python
python清空命令行方式
2020/01/13 Python
tensorflow 自定义损失函数示例代码
2020/02/05 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
2020/02/20 Python
Selenium向iframe富文本框输入内容过程图解
2020/04/10 Python
HTML5等待加载动画效果
2017/07/27 HTML / CSS
美国在线宠物用品商店:Entirely Pets
2017/01/01 全球购物
马来西亚在线时尚女装商店:KEI MAG
2017/09/28 全球购物
大学生个人推荐信范文
2013/11/25 职场文书
优秀团员个人事迹材料
2014/01/29 职场文书
《猫》教学反思
2014/02/26 职场文书
有多年工作经验的自我评价
2014/03/02 职场文书
软件毕业生个人鉴定
2014/03/03 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
单方离婚协议书范本2014
2014/10/28 职场文书
校运会加油稿大全
2015/07/22 职场文书