使用缓冲区进行Python视频处理 - 执行两个线程时出错

问题描述 投票:0回答:1

我开始使用openCv和线程进行视频处理。

在这种情况下,测试是使用mp4视频完成的,但目的是通过IP摄像头进行测试。由于我无法控制我的视频源给我的FPS,我的想法是添加处理,我所做的是以下列方式工作:

  • 一个主线程获取我的源的帧并将它们推入FIFO(它是我的输入缓冲区)
  • 从另一个线程我做的是取出帧来处理它们并控制帧丢弃。

我使用以下代码进行了测试但是我无法让它正常工作,暂时它可以工作,之后我的计算机停止响应所以我猜这是一个内存问题。

import threading, time
import cv2
import queue

input_buffer = queue.Queue()

def processing():
    while True:
        if not input_buffer.empty():
            print("get")
            frame=input_buffer.get()
            cv2.imshow("Video",frame)
            time.sleep(0.025)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
    return

cap = cv2.VideoCapture('videoplayback.mp4')
t = threading.Thread(target=processing)
t.start()

while True:
    ret, frame = cap.read()
    if ret and not input_buffer.full():
        input_buffer.put(frame)
        print("put")

你能帮我看看问题是什么吗?

python multithreading opencv video
1个回答
0
投票

我编辑了一些东西:

  • 首先:你没有为队列定义maxsize,所以检查它是否已满并没有做任何事情,因为总是有空间。
  • get(..)只是阻止线程,如果没有项目,直到它找到一个,所以不需要检查是否有任何
  • 你应该让主线程中的while循环也有一点sleep(0.025)否则它会不断填满队列

通过这些改变,我能够玩mp4。希望现在你也是。

import threading, time
import cv2
import queue

input_buffer = queue.Queue()

def processing():
    while True:
        print("get")
        frame=input_buffer.get()
        cv2.imshow("Video",frame)
        time.sleep(0.025)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    return

cap = cv2.VideoCapture('videoplayback.mp4')
t = threading.Thread(target=processing)
t.start()

while True:
    ret, frame = cap.read()
    input_buffer.put(frame)
    time.sleep(0.025)
    print("put")
© www.soinside.com 2019 - 2024. All rights reserved.