Python 读取 YUV(NV12) 视频文件实例
一、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:YYYYYYYYUVUV=>YUV420SP NV21:YYYYYYYYVUVU=>YUV420SP #I420、YV12三个分量均为平面格式,即:分别存放在三个Byte型数组中 I420:YYYYYYYYUUVV=>YUV420P YV12:YYYYYYYYVVUU=>YUV420P
假设一个分辨率为8X4的YUV图像,它们的格式如下图:
三、读取YUV(NV12)视频文件并保存
#!/usr/bin/envpython3
#-*-coding:utf-8-*-
importcv2
importnumpyasnp
defyuv2bgr(filename,height,width,startfrm):
"""
:paramfilename:待处理YUV视频的名字
:paramheight:YUV视频中图像的高
:paramwidth:YUV视频中图像的宽
:paramstartfrm:起始帧
: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)
foriinrange(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')
forminrange(height):
forninrange(width):
Yt[m,n]=ord(fp.read(1))
forminrange(h_h):
forninrange(h_w):
Ut[m,n]=ord(fp.read(1))
forminrange(h_h):
forninrange(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(YYYYUV)
#由于opencv不能直接读取YUV格式的文件,所以要转换一下格式
bgr_img=cv2.cvtColor(img,cv2.COLOR_YUV2BGR_NV12)#注意YUV的存储格式
cv2.imwrite('yuv2bgr/%d.jpg'%(i+1),bgr_img)
print("Extractframe%d"%(i+1))
fp.close()
print("jobdone!")
returnNone
if__name__=='__main__':
_=yuv2bgr(filename='xxx.yuv',height=1080,width=1920,startfrm=0)
以上这篇Python读取YUV(NV12)视频文件实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。