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中datetime模块参考手册
Jan 13 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
Jun 09 Python
python将秒数转化为时间格式的实例
Sep 16 Python
树莓派实现移动拍照
Jun 22 Python
Pycharm保存不能自动同步到远程服务器的解决方法
Jun 27 Python
pyinstaller还原python代码过程图解
Jan 08 Python
TensorFlow MNIST手写数据集的实现方法
Feb 05 Python
python数据库编程 Mysql实现通讯录
Mar 27 Python
Java ExcutorService优雅关闭方式解析
May 30 Python
基于python实现生成指定大小txt文档
Jul 20 Python
python -v 报错问题的解决方法
Sep 15 Python
python中delattr删除对象方法的代码分析
Dec 15 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
2014年10个最佳的PHP图像操作库
2014/07/14 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
2015/12/17 PHP
PHP 数组基本操作小结(推荐)
2016/06/13 PHP
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
PHP-FPM和Nginx的通信机制详解
2019/02/01 PHP
div拖拽插件——JQ.MoveBox.js(自制JQ插件)
2013/05/17 Javascript
js中split函数的使用方法说明
2013/12/26 Javascript
JQuery判断checkbox是否选中及其它复选框操作方法合集
2015/06/01 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
浅谈Javascript中的函数、this以及原型
2016/10/09 Javascript
js css3实现图片拖拽效果
2017/03/04 Javascript
小程序click-scroll组件设计
2019/06/18 Javascript
简单谈谈javascript高级特性
2019/09/04 Javascript
vue点击当前路由高亮小案例
2019/09/26 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
Python命令行参数解析模块getopt使用实例
2015/04/13 Python
多版本Python共存的配置方法
2017/05/22 Python
python操作MySQL 模拟简单银行转账操作
2017/09/27 Python
Python中装饰器学习总结
2018/02/10 Python
python多线程并发让两个LED同时亮的方法
2019/02/18 Python
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
selenium+python配置chrome浏览器的选项的实现
2020/03/18 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
同步和异步有何异同,在什么情况下分别使用他们?
2012/12/28 面试题
2014中考励志标语
2014/06/05 职场文书
机械专业应届毕业生自荐书
2014/06/12 职场文书
节电标语大全
2014/06/23 职场文书
党员群众路线对照检查材料思想汇报
2014/09/17 职场文书
2014迎国庆标语大全
2014/09/19 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
2015年药店工作总结
2015/04/20 职场文书
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript