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端口扫描系统实现方法
Nov 19 Python
Python xlrd读取excel日期类型的2种方法
Apr 28 Python
Python操作列表之List.insert()方法的使用
May 20 Python
Python环境下安装使用异步任务队列包Celery的基础教程
May 07 Python
Python实现将Excel转换为json的方法示例
Aug 05 Python
Python多进程原理与用法分析
Aug 21 Python
对pycharm 修改程序运行所需内存详解
Dec 03 Python
Python实现的大数据分析操作系统日志功能示例
Feb 11 Python
python代理工具mitmproxy使用指南
Jul 04 Python
python实现大文件分割与合并
Jul 22 Python
详解pyinstaller selenium python3 chrome打包问题
Oct 18 Python
5道关于python基础 while循环练习题
Nov 27 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
真正根据utf8编码的规律来进行截取字符串的函数(utf8版sub_str )
2012/10/24 PHP
PHP面向对象——访问修饰符介绍
2012/11/08 PHP
护卫神php套件 php版本升级方法(php5.5.24)
2015/05/10 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
2019/04/23 PHP
让网页根据不同IE版本显示不同的内容
2009/02/08 Javascript
javascript call方法使用说明
2010/01/11 Javascript
JSON 教程 json入门学习笔记
2020/09/22 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
chrome调试javascript详解
2015/10/21 Javascript
在 Express 中使用模板引擎
2015/12/10 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
JS实现的tab页切换效果完整示例
2018/12/18 Javascript
JavaScript JMap类定义与使用方法示例
2019/01/22 Javascript
JS大坑之19位数的Number型精度丢失问题详解
2019/04/22 Javascript
实例分析JS中的相等性判断===、 ==和Object.is()
2019/11/17 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
Python获取当前公网ip并自动断开宽带连接实例代码
2018/01/12 Python
python线程池threadpool实现篇
2018/04/27 Python
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
python中ImageTk.PhotoImage()不显示图片却不报错问题解决
2018/12/06 Python
对python tkinter窗口弹出置顶的方法详解
2019/06/14 Python
python输出数组中指定元素的所有索引示例
2019/12/06 Python
爱尔兰电子产品购物网站:Komplett.ie
2018/04/04 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
口腔工艺技术专业毕业生自荐信
2013/09/27 职场文书
经理秘书岗位职责
2013/11/14 职场文书
DIY手工制作经营店创业计划书
2014/02/01 职场文书
趣味游戏活动方案
2014/02/07 职场文书
六查六看自查材料
2014/02/17 职场文书
股东大会通知
2015/04/24 职场文书