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的Flask开发框架简单上手笔记
Nov 16 Python
Pycharm技巧之代码跳转该如何回退
Jul 16 Python
深入学习Python中的上下文管理器与else块
Aug 27 Python
对Python 网络设备巡检脚本的实例讲解
Apr 22 Python
python pandas实现excel转为html格式的方法
Oct 23 Python
python 制作自定义包并安装到系统目录的方法
Oct 27 Python
Python OS模块实例详解
Apr 15 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
Jul 01 Python
为什么黑客都用python(123个黑客必备的Python工具)
Jan 31 Python
Python基于requests库爬取网站信息
Mar 02 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
Jun 03 Python
python跨文件使用全局变量的实现
Nov 17 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
set_include_path在win和linux下的区别
2008/01/10 PHP
zf框架的校验器InArray使用示例
2014/03/13 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
jQuery .tmpl(), .template()学习资料小结
2011/07/18 Javascript
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
JS获取农历日期具体实例
2013/11/14 Javascript
js日期联动示例
2014/05/02 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
2014/11/23 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
Angular ng-repeat指令实例以及扩展部分
2016/12/26 Javascript
浅析JS中常用类型转换及运算符表达式
2017/07/23 Javascript
react native仿微信PopupWindow效果的实例代码
2017/08/07 Javascript
vue2.0 和 animate.css的结合使用
2017/12/12 Javascript
vuejs 制作背景淡入淡出切换动画的实例
2018/09/01 Javascript
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
基于VUE的v-charts的曲线显示功能
2019/10/01 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
原生JS实现弹幕效果的简单操作指南
2020/11/10 Javascript
PyQt5实现拖放功能
2018/04/25 Python
在python中利用opencv简单做图片比对的方法
2019/01/24 Python
PYQT5 vscode联合操作qtdesigner的方法
2020/03/24 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
Python datetime 如何处理时区信息
2020/09/02 Python
女士和男士时尚鞋在线购物:Shoespie
2019/02/28 全球购物
四川internet信息高速公路(C#)笔试题
2012/02/29 面试题
求职推荐信范文
2013/12/01 职场文书
餐厅考勤管理制度
2014/01/28 职场文书
高二物理教学反思
2014/02/08 职场文书
信息学院毕业生自荐信范文
2014/03/04 职场文书
反腐倡廉演讲稿
2014/05/22 职场文书
热门专业求职信
2014/05/24 职场文书
白酒代理协议书范本
2014/10/26 职场文书
vite+vue3.0+ts+element-plus快速搭建项目的实现
2021/06/24 Vue.js
vue elementUI批量上传文件
2022/04/26 Vue.js