我正在尝试使用cv2模块为视频的每个帧创建实时散点图。下面的代码正是如此。
但是,如果超过8分钟的素材包含60000多帧要处理,则代码效率不高,并且需要比获得所需输出所需的时间更长的时间。
vidcap = cv2.VideoCapture(filepath)
fig, ax = plt.subplots(1)
plt.ion()
x=df["time"][7:100]
y=df["force"][7:100]
for i in range(len(x)):
vidcap.set(1,590)
ret, image = vidcap.read()
frameId = vidcap.get(1)
plt.imshow(image,extent=[0,200,0,100], aspect='auto')
plt.subplot(221)
plt.plot(x[0+i:1+i],y[0+i:1+i],'or', lw=2)
plt.subplot(222)
fig.set_size_inches(20, 10)
plt.pause(.000001)
plt.draw()
我考虑过使用pyqtgraph来提高进程的速度。是否有更好的方法来处理和绘制视频帧?
答案 0 :(得分:0)
This question的答案显示了两种在matplotlib中获取视频的方法。
重点是不要在每次迭代时重新创建完整的图。如果使用该答案的第二种方法,blit=True
的使用可能会进一步提高速度。这显示在下面的代码中。
import cv2
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
df = pd.DataFrame({"time": np.linspace(0,20, num=100),
"force" : np.cumsum(np.random.randn(100))})
def grab_frame(cap):
ret,frame = cap.read()
return frame # or cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
#Initiate
vidcap = cv2.VideoCapture(0)
# vidcap.set(1,590)
fig, (ax,ax2) = plt.subplots(ncols=2,figsize=(20, 10))
x=df["time"][7:100]
y=df["force"][7:100]
#create two image plots
im1 = ax.imshow(grab_frame(vidcap),extent=[0,200,0,100], aspect='auto')
line, = ax2.plot(x[0:1],y[0:1],'or')
ax2.set_xlim(x.min(), x.max())
ax2.set_ylim(y.min(), y.max())
def update(i):
im1.set_data(grab_frame(vidcap))
line.set_data(x[0+i:1+i],y[0+i:1+i])
return im1, line
ani = FuncAnimation(fig, update, frames=len(x), interval=1, blit=True)
plt.show()