在下面的代码数组中,使用Opencv库进行对象检测过程之后,我将输出信息作为参数提供给matplotlib。但是视频过程进展缓慢。如果我只进行对象检测而不运行图部分;实时对象检测效果很好。但是,当两者一起执行时,对象检测过程会变慢。您对加快流程有什么建议吗?
<CheckBox Content="test1" Foreground="White" Height="16"
HorizontalAlignment="Left" Margin="459,-29,0,0"
Name="checkBox1"
VerticalAlignment="Top"
IsThreeState="True"
Checked="checkBox1_Checked" Unchecked ="checkBox1_Unchecked"
Indeterminate="checkBox1_Indeterminate"/>
答案 0 :(得分:0)
一个潜在的原因可能是由于读取帧时的I / O延迟。由于cv2.VideoCapture().read()
是阻塞操作,因此主程序将停顿,直到从相机设备读取一帧并返回为止。一种提高性能的方法是生成另一个线程以 parallel 的方式处理抓帧,而不是依赖单个线程以 sequential 的顺序抓帧。我们可以通过创建一个仅轮询新帧而主线程处理/绘制最新帧的新线程来提高性能。
您当前的方法(顺序):
线程1:抓取框架->
处理框架->
绘制
建议的方法(并行):
线程1:抢帧
from threading import Thread
import time
def get_frames():
while True:
ret, frame = cap.read()
time.sleep(.01)
thread_frames = Thread(target=self.get_frames, args=())
thread_frames.daemon = True
thread_frames.start()
线程2:处理框架->
绘图
def process_frames():
while True:
# Grab most recent frame
# Process/plot frame
...
由于具有单独的线程,因此您的程序将是并行的,因为始终会有准备好要处理的帧,而不必等待帧被读入才可以进行处理。
注意::此方法将基于I / O延迟减少而提高性能。这并不是FPS的真正提高,因为这是延迟的大幅降低(一帧始终可用于处理;我们无需轮询摄像头设备并等待I / O去完成)。