python将YUV420P文件转PNG图片格式的两种方法

方法一:

import osimport cv2 as cvimport 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 = 352image_hight = 288image_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] = pixelimage_u[2 * r + 1][2 * c + 0] = pixelimage_u[2 * r + 0][2 * c + 1] = pixelimage_u[2 * r + 1][2 * c + 1] = pixelImage_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] = pixelimage_v[2 * r + 0][2 * c + 1] = pixelimage_v[2 * r + 1][2 * c + 0] = pixelimage_v[2 * r + 1][2 * c + 1] = pixelImage_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 #include #include #include #include #include #include #include #include #include #include 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将YUV420P文件转PNG的资料请关注脚本之家其它相关文章!

    推荐阅读