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程序员面试中被问的最多的10道题
Dec 05 Python
python Celery定时任务的示例
Mar 13 Python
Python使用random.shuffle()打乱列表顺序的方法
Nov 08 Python
Python判断对象是否为文件对象(file object)的三种方法示例
Apr 26 Python
python模块导入的方法
Oct 24 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
Dec 19 Python
Python面向对象封装操作案例详解 II
Jan 02 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
Feb 21 Python
python GUI模拟实现计算器
Jun 22 Python
python tqdm库的使用
Nov 30 Python
Python脚本调试工具安装过程
Jan 11 Python
关于的python五子棋的算法
May 02 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产生随机数的两种方法实例代码 输出随机IP
2011/04/08 PHP
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
Vue.js常用指令的使用小结
2017/06/23 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
javaScript字符串工具类StringUtils详解
2017/12/08 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
2018/03/05 Javascript
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
js实现类似iphone的网页滑屏解锁功能示例【附源码下载】
2019/06/10 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
微信小程序基于高德地图API实现天气组件(动态效果)
2020/10/22 Javascript
Windows下搭建python开发环境详细步骤
2020/07/20 Python
python3读取MySQL-Front的MYSQL密码
2017/05/03 Python
Python3.x爬虫下载网页图片的实例讲解
2018/05/22 Python
详解Appium+Python之生成html测试报告
2019/01/04 Python
Python叠加两幅栅格图像的实现方法
2019/07/05 Python
python使用协程实现并发操作的方法详解
2019/12/27 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
2020/03/18 Python
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
销售高级职员求职信
2013/10/29 职场文书
承认错误的检讨书
2014/01/30 职场文书
创业大赛策划书
2014/03/01 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
财务会计专业自荐书
2014/06/30 职场文书
2016大一新生军训感言
2015/12/08 职场文书
USB TYPE-C 或将成为所有智能手机充电标准
2022/04/21 数码科技
MySQL数据库 安全管理
2022/05/06 MySQL