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中super关键字用法实例分析
May 28 Python
Python实现将不规范的英文名字首字母大写
Nov 15 Python
python表格存取的方法
Mar 07 Python
python素数筛选法浅析
Mar 19 Python
解决Python下json.loads()中文字符出错的问题
Dec 19 Python
Python3数字求和的实例
Feb 19 Python
Python两台电脑实现TCP通信的方法示例
May 06 Python
基于Python打造账号共享浏览器功能
May 30 Python
如何使用Flask-Migrate拓展数据库表结构
Jul 24 Python
Python Lambda函数使用总结详解
Dec 11 Python
PyCharm上安装Package的实现(以pandas为例)
Sep 18 Python
pandas统计重复值次数的方法实现
Feb 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添加MySQL数据记录代码
2008/06/07 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
PHP未登录自动跳转到登录页面
2016/12/21 PHP
关于jQuery中的end()使用方法
2011/07/10 Javascript
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
document节点对象的获取方式示例介绍
2013/12/24 Javascript
jquery插件开发之实现md5插件
2014/03/17 Javascript
JavaScript中的变量定义与储存介绍
2014/12/31 Javascript
jQuery实现带延迟效果的滑动菜单代码
2015/09/02 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
基于jQuery插件jqzoom实现的图片放大镜效果示例
2017/01/23 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
解决vue+webpack打包路径的问题
2018/03/06 Javascript
Vue-cli项目获取本地json文件数据的实例
2018/03/07 Javascript
详解vue.js下引入百度地图jsApi的两种方法
2018/07/27 Javascript
深入学习js函数的隐式参数 arguments 和 this
2019/06/24 Javascript
JavaScript 反射和属性赋值实例解析
2019/10/28 Javascript
通过Python使用saltstack生成服务器资产清单
2016/03/01 Python
Python利用operator模块实现对象的多级排序详解
2017/05/09 Python
Python实现删除文件中含“指定内容”的行示例
2017/06/09 Python
详解python实现线程安全的单例模式
2018/03/05 Python
Flask Web开发入门之文件上传(八)
2018/08/17 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
python装饰器的特性原理详解
2019/12/25 Python
Python 2种方法求某个范围内的所有素数(质数)
2020/01/31 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
HTML5在线预览PDF的示例代码
2017/09/14 HTML / CSS
Manduka官网:瑜伽垫、瑜伽毛巾和服装
2018/07/02 全球购物
给排水专业应届生求职信
2013/10/12 职场文书
乐观大学生的自我评价
2014/01/10 职场文书
初中地理教学反思
2014/01/11 职场文书
大学生个人事迹材料
2014/01/21 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书
Nginx反向代理至go-fastdfs案例讲解
2021/08/02 Servers