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执行等待程序直到第二天零点的方法
Apr 23 Python
浅谈Python接口对json串的处理方法
Dec 19 Python
Python3 安装PyQt5及exe打包图文教程
Jan 08 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
python3 深浅copy对比详解
Aug 12 Python
Python3 chardet模块查看编码格式的例子
Aug 14 Python
python爬虫增加访问量的方法
Aug 22 Python
基于python的selenium两种文件上传操作实现详解
Sep 19 Python
Pytorch实现的手写数字mnist识别功能完整示例
Dec 13 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
Sep 17 Python
Python opencv缺陷检测的实现及问题解决
Apr 24 Python
Python集合set()使用的方法详解
Mar 18 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
PHPUnit安装及使用示例
2014/10/29 PHP
php查询相似度最高的字符串的方法
2015/03/12 PHP
PHP对象相关知识总结
2017/04/09 PHP
PhpStorm2020.1 安装 debug - Postman 调用的详细教程
2020/08/17 PHP
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
JSON 教程 json入门学习笔记
2020/09/22 Javascript
javascript中的作用域scope介绍
2010/12/28 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
2017/03/21 Javascript
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
如何理解Vue的作用域插槽的实现原理
2017/08/19 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
2017/12/13 Javascript
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
JS实现换肤功能的方法实例详解
2019/01/30 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
vue 组件销毁并重置的实现
2020/01/13 Javascript
js实现视图和数据双向绑定的方法分析
2020/02/05 Javascript
Vue按时间段查询数据组件使用详解
2020/08/21 Javascript
Python创建xml的方法
2015/03/10 Python
Python安装Numpy和matplotlib的方法(推荐)
2017/11/02 Python
Python中常用信号signal类型实例
2018/01/25 Python
python 重定向获取真实url的方法
2018/05/11 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
2019/02/21 Python
解析python的局部变量和全局变量
2019/08/15 Python
详解CSS3弹性伸缩盒
2020/09/21 HTML / CSS
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
2014年纳税评估工作总结
2014/12/23 职场文书
感谢师恩主题班会
2015/08/17 职场文书
导游词之上海杜莎夫人蜡像馆
2019/11/22 职场文书
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL