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函数返回多个值的示例方法
Dec 04 Python
Python中实现结构相似的函数调用方法
Mar 10 Python
Python中operator模块的操作符使用示例总结
Jun 28 Python
浅谈python的dataframe与series的创建方法
Nov 12 Python
python中的tcp示例详解
Dec 09 Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 Python
Pytorch实现GoogLeNet的方法
Aug 18 Python
Jupyter notebook无法导入第三方模块的解决方式
Apr 15 Python
Python基于numpy模块实现回归预测
May 14 Python
python获取时间戳的实现示例(10位和13位)
Sep 23 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
Mar 03 Python
Python移位密码、仿射变换解密实例代码
Jun 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
PHP二维数组排序的3种方法和自定义函数分享
2014/04/09 PHP
PHP性能优化大全(php.ini)
2016/05/20 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
让浏览器非阻塞加载javascript的几种方法小结
2011/04/25 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
2015/03/23 Javascript
javascript实现点击按钮弹出一个可关闭层窗口同时网页背景变灰的方法
2015/05/13 Javascript
JS函数的几种定义方式分析
2015/12/17 Javascript
纯JavaScript 实现flappy bird小游戏实例代码
2016/09/27 Javascript
JavaScript页面实时显示当前时间实例代码
2016/10/23 Javascript
canvas绘制一个常用的emoji表情
2017/03/30 Javascript
AjaxUpLoad.js实现文件上传功能
2018/03/02 Javascript
jQuery实现导航样式布局操作示例【可自定义样式布局】
2018/07/24 jQuery
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
BootstrapValidator实现表单验证功能
2019/11/08 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
2020/07/26 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
python自动生成model文件过程详解
2019/11/02 Python
Python pandas RFM模型应用实例详解
2019/11/20 Python
Python常用数字处理基本操作汇总
2020/09/10 Python
python 无损批量压缩图片(支持保留图片信息)的示例
2020/09/22 Python
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
Big Green Smile法国:领先的英国有机和天然产品在线商店
2021/01/02 全球购物
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
2019年Java面试必问之经典试题
2012/09/12 面试题
编码实现字符串转整型的函数
2012/06/02 面试题
Java如何获得ResultSet的总行数
2016/09/03 面试题
师范生个人推荐信
2013/11/29 职场文书
工程资料员岗位职责
2014/03/10 职场文书
软件项目开发计划书
2014/05/01 职场文书
汽车4S店前台接待岗位职责
2015/04/03 职场文书
python_tkinter弹出对话框创建
2022/03/20 Python