我正在使用多处理来获得一个视频帧使用Opencv在python。
我的类看起来像这样:-
import cv2
from multiprocessing import Process, Queue
class StreamVideos:
def __init__(self):
self.image_data = Queue()
def start_proces(self):
p = Process(target=self.echo)
p.start()
def echo(self):
cap = cv2.VideoCapture('videoplayback.mp4')
while cap.isOpened():
ret,frame = cap.read()
self.image_data.put(frame)
# print("frame")
我使用以下命令启动进程“echo”:
p = Process(target=self.echo)
p.start()
echo函数如下所示:
def echo(self):
cap = cv2.VideoCapture('videoplayback.mp4')
while cap.isOpened():
ret,frame = cap.read()
self.image_data.put(frame)
我使用队列来放置这些帧
self.image_data.put(frame)
然后在另一个过程中我开始恢复这些画面
self.obj = StreamVideos()
def start_process(self):
self.obj.start_proces()
p = Process(target=self.stream_videos)
p.start()
def stream_videos(self):
while True:
self.img = self.obj.image_data.get()
print(self.img)
但是只要我开始把帧放进队列,RAM就会很快被填满,系统就会卡住。我正在使用的视频只有25 fps和39 MB大小,所以没有任何意义。
我注意到的一件事是,“echo”进程在“stream_videos”进程检索帧之前将大量帧放入队列中。
这个问题的根源可能是什么?
先谢谢你。
期望值:-
1.能够连续检索帧。
已尝试:-
1.不将帧放入队列中,在这种情况下,RAM不被填充。
1条答案
按热度按时间jslywgbw1#
下面是一个通用的单生成器/多使用者实现。(类
StreamVideos
)创建一个共享内存数组,其大小为视频帧中的字节数。(您将消费者的数量指定为StreamVideos
)然后可以调用StreamVideos.get_next_frame()
来检索下一帧。此方法将共享数组转换回numpy
数组以供后续处理。只有在所有使用方都调用了get_next_frame
之后,生成方才会将下一帧读入共享数组: