python - 生成移动的 2D 正弦模式
问题描述
我正在尝试生成如下所示的模式视频,该视频在 python 中使用 OpenCV 水平移动。
我已经按照以下方式编写了它。视频文件生成时没有任何错误,但文件未在任何视频播放器中打开
import cv2
import numpy as np
from cv2 import VideoWriter, VideoWriter_fourcc
video = VideoWriter('_sine_pattern_gen_'+str(60)+'_fps.avi', VideoWriter_fourcc(*'MP42'), 60, (346, 260))
x = np.arange(346) # generate 1-D sine wave of required period
y = np.sin(2 * np.pi * x / 20)
y += max(y) # offset sine wave by the max value to go out of negative range of sine
frame = np.array([[y[j] for j in range(346)] for i in range(260)], dtype='uint8') # create 2-D array of sine-wave
for _ in range(0, 346):
video.write(frame)
shifted_frame = np.roll(frame, 2, axis=1) # roll the columns of the sine wave to get moving effect
frame = shifted_frame
cv2.destroyAllWindows()
video.release()
解决方案
VideoWriter
这是在预期彩色图像时使用单通道灰度图像的问题。这可以通过使用 flag 来解决isColor=False
。
此外,由于图像是类型uint8
并且y
最多只能达到 2 个,因此这看起来像黑色视频,而不是您显示的图像。y
您可以通过乘以缩放到完整的 0-255 范围y[j]*127
。以下应该有效:
import cv2
import numpy as np
from cv2 import VideoWriter, VideoWriter_fourcc
fname = '_sine_pattern_gen_'+str(60)+'_fps.avi'
video = VideoWriter(fname, VideoWriter_fourcc(*'MP42'), 60, (346, 260), isColor=False)
x = np.arange(346) # generate 1-D sine wave of required period
y = np.sin(2 * np.pi * x / 20)
y += max(y) # offset sine wave by the max value to go out of negative range of sine
frame = np.array([[y[j]*127 for j in range(346)] for i in range(260)], dtype=np.uint8) # create 2-D array of sine-wave
for _ in range(0, 346):
video.write(frame)
shifted_frame = np.roll(frame, 2, axis=1) # roll the columns of the sine wave to get moving effect
frame = shifted_frame
video.release()
推荐阅读
- oauth-2.0 - Web 应用程序到第 3 方应用程序访问控制的 OAUTH2 混合流或授权代码流?
- java - 对于下面的 DOM 代码,我想获取日期字符串
- fortran - Fortran 重定位被截断以适应 - mcmodel -fPIC 不起作用
- json - 有没有办法使用 JSON 格式执行数字签名?与 XadES 类似,但更简单
- jquery - 如何将动态添加的 div 保存在另一个 html 文件中?
- system-verilog - 动态更改时钟模块时钟极性
- sqlite - 向表中插入随机行然后删除
- python - 如何使用键在json中获取数组?
- python - 如何从文件夹中读取每个文件并为每个文件创建单独的数据框?
- ios - 如何获取从用户位置到另一个特定位置的路线?