我正在使用opencv
和matplotlib
来显示jupyter
笔记本中视频的帧。 jupyter
笔记本正在使用opencv.imshow()
远程运行,导致其崩溃。因此,我试图让matplotlib
显示视频帧,并希望能使它更新到位。
所以,我有以下内容:
%matplotlib inline
import cv2
from matplotlib import pyplot as plt
import time
然后我加载视频并将一些参数设置为:
cap = cv2.VideoCapture('test.avi')
fps = cap.get(cv2.CAP_PROP_FPS)
delay = 1.0 / fps
现在我尝试按如下所示循环显示视频:
count = 0
while cap.isOpened():
ret, frame = cap.read()
if ret:
if count == 0:
height, width, depth = frame.shape
dpi = 80
fig_size = width / float(dpi), height / float(dpi)
# Setup the matplotlib figure and axes
fig, ax = plt.subplots(figsize=fig_size)
frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
ax.imshow(frame, interpolation='none', aspect="auto", cmap="gray")
plt.show()
time.sleep(delay)
count += 1
if count > 1000:
break
else:
break
cap.release()
cv2.destroyAllWindows()
与此相关的问题是matplotlib显示屏显示第一帧,并且永远不会更新。我还尝试过在clear_output(wait=True)
调用之前调用show()
,但这只是立即清除输出,并且再也不会显示。
我也尝试过类似的事情:
if count == 0:
height, width, depth = frame.shape
dpi = 80
fig_size = width / float(dpi), height / float(dpi)
image = plt.imshow(frame)
else:
image.set_data(frame)
plt.pause(delay)
因此基本上可以替换数据,但这也能以某种方式显示一张图像,并且似乎不会在循环中更新。