视频时间帧中显示的图像颜色错误

Displayed image from a time frame of a video has the wrong color

我试图提取视频的时间帧,并将其显示为图像 (JPEG)。但不幸的是,使用 PIL.Image.fromarray() 显示的图像比预期的更蓝。棘手的部分是,当我先保存它(使用 cv2.imwrite)并使用 PIL.Image.open() 打开该新文件时,图像具有正确的颜色。

我以为它与RGB数组组成有关,但后来我检查了一下,两个数组(直接来自帧和来自Image.open())完全相同。

我可以做些什么来显示正确的图像而不事先将其保存为外部文件吗?

谢谢。

def TimeFrame(file, tf):
    capture = cv2.VideoCapture(file)
    frameCount = int(capture.get(cv2.CAP_PROP_FRAME_COUNT))
    capture.set(cv2.CAP_PROP_POS_FRAMES, tf)
    _, frame = capture.read()


    directTF = Image.fromarray(frame)

    cv2.imwrite("12345678999.jpg", frame)
    image = Image.open("12345678999.jpg")

注意:file 是视频的名称,tf 是您要从中提取图像的特定时间范围。

OpenCV 使用 BGR 作为图像的默认颜色顺序

显示前使用cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

OpenCV 使用 BGR,PIL 使用 RGB。

你可能想试试

directTF = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))

让 OpenCV 在您要求 PIL 读取数组之前翻转这些通道。