python将YUV420P文件转PNG图片格式的两种方法


Posted in Python onJanuary 22, 2021

方法一:

import os
import cv2 as cv
import numpy as np


# 读取yuv420p的一帧文件,并转化为png图片
if __name__ == '__main__':
  filepath = 'one_frame_of_highway.yuv'
  binfile = open(filepath, 'rb')
  size = os.path.getsize(filepath)
  image_width = 352
  image_hight = 288
  image_y = [[0] * image_width for i in range(image_hight)]
  image_u = [[0] * image_width for i in range(image_hight)]
  image_v = [[0] * image_width for i in range(image_hight)]
  for r in range(image_hight):
    for c in range(image_width):
      image_y[r][c] = binfile.read(1)[0]
  Image_Y = np.array(image_y)

  for r in range(int(image_hight / 2)):
    for c in range(int(image_width / 2)):
      pixel = binfile.read(1)[0]
      image_u[2 * r + 0][2 * c + 0] = pixel
      image_u[2 * r + 1][2 * c + 0] = pixel
      image_u[2 * r + 0][2 * c + 1] = pixel
      image_u[2 * r + 1][2 * c + 1] = pixel
  Image_U = np.array(image_u)

  for r in range(int(image_hight / 2)):
    for c in range(int(image_width / 2)):
      pixel = binfile.read(1)[0]
      image_v[2 * r + 0][2 * c + 0] = pixel
      image_v[2 * r + 0][2 * c + 1] = pixel
      image_v[2 * r + 1][2 * c + 0] = pixel
      image_v[2 * r + 1][2 * c + 1] = pixel
  Image_V = np.array(image_v)
  binfile.close()
  compose = np.array([Image_Y, Image_V, Image_U]).transpose([1, 2, 0]).astype(np.uint8)
  Image = cv.cvtColor(compose, cv.COLOR_YUV2RGB)
  cv.imwrite("one_frame_of_highway.yuv.png", Image)

方法二:

ffmpeg -s 352x288 -i one_frame_of_highway.yuv one_frame_of_highway.png

highway视频网址:http://trace.eas.asu.edu/yuv/index.html

附录:

将yuv文件转化为一帧帧yuv文件

#include <stdio.h>
#include <fcntl.h>
#include <zconf.h>
#include <stdint.h>
#include <strings.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
int File_Size(int fd) {
  struct stat st;
  fstat(fd, &st);
  return st.st_size;
}

int Frame_Size_Of_Cif() {
  int width = 352;
  int heigh = 288;
  int Y_SIZE = width * heigh;
  int U_SIZE = Y_SIZE / 4;
  int V_SIZE = Y_SIZE / 4;
  int Frame_SIZE = Y_SIZE + U_SIZE + V_SIZE;
  return Frame_SIZE;
}

int Frames_Of_Cif_File(int fd) {
  if (fd < 0) {
    printf("Invalid FD!");
    return -1;
  }
  int Frame_SIZE = Frame_Size_Of_Cif();
  int fd_size = File_Size(fd);
  return fd_size / Frame_SIZE;
}

void Abstract_Frame_From_CIF_File(int fd,char *Path_And_Prefix_Img,int Len) {
  int Frame_SIZE = Frame_Size_Of_Cif();
  char file[128];
  memset(file,0,128);
  memcpy(file,Path_And_Prefix_Img,Len);
  uint8_t buf[Frame_SIZE];
  int ret = -1;
  int frames = 0;
  while ((ret = read(fd, buf, Frame_SIZE))) {
    frames += 1;
    uint64_t len = strlen(file);
    sprintf(file + len, "%d", frames);
    len = strlen(file);
    sprintf(file + len, "%s", ".yuv");
    int fdw = open(file, O_RDWR | O_CREAT, 0777);
    write(fdw, buf, ret);
    memset(file,0,128);
    memcpy(file,Path_And_Prefix_Img,Len);
    close(fdw);
  }
  printf("Abstract %d frames!\n", frames);
}


int main() {

  int fd = open("./yuv420p_352x288.yuv", O_RDONLY);
  Abstract_Frame_From_CIF_File(fd,"/home/liu/Frames/Frames_",strlen("/home/liu/Frames/Frames_"));
  close(fd);
  return 0;
}

以上就是python将YUV420P文件转PNG图片格式的两种方法的详细内容,更多关于python将YUV420P文件转PNG的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python实现备份文件实例
Sep 16 Python
Python调用C语言开发的共享库方法实例
Mar 18 Python
Python学习笔记整理3之输入输出、python eval函数
Dec 14 Python
详解Python在七牛云平台的应用(一)
Dec 05 Python
Python实现求数列和的方法示例
Jan 12 Python
Python BS4库的安装与使用详解
Aug 08 Python
深入浅析python 协程与go协程的区别
May 09 Python
PYTHON发送邮件YAGMAIL的简单实现解析
Oct 28 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
Feb 25 Python
Django实现将一个字典传到前端显示出来
Apr 03 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 Python
Python OpenGL基本配置方式
May 20 Python
如何使用Python进行PDF图片识别OCR
Jan 22 #Python
详解pandas映射与数据转换
Jan 22 #Python
python实现简单的井字棋游戏(gui界面)
Jan 22 #Python
Django url 路由匹配过程详解
Jan 22 #Python
浅析pandas随机排列与随机抽样
Jan 22 #Python
python 合并多个excel中同名的sheet
Jan 22 #Python
Python读取pdf表格写入excel的方法
Jan 22 #Python
You might like
PHP在特殊字符前加斜杠的实现代码
2011/07/17 PHP
php通过array_merge()函数合并关联和非关联数组的方法
2015/03/18 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
2016/03/23 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
Js的MessageBox
2006/12/03 Javascript
一个js的tab切换效果代码[代码分离]
2010/04/11 Javascript
JQuery表单验证插件EasyValidator用法分析
2014/11/15 Javascript
JavaScript获得表单target属性的方法
2015/04/02 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
JS实现点击按钮控制Div变宽、增高及调整背景色的方法
2015/08/05 Javascript
js实现瀑布流的三种方式比较
2020/06/28 Javascript
javascript+css3 实现动态按钮菜单特效
2016/02/06 Javascript
JS代码实现table数据分页效果
2016/05/26 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
js使用highlight.js高亮你的代码
2017/08/18 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
给localStorage设置一个过期时间的方法分享
2018/11/06 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
JavaScript缓动动画函数的封装方法
2020/11/25 Javascript
[01:32:50]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第一场 1月25日
2021/03/11 DOTA
简单理解Python中的装饰器
2015/07/31 Python
使用python进行拆分大文件的方法
2018/12/10 Python
详解python安装matplotlib库三种失败情况
2020/07/28 Python
python 星号(*)的多种用途
2020/09/21 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
草莓网化妆品澳大利亚站:Strawberrynet AU
2017/12/18 全球购物
文明风采获奖感言
2014/02/18 职场文书
小学语文教研活动总结
2014/07/01 职场文书
2014年最新党员对照检查材料汇总
2014/09/15 职场文书
简单租房协议书
2014/10/21 职场文书
2019消防宣传标语!
2019/07/10 职场文书
浅谈python中的多态
2021/06/15 Python