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 相关文章推荐
Google开源的Python格式化工具YAPF的安装和使用教程
May 31 Python
python常用知识梳理(必看篇)
Mar 23 Python
python实现上传下载文件功能
Nov 19 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
Python线性拟合实现函数与用法示例
Dec 13 Python
Python实现将通信达.day文件读取为DataFrame
Dec 22 Python
python 读取更新中的log 或其它文本方式
Dec 24 Python
Python实现自动签到脚本的示例代码
Aug 19 Python
python 深度学习中的4种激活函数
Sep 18 Python
利用python批量爬取百度任意类别的图片的实现方法
Oct 07 Python
python基于tkinter实现gif录屏功能
May 19 Python
实战Python爬虫爬取酷我音乐
Apr 11 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在各种web服务器的运行模式详解
2013/06/03 PHP
PHP实现基于mysqli的Model基类完整实例
2016/04/08 PHP
php修改数组键名的方法示例
2017/04/15 PHP
PHP批量删除jQuery操作
2017/07/23 PHP
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
使用JavaScript获取电池状态的方法
2014/05/03 Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
2016/06/14 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
vue中使用refs定位dom出现undefined的解决方法
2017/12/21 Javascript
vue使用xe-utils函数库的具体方法
2018/03/06 Javascript
webpack external模块的具体使用
2018/03/10 Javascript
webpack4+react多页面架构的实现
2018/10/25 Javascript
对 Vue-Router 进行单元测试的方法
2018/11/05 Javascript
javascript 构建模块化开发过程解析
2019/09/11 Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
2019/10/30 Javascript
[16:27]DOTA2 HEROS教学视频教你分分钟做大人-艾欧
2014/06/11 DOTA
Linux下python3.7.0安装教程
2018/07/30 Python
Python3随机漫步生成数据并绘制
2018/08/27 Python
使用python进行广告点击率的预测的实现
2019/07/04 Python
tensorflow 报错unitialized value的解决方法
2020/02/06 Python
详解使用canvas保存网页为pdf文件支持跨域
2018/11/23 HTML / CSS
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
英国人最爱的饰品网站:Accessorize
2016/08/22 全球购物
几个常见的消息中间件(MOM)
2014/01/08 面试题
介绍下Java中==和equals的区别
2013/09/01 面试题
主持人演讲稿范文
2013/12/28 职场文书
物业工作计划书
2014/01/10 职场文书
教师自我剖析材料
2014/09/29 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
老公出轨后的保证书
2015/05/08 职场文书
2015暑假实习报告范文
2015/07/13 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
总结python多进程multiprocessing的相关知识
2021/06/29 Python