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标准库之随机数 (math包、random包)介绍
Nov 25 Python
Python批量转换文件编码格式
May 17 Python
Python中函数的参数定义和可变参数用法实例分析
Jun 04 Python
在Python中定义和使用抽象类的方法
Jun 30 Python
Python socket实现简单聊天室
Apr 01 Python
详解python中的线程与线程池
May 10 Python
python3+django2开发一个简单的人员管理系统过程详解
Jul 23 Python
Python Web程序搭建简单的Web服务器
Jul 31 Python
Pytorch中实现只导入部分模型参数的方式
Jan 02 Python
六种酷炫Python运行进度条效果的实现代码
Jul 17 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
Feb 04 Python
python爬虫之利用selenium模块自动登录CSDN
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实现合并discuz用户
2015/08/05 PHP
从零开始学习jQuery (八) 插播:jQuery实施方案
2011/02/23 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
javascript中万恶的function实例分析
2011/05/25 Javascript
JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
2014/08/16 Javascript
总结jQuery插件开发中的一些要点
2016/05/16 Javascript
通过正则表达式获取url中参数的简单实现
2016/06/07 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
Node.js如何自动审核团队的代码
2016/07/20 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
2016/08/01 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
2016/09/13 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
2016/11/29 Javascript
利用vscode编写vue的简单配置详解
2017/06/17 Javascript
Vue中使用ElementUI使用第三方图标库iconfont的示例
2018/10/11 Javascript
谈谈JavaScript中super(props)的重要性
2019/02/12 Javascript
详解vuex之store源码简单解析
2019/06/13 Javascript
[55:11]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第一场 11.26
2020/11/30 DOTA
[01:30:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster BO3 第二场 2月2日
2021/03/11 DOTA
Python工程师面试题 与Python Web相关
2016/01/14 Python
python K近邻算法的kd树实现
2018/09/06 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
2020/03/06 Python
Python 字典一个键对应多个值的方法
2020/09/29 Python
Python识别验证码的实现示例
2020/09/30 Python
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
大韩航空官方网站:Korean Air
2017/10/25 全球购物
罗马尼亚在线杂货店:Pilulka.ro
2019/09/28 全球购物
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
党员个人整改措施
2014/10/24 职场文书
学校运动会通讯稿
2015/07/18 职场文书
奖学金发言稿(范文)
2019/08/21 职场文书
只需要100行Python代码就可以实现的贪吃蛇小游戏
2021/05/27 Python
带你了解CSS基础知识,样式
2021/07/21 HTML / CSS
MySQL 数据表操作
2022/05/04 MySQL
redis protocol通信协议及使用详解
2022/07/15 Redis