使用缓冲区进行Python视频处理 - 执行两个线程时出错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用缓冲区进行Python视频处理 - 执行两个线程时出错相关的知识,希望对你有一定的参考价值。
我开始使用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")
你能帮我看看问题是什么吗?
答案
我编辑了一些东西:
- 首先:你没有为队列定义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")
以上是关于使用缓冲区进行Python视频处理 - 执行两个线程时出错的主要内容,如果未能解决你的问题,请参考以下文章
Python-Opencv 在内存缓冲区上写入 x264 视频
芹菜任务设置与视频帧的内存缓存作为python中的循环缓冲区策略