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遍历C盘dll文件的方法
May 06 Python
web.py在SAE中的Session问题解决方法(使用mysql存储)
Jun 24 Python
详解Python的collections模块中的deque双端队列结构
Jul 07 Python
Python模拟登陆实现代码
Jun 14 Python
Python实现抢购IPhone手机
Feb 07 Python
Python实现的简单计算器功能详解
Aug 25 Python
对Python通过pypyodbc访问Access数据库的方法详解
Oct 27 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
Jul 11 Python
Python3从零开始搭建一个语音对话机器人的实现
Aug 23 Python
python的pyecharts绘制各种图表详细(附代码)
Nov 11 Python
Pycharm中Python环境配置常见问题解析
Jan 16 Python
C3 线性化算法与 MRO之Python中的多继承
Oct 05 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的错误信息
2006/10/09 PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
解析php中的escape函数
2013/06/29 PHP
php不用正则验证真假身份证
2013/11/06 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
PHP的mysqli_select_db()函数讲解
2019/01/23 PHP
php中Swoole的热更新实现代码实例
2021/03/04 PHP
基于jquery的无限级联下拉框js插件
2011/10/29 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
让table变成exls的示例代码
2014/03/24 Javascript
window.onload使用指南
2015/09/13 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
2016/03/17 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
jQuery AJAX timeout 超时问题详解
2016/06/21 Javascript
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
微信小程序收藏功能的实现代码
2020/06/19 Javascript
JS异步宏队列微队列原理详解
2020/09/09 Javascript
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
Django使用paginator插件实现翻页功能的实例
2018/10/24 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
区分python中的进程与线程
2020/08/13 Python
html5用video标签流式加载的实现
2020/05/20 HTML / CSS
新西兰床上用品和家居用品购物网站:Adairs
2018/04/27 全球购物
ASICS印度官方网站:日本专业运动品牌
2020/06/20 全球购物
在使用非全零作为空指针内部表达的机器上, NULL是如何定义
2014/11/09 面试题
建筑专业自荐信
2013/10/18 职场文书
求职信需要的五点内容
2014/02/01 职场文书
关于环保的建议书400字
2014/03/12 职场文书
公司联欢会策划方案
2014/05/19 职场文书
机械电子工程专业求职信
2014/06/22 职场文书
中专生自荐信
2014/06/25 职场文书
就业协议书
2014/09/12 职场文书
MySQL的Query Cache图文详解
2021/07/01 MySQL
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技