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)
请注意,将 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(黑色)。这意味着当你所有的随机点开始点缀一切时,它们会变成白色。然而,一旦一个点落在另一个点上,那将是最亮的——是所有其他点的两倍,所以它们会立即变成灰色。如果这不是您想要的,您必须考虑您的图像是否具有最大值,并假设您的图像不会改变亮度。
| 归档时间: |
|
| 查看次数: |
10998 次 |
| 最近记录: |