Python读取视频,由YUV转RGB,保存多张图片或者视频

在计算机视觉领域,处理视频数据是一个常见的任务。本文将介绍如何使用Python读取视频文件,将YUV格式的图像数据转换为RGB格式,并保存为多张图片或者视频文件。

1. 安装依赖库

在开始之前,我们需要安装一些Python依赖库来处理视频和图像数据。这些库包括OpenCV和Pillow。

可以使用以下命令来安装这些库:

pip install opencv-python
pip install Pillow

2. 读取视频文件

首先,我们需要使用OpenCV库来读取视频文件。以下是一个示例代码,演示了如何读取视频文件并显示每一帧的图像:

import cv2

video_path = "path_to_video_file"
cap = cv2.VideoCapture(video_path)

while(cap.isOpened()):
    ret, frame = cap.read()

    if ret == True:
        cv2.imshow('Frame', frame)

        # 按下q键退出循环
        if cv2.waitKey(25) & 0xFF == ord('q'):
            break
    else:
        break

cap.release()
cv2.destroyAllWindows()

以上代码中,我们首先通过cv2.VideoCapture函数打开视频文件。然后,使用cap.read()函数读取一帧图像数据。如果读取成功,ret将返回Trueframe将包含图像数据。我们可以使用cv2.imshow函数显示图像,使用cv2.waitKey函数等待用户按下q键退出循环。最后,我们使用cap.release()释放资源,使用cv2.destroyAllWindows()关闭窗口。

3. 将YUV转换为RGB

通常情况下,视频数据以YUV格式存储。Y代表亮度(Luma),U和V代表色度(Chroma)。我们需要将YUV数据转换为RGB格式,以便进行后续处理。

以下是一个示例代码,演示了如何将YUV图像数据转换为RGB图像数据:

import cv2
import numpy as np

def yuv_to_rgb(y, u, v):
    r = y + 1.402 * (v - 128)
    g = y - 0.344136 * (u - 128) - 0.714136 * (v - 128)
    b = y + 1.772 * (u - 128)

    r = np.clip(r, 0, 255).astype(np.uint8)
    g = np.clip(g, 0, 255).astype(np.uint8)
    b = np.clip(b, 0, 255).astype(np.uint8)

    return r, g, b

video_path = "path_to_video_file"
cap = cv2.VideoCapture(video_path)

while(cap.isOpened()):
    ret, frame = cap.read()

    if ret == True:
        # 分离YUV通道
        yuv = cv2.cvtColor(frame, cv2.COLOR_BGR2YUV)
        y, u, v = cv2.split(yuv)

        # 将YUV转换为RGB
        r, g, b = yuv_to_rgb(y, u, v)
        rgb = cv2.merge([r, g, b])

        cv2.imshow('Frame', rgb)

        if cv2.waitKey(25) & 0xFF == ord('q'):
            break
    else:
        break

cap.release()
cv2.destroyAllWindows()

以上代码中,我们首先使用cv2.cvtColor函数将BGR格式的帧图像转换为YUV格式。然后,使用cv2.split函数将YUV图像数据分离为三个通道的图像数据。接下来,我们使用自定义的yuv_to_rgb函数将YUV图像数据转换为RGB图像数据。最后,我们使用cv2.merge函数将RGB图像数据合并为一帧图像。

4. 保存为多张图片

如果我们想将视频帧保存为多张图片,可以在循环中使用cv2.imwrite函数将每一帧图像保存为单独的文件。以下是一个示例代码:

import cv2

video_path = "path_to_video_file"
output_path = "path_to_output_folder"
cap = cv2.VideoCapture(video_path)

frame_count = 0
while(cap.isOpened()):
    ret, frame = cap.read()

    if ret == True:
        output_file = f"{output_path}/frame_{frame_count}.jpg"
        cv2.imwrite(output_file, frame)

        frame_count += 1