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关闭windows进程的方法
Apr 18 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
Jan 20 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
pandas对指定列进行填充的方法
Apr 11 Python
Python tkinter label 更新方法
Oct 11 Python
详解python深浅拷贝区别
Jun 24 Python
python按修改时间顺序排列文件的实例代码
Jul 25 Python
python实现单链表的方法示例
Sep 03 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
Jan 10 Python
tensorflow对图像进行拼接的例子
Feb 05 Python
Jupyter notebook如何实现指定浏览器打开
May 13 Python
pandas to_excel 添加颜色操作
Jul 14 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 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
2016/12/12 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
异步动态加载js与css文件的js代码
2013/09/15 Javascript
Function.prototype.bind用法示例
2013/09/16 Javascript
javascript中对Attr(dom中属性)的操作示例讲解
2013/12/02 Javascript
AngularJS基础学习笔记之简单介绍
2015/05/10 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
理解Koa2中的async&await的用法
2018/02/05 Javascript
Vue项目中如何引入icon图标
2018/03/28 Javascript
JS实现继承的几种常用方式示例
2019/06/22 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
2020/04/23 Javascript
npm全局环境变量配置详解
2020/12/15 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
python网络编程学习笔记(三):socket网络服务器
2014/06/09 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
2015/04/18 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
python实现名片管理系统项目
2019/04/26 Python
django使用django-apscheduler 实现定时任务的例子
2019/07/20 Python
基于python修改srt字幕的时间轴
2020/02/03 Python
python实现将字符串中的数字提取出来然后求和
2020/04/02 Python
python全栈开发语法总结
2020/11/22 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
如何在Canvas上的图形/图像绑定事件监听的实现
2020/09/16 HTML / CSS
美国领先的奢侈手表在线零售商:WatchMaxx
2017/12/17 全球购物
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
北京某科技有限公司C# .net笔试题
2014/09/27 面试题
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
中秋手机店促销方案
2014/06/16 职场文书
新手上路标语
2014/06/20 职场文书
2014年财务工作总结范文
2014/11/11 职场文书
2014小学一年级班主任工作总结
2014/12/05 职场文书
世界遗产的导游词
2015/02/13 职场文书
昆虫记读书笔记
2015/06/26 职场文书
2015年中秋寄语
2015/07/31 职场文书
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL