• 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;
    }
  • 相关阅读:
    大话Ansible Ad-Hoc命令
    Ansible常用模块基本操作
    Java集合类总结
    HTTP文件上传原理
    Java IO流基础总结
    Java中的Enumeration、Iterable和Iterator接口详解
    网页缓存相关的HTTP头部信息详解
    4. OpenCV-Python——模版匹配、直方图
    3. OpenCV-Python——图像梯度算法、边缘检测、图像金字塔与轮廓检测与傅里叶变换
    2. OpenCV-Python——阈值、平滑处理、形态学操作
  • 原文地址:https://www.cnblogs.com/iuyy/p/14238301.html
Copyright © 2020-2023  润新知