zoukankan      html  css  js  c++  java
  • python将YUV420P文件转PNG图片格式

    方法一:

    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!
    ", 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;
    }
  • 相关阅读:
    Spring事务的那些坑,这里都给你总结好了!
    8 种方案解决重复提交问题!你选择哪一种呀?
    一张900w的数据表,16s执行的SQL优化到300ms?
    这 5 个开源的能挣钱的 SpringBoot 项目,真TMD香!
    邮箱mail 发送类 ASP.NET C#
    ValidationSugar表单验证框架-支持ASP.NET MVC ASP.NET WebFroM
    Jquery几个比较实用,但又让很多人忽略的几个函数
    ASP.NET MVC和WebForm 轻松实现前端和后端的双重验证 jquery.validate+ValidationSugar
    让 ASP.NET JS验证和服务端的 双验证 更简单
    ASP.NETC#通用扩展函数之TypeParse 类型转换方便多了
  • 原文地址:https://www.cnblogs.com/iuyy/p/14238301.html
Copyright © 2011-2022 走看看