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代码将tiff图片存储到jpg的方法
Dec 04 Python
对python调用RPC接口的实例详解
Jan 03 Python
python+mysql实现学生信息查询系统
Feb 21 Python
详解python tkinter教程-事件绑定
Mar 28 Python
Django框架使用mysql视图操作示例
May 15 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
Aug 13 Python
wxPython实现文本框基础组件
Nov 18 Python
Python数据可视化:幂律分布实例详解
Dec 07 Python
Python random模块制作简易的四位数验证码
Feb 01 Python
Python3.6 + TensorFlow 安装配置图文教程(Windows 64 bit)
Feb 24 Python
python 使用raw socket进行TCP SYN扫描实例
May 05 Python
scrapy-splash简单使用详解
Feb 21 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的ob_start();控制您的浏览器cache!
2006/11/25 PHP
php验证邮箱和ip地址最简单方法汇总
2015/10/30 PHP
PHP 接入支付宝即时到账功能
2016/09/18 PHP
Avengerls vs KG BO3 第三场2.18
2021/03/10 DOTA
JS继承 笔记
2011/07/13 Javascript
js跑马灯代码(自写)
2013/04/17 Javascript
javascript 函数及作用域总结介绍
2013/11/12 Javascript
浅谈javascript中onbeforeunload与onunload事件
2015/12/10 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
JS实现的RGB网页颜色在线取色器完整实例
2016/12/21 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
javaScript和jQuery自动加载简单代码实现方法
2017/11/24 jQuery
bmob js-sdk 在vue中的使用教程
2018/01/21 Javascript
vue中如何动态绑定图片,vue中通过data返回图片路径的方法
2018/02/07 Javascript
python实现数通设备端口监控示例
2014/04/02 Python
Python写的服务监控程序实例
2015/01/31 Python
python通过smpt发送邮件的方法
2015/04/30 Python
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
Python django使用多进程连接mysql错误的解决方法
2018/10/08 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
Python处理session的方法整理
2019/08/29 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
Python环境管理virtualenv&virtualenvwrapper的配置详解
2020/07/01 Python
Python 中的函数装饰器和闭包详解
2021/02/06 Python
Notino匈牙利:购买香水和化妆品
2019/04/12 全球购物
Prototype如何为一个Ajax添加一个参数
2015/12/06 面试题
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
赔偿协议书范本
2014/04/15 职场文书
公司户外活动总结
2014/07/04 职场文书
四风问题个人对照检查剖析材料
2014/09/27 职场文书
教师自荐信范文
2015/03/06 职场文书
矛盾论读书笔记
2015/06/29 职场文书
MySQL 视图(View)原理解析
2021/05/19 MySQL
详解Python类和对象内容
2021/06/22 Python