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程序设计入门(2)变量类型简介
Jun 16 Python
深入理解Python中命名空间的查找规则LEGB
Aug 06 Python
Python的Flask框架中SQLAlchemy使用时的乱码问题解决
Nov 07 Python
浅谈Python实现2种文件复制的方法
Jan 19 Python
Python Socket编程之多线程聊天室
Jul 28 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
Jan 09 Python
python多线程实现TCP服务端
Sep 03 Python
python定间隔取点(np.linspace)的实现
Nov 27 Python
Windows下python3安装tkinter的问题及解决方法
Jan 06 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
Feb 15 Python
基于Python 的语音重采样函数解析
Jul 06 Python
python中threading和queue库实现多线程编程
Feb 06 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)
2006/10/09 PHP
php代码运行时间查看类代码分享
2011/08/06 PHP
微信API接口大全
2015/04/15 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
Symfony2学习笔记之控制器用法详解
2016/03/17 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
php实现每日签到功能
2018/11/29 PHP
浅谈Laravel核心解读之Console内核
2018/12/02 PHP
Laravel 前端资源配置教程
2019/10/18 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
把textarea中字符串里含有的回车换行替换成<br>的javascript代码
2007/04/20 Javascript
JQuery的html(data)方法与<script>脚本块的解决方法
2010/03/09 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
Javascript 按位与运算符 (&)使用介绍
2014/02/04 Javascript
jquery绑定事件不生效的解决方法
2014/02/11 Javascript
自己实现ajax封装示例分享
2014/04/01 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
2015/09/19 Javascript
JavaScript DOM 学习总结(五)
2015/11/24 Javascript
jquery siblings获取同辈元素用法实例分析
2016/07/25 Javascript
javascript 中的事件委托详解
2016/10/25 Javascript
Bootstrap table学习笔记(2) 前后端分页模糊查询
2017/05/18 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
2017/10/21 Javascript
Vue用v-for给src属性赋值的方法
2018/03/03 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
python模拟enum枚举类型的方法小结
2015/04/30 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
Python利用requests模块下载图片实例代码
2019/08/12 Python
tensorflow tf.train.batch之数据批量读取方式
2020/01/20 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
2020/02/12 Python
python实现mean-shift聚类算法
2020/06/10 Python
pytorch快速搭建神经网络_Sequential操作
2020/06/17 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
2020/11/19 Python
英国在线药房:Chemist.co.uk
2019/03/26 全球购物
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android
苹果的回收机器人可以通过拆解iPhone获取大量的金和铜并外公布了环境保护最新进展
2022/04/21 数码科技