Python 加快镜头的实时绘制(cv2)

Python 加快镜头的实时绘制(cv2),python,matplotlib,opencv3.0,Python,Matplotlib,Opencv3.0,我试图使用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,59

我试图使用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来提高进程的速度。有没有更好的方法来处理和绘制视频帧?

的答案显示了在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()
的答案显示了在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()

这似乎与作者的答案密切相关,主要的一点是不要在每次迭代中重新创建完整的情节。如果使用该答案中的第二种方法,则使用
blit=True
可能会进一步提高速度。@ImportanceOfBeingErnest如何才能最好地避免在每次迭代中创建绘图?目前还不清楚如何替换和实现
blit=True
。这似乎与中所示的答案密切相关,重点是不要在每次迭代中重新创建完整的绘图。如果使用该答案中的第二种方法,则使用
blit=True
可能会进一步提高速度。@ImportanceOfBeingErnest如何才能最好地避免在每次迭代中创建绘图?不清楚如何替换和实现
blit=True