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使用循环实现批量创建文件夹示例
Mar 25 Python
零基础写python爬虫之HTTP异常处理
Nov 05 Python
深入探究Python中变量的拷贝和作用域问题
May 05 Python
python实现判断数组是否包含指定元素的方法
Jul 15 Python
浅谈python抛出异常、自定义异常, 传递异常
Jun 20 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
May 19 Python
pyQt4实现俄罗斯方块游戏
Jun 26 Python
Python3.5局部变量与全局变量作用域实例分析
Apr 30 Python
numpy.random模块用法总结
May 27 Python
selenium切换标签页解决get超时问题的完整代码
Aug 30 Python
Python安装Bs4的多种方法
Nov 28 Python
python中温度单位转换的实例方法
Dec 27 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
关于我转生变成史莱姆这档事:第二季PV上线,萌王2021年回归
2020/05/06 日漫
在PHP中执行系统外部命令
2006/10/09 PHP
ThinkPHP的L方法使用简介
2014/06/18 PHP
PHP实现简单ajax Loading加载功能示例
2016/12/28 PHP
laravel 实现登陆后返回登陆前的页面方法
2019/10/03 PHP
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
这些年、我收集的JQuery代码小结
2012/08/01 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
2014/10/16 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
JavaScript面试题(指针、帽子和女朋友)
2016/11/23 Javascript
关于 jQuery Easyui异步加载tree的问题解析
2016/12/06 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
2017/12/27 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
微信小程序时间控件picker view使用详解
2018/12/28 Javascript
用原生 JS 实现 innerHTML 功能实例详解
2019/04/03 Javascript
vue 实现单选框设置默认选中值
2019/11/07 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
使用Python生成XML的方法实例
2017/03/21 Python
python3操作mysql数据库的方法
2017/06/23 Python
django组合搜索实现过程详解(附代码)
2019/08/06 Python
python requests抓取one推送文字和图片代码实例
2019/11/04 Python
python查询MySQL将数据写入Excel
2020/10/29 Python
python字典与json转换的方法总结
2020/12/28 Python
TensorFlow低版本代码自动升级为1.0版本
2021/02/20 Python
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
中式餐厅创业计划书范文
2014/01/23 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
健康教育评估方案
2014/05/25 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
关于运动会的广播稿
2014/09/22 职场文书
护理专业自荐信范文
2015/03/06 职场文书
使用python求解迷宫问题的三种实现方法
2022/03/17 Python
2022微信温控新功能上线
2022/05/09 数码科技