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的Flask框架中web表单的教程
Apr 20 Python
详细解析Python中__init__()方法的高级应用
May 11 Python
Python使用自带的ConfigParser模块读写ini配置文件
Jun 26 Python
用Python写脚本,实现完全备份和增量备份的示例
Apr 29 Python
Python django搭建layui提交表单,表格,图标的实例
Nov 18 Python
python实现宿舍管理系统
Nov 22 Python
python使用numpy实现直方图反向投影示例
Jan 17 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
Feb 17 Python
python中sympy库求常微分方程的用法
Apr 28 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
Python批量修改xml的坐标值全部转为整数的实例代码
Nov 26 Python
使用Python判断一个文件是否被占用的方法教程
Dec 16 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
phpmyadmin MySQL 加密配置方法
2009/07/05 PHP
php读取本地文件常用函数(fopen与file_get_contents)
2013/09/09 PHP
CodeIgniter中实现泛域名解析
2014/07/19 PHP
Yii控制器中操作视图js的方法
2016/07/04 PHP
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
2012/08/24 Javascript
javascript中定义私有方法说明(private method)
2014/01/27 Javascript
jQuery实现固定在网页顶部的菜单效果代码
2015/09/02 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
2015/09/09 Javascript
微信小程序 rpx 尺寸单位详细介绍
2016/10/13 Javascript
微信小程序登录态控制深入分析
2017/04/12 Javascript
BootStrap入门学习第一篇
2017/08/28 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
2018/07/11 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
vue.js循环radio的实例
2019/11/07 Javascript
如何在selenium中使用js实现定位
2020/08/18 Javascript
解决vue init webpack 下载依赖卡住不动的问题
2020/11/09 Javascript
python实现杨辉三角思路
2017/07/14 Python
详解Python循环作用域与闭包
2019/03/21 Python
树莓派与PC端在局域网内运用python实现即时通讯
2019/06/22 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
Python爬虫抓取技术的一些经验
2019/07/12 Python
对Django中的权限和分组管理实例讲解
2019/08/16 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
2019/10/30 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
分享一个H5原生form表单的checkbox特效代码
2018/02/26 HTML / CSS
canvas 基础之图像处理的使用
2020/04/10 HTML / CSS
Ajax主要包含了哪些技术
2014/06/12 面试题
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
文言文形式的学生求职信
2013/12/03 职场文书
世界文化遗产导游词
2015/02/13 职场文书
创业计划书之少年玩具店
2019/09/05 职场文书
详解Vue的options
2021/05/15 Vue.js
漫画「日和酱的要求是绝对的」第3卷封面公开
2022/03/21 日漫