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 time模块用法实例详解
Sep 11 Python
Python显示进度条的方法
Sep 20 Python
python处理html转义字符的方法详解
Jul 01 Python
python OpenCV学习笔记实现二维直方图
Feb 08 Python
python实现关键词提取的示例讲解
Apr 28 Python
基于Python开发chrome插件的方法分析
Jul 07 Python
钉钉群自定义机器人消息Python封装的实例
Feb 20 Python
Python 调用 Outlook 发送邮件过程解析
Aug 08 Python
python 定时器每天就执行一次的实现代码
Aug 14 Python
如何基于python把文字图片写入word文档
Jul 31 Python
python装饰器三种装饰模式的简单分析
Sep 04 Python
在Python中如何使用yield
Jun 07 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
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
松下Panasonic RF-B65电路分析
2021/03/02 无线电
谈谈新手如何学习PHP 默默经典版本
2009/08/04 PHP
PHP抓屏函数实现屏幕快照代码分享
2014/01/02 PHP
php里array_work用法实例分析
2015/07/13 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
分析 JavaScript 中令人困惑的变量赋值
2007/08/13 Javascript
Jquery模仿Baidu、Google搜索时自动补充搜索结果提示
2013/12/26 Javascript
JavaScript设计模式之单例模式实例
2014/09/24 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
微信小程序版本自动更新的方法
2019/06/14 Javascript
基于jquery ajax的多文件上传进度条过程解析
2019/09/11 jQuery
vue 重塑数组之修改数组指定index的值操作
2020/08/09 Javascript
[30:51]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第一局
2016/03/04 DOTA
在python win系统下 打开TXT文件的实例
2018/04/29 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
python3在同一行内输入n个数并用列表保存的例子
2019/07/20 Python
基于python中__add__函数的用法
2019/11/25 Python
Python实现RGB与HSI颜色空间的互换方式
2019/11/27 Python
Python-numpy实现灰度图像的分块和合并方式
2020/01/09 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
python3中sys.argv的实例用法
2020/04/24 Python
pandas apply多线程实现代码
2020/08/17 Python
OpenCV+Python3.5 简易手势识别的实现
2020/12/21 Python
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
草莓网化妆品日本站:Strawberrynet日本
2017/10/20 全球购物
乡镇干部十八大感言
2014/02/17 职场文书
中职毕业生自我鉴定
2014/09/13 职场文书
货款欠条范本
2015/07/03 职场文书
Windows下使用Nginx+Tomcat做负载均衡的完整步骤
2021/03/31 Servers
js实现自动锁屏功能
2021/06/02 Javascript