python - 这段代码是否有理由随着时间的推移呈指数级减慢,有没有办法解决它?
问题描述
随着时间的推移,这个程序开始运行得越来越慢,以至于它实际上无法使用。
我尝试删除循环中使用的变量,使用 cap.release() 释放我与 cv2 一起使用的视频,并附加到列表而不是使用 np.append() 函数。
def video_generator(name_of_video, video, cap, number_of_frames):
check, frame = cap.read()
A = []
a = []
if cap.isOpened():
width = int(cap.get(3))
height = int(cap.get(4))
dims = (height, width)
while cap.isOpened():
check, frame = cap.read()
if check:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY).flatten()
A.append(gray)
a.append('row')
else:
break
Data = np.array(A)
B = np.resize(Data, (number_of_frames, width * height))
U, S, V = decomposition.randomized_svd(B, 2)
background = U @ np.diag(S) @ V
foreground = ([])
def generate_frames(B, background):
for i in range(number_of_frames):
foreground = np.reshape(B[i] - background[i], dims)
frame = plt.imshow(foreground, cmap = 'gray')
plt.savefig('D:/Python_Programs/BR_SVD/Frames/' + name_of_video + '/file_' + str(i + x * number_of_frames).zfill(2) + '.png')
del frame
del foreground
gc.collect()
generate_frames(B, background)
del B
del background
gc.collect()
cap.release()
if number_of_frames_initial <= 200:
cap = cv2.VideoCapture(video)
video_generator(name_of_video, video_initial, cap_initial, number_of_frames_initial)
else:
number_of_videos = int(number_of_frames_initial/200 + 1)
time_of_videos = duration/number_of_videos
for x in range (number_of_videos):
subprocess.call ([
'ffmpeg', '-i', video_initial, '-ss', str(time_of_videos * x), '-t', str(time_of_videos), 'D:/Python_Programs/BR_SVD/Temp_Videos/video_%02d.mp4' % x])
video = 'D:/Python_Programs/BR_SVD/Temp_Videos/video_%02d.mp4' % x
cap = cv2.VideoCapture(video)
number_of_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
video_generator(name_of_video, video, cap, number_of_frames)
此代码接收一个视频,然后输出原始视频前景的黑白视频。
解决方案
推荐阅读
- tensorflow - Keras ImageDataGenerator 用于多个输入和基于图像的目标输出
- php - 如何使用 CloudConvert API
- apache-spark - Spark 流 - 原因:org.apache.parquet.io.ParquetDecodingException:无法读取文件中块 0 中 1 处的值
- c++ - 无法在 VSCode 中设置 C++ 调试;无法识别调试类型
- sql-server - 从 SQL Server 到 Blob 容器的数据库备份在 24 分钟内失去连接
- reactjs - 编写减速器的更好方法?
- html - 提交表单时选择选项默认值null被翻译为字符串“null”
- json - 将 Bash/Unix 面向行的管道包装在 json 结构中
- python-requests - 如果第一个 JSON 参数不是“params”,如何从 Odoo 中的 Webhook 访问数据?
- java - 为什么 SQLite 没有这样的列错误?