提高Matplotlib图形和OpenCV视频处理性能

时间:2019-03-28 09:42:32

标签: python opencv matplotlib

在下面的代码数组中,使用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"/>

1 个答案:

答案 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去完成)。