【发布时间】:2018-08-17 21:34:04
【问题描述】:
我想与我的多处理子进程共享我在 OpenVC 中捕获的帧,但 video_capture.read() 创建了一个新对象并且不写入我将通过用 multiprocessing.Array() 包装来共享的我的 numpy 数组
代码如下:
ret, frame = video_capture.read()
shared_array = mp.Array(ctypes.c_uint16, frame.shape[0] * frame.shape[1], lock=False)
while True:
b = np.frombuffer(shared_array)
ret, b = video_capture.read()
但是缓冲区b 被read() 函数覆盖。所以我不写入我的缓冲区/共享数组。
在子流程中我执行以下操作:
img = np.frombuffer(shared_array)
cv2.imshow('Video', img)
仅包含视频第一帧的共享数组。如何正确写入共享数组以读取子进程中的每一帧? 我不想使用队列或管道。共享内存是一种方式,因为更多的进程会消耗帧。
【问题讨论】:
-
如果你这样做
ret, b[:] = video_capture.read()可能吗? (也不需要在每次循环迭代时不断调用np.frombuffer吗?) -
谢谢!我试过了,我认为这是正确的方法。但它是说:“无法将输入数组从形状(720,1280,3)广播到形状(691200)”。所以我将原始opencv帧的形状分配给缓冲区(共享数组),但随后它说“ValueError:无法将大小为691200的数组重塑为形状(720,1280,3)”。你知道我如何修复数组的大小吗?
-
shared_array 似乎是扁平的
标签: python numpy opencv shared-memory python-multiprocessing