如何从 Python 中更新的 numpy 数组制作视频

Beh*_*ali 6 python opencv numpy

我有一个循环修改water_depth类型为 2D numpy 数组的元素float。该阵列包含每个像素的水深,范围通常在 0 到 1.5m 之间。我想用这个不断变化的数组制作一个视频:每次迭代都可以是视频中的一个帧。我只发现这个链接解释了一个类似的问题,并建议使用 cv2 VideoWriter。问题是我的 numpy 数组是一个浮点数,而不是整数。这是否意味着我需要在每次迭代中对我的数组进行某种预处理?

import numpy as np

water_depth = np.zeros((500,700), dtype=float)

for i in range(1000):
    random_locations = np.random.random_integers(200,450, size=(200, 2))
    for item in random_locations:
        water_depth[item[0], item[1]] += 0.1
        #add this array to the video
Run Code Online (Sandbox Code Playgroud)

alk*_*asm 9

请注意,将 OpenCV 用于视频 I/O 目的有时会很棘手。该库不是围绕支持这些类型的操作而构建的,它们只是作为一个细节被包含在内。通常,OpenCV 将建立在ffmpeg支持的基础上,并且您是否拥有与其他人相同的编解码器来读/写视频在某种程度上取决于您的系统。话虽如此,这是一个示例,因此您可以确切了解您可能会执行哪些预处理:

import numpy as np
import cv2

# initialize water image
height = 500
width = 700
water_depth = np.zeros((height, width), dtype=float)

# initialize video writer
fourcc = cv2.VideoWriter_fourcc('M','J','P','G')
fps = 30
video_filename = 'output.avi'
out = cv2.VideoWriter(video_filename, fourcc, fps, (width, height))

# new frame after each addition of water
for i in range(10):
    random_locations = np.random.random_integers(200,450, size=(200, 2))
    for item in random_locations:
        water_depth[item[0], item[1]] += 0.1
        #add this array to the video
        gray = cv2.normalize(water_depth, None, 255, 0, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
        gray_3c = cv2.merge([gray, gray, gray])
        out.write(gray_3c)

# close out the video writer
out.release()
Run Code Online (Sandbox Code Playgroud)

请注意,我将迭代次数更改为 10 而不是 1000,只是为了确保它有效。此处normalize(..., 255, 0, ...)缩放图像,使最大值为 255(白色),最小值为 0(黑色)。这意味着当你所有的随机点开始点缀一切时,它们会变成白色。然而,一旦一个点落在另一个点上,那将是最亮的——是所有其他点的两倍,所以它们会立即变成灰色。如果这不是您想要的,您必须考虑您的图像是否具有最大值,并假设您的图像不会改变亮度。

  • @BehzadJamali,当然,你可以做到这一点——在 HSV 色彩空间中可能是最简单的。您可以在[此处](/sf/answers/3154980321/)和[此处](/sf/answers/3227940551/)查看我的答案,以进一步熟悉 HSV 。 (2认同)