这是一个关于并发/并行性的更普遍的问题,但是由于我在这些主题上没有太多的经验,所以我专门要求我的用例。
我的电脑里插了两个摄像头。我可以通过SDK来控制它们(在我的例子中是PySpin)。我使用这个简化的循环获取并保存图像,保存时间为duration秒:
count = 0
t_end = time.time() + duration
while time.time() < t_end:
for cam in cameras:
img_raw = cam.GetNextImage()
img = img_raw.GetNDArray()
cv2.imwrite('{}_img_{}.png'.format(device_name, count), img)
img_raw.Release()
count += 0这里有两个问题:
,
我想做的是:相机应该并行地拍摄图像,当拍摄到图像时,也就是相机已经在获取下一个图像时,图像应该保存在图像中。
正如我所说的,我不熟悉并发/并行,因此我不知道如何处理它。但是,我认为要解决第一个问题,我需要多进程/线程(并行性),例如使用multiprocessing。但是对于第二个问题,我需要一个使用asyncio的异步进程。
我在正确的道路上吗?如果是这样的话,我如何实现这一点呢?
发布于 2020-07-24 20:12:59
我可能会迟到,但我正在开发一个Python包,允许您这样做。它仍在开发中,但如果您感兴趣,请查看它:
https://github.com/jbhunt/parallel-pyspin
TLDR是指每台摄像机都在自己的进程上运行(通过多处理)。有些类处理设置初级和二级摄像机的所有棘手问题。您只需要知道摄像机的序列号,还要按照以下说明设置物理触发器:
请随时作出贡献:)
发布于 2020-06-29 08:27:31
非常通用的建议,没有任何代码,但可能值得一试:
实现三个线程的建议
线程1:从照相机1获取原始图像,并将(raw_image, filename_to_save_as)的元组添加到线程安全队列(from queue import Queue)中。
线程2:从照相机2获取原始图像,并将(raw_image, filename_to_save_as)的元组添加到线程安全队列(from queue import Queue)中。
线程3:处理队列并将每个原始图像保存在传递的文件名下。
请注意:您可能希望在队列中添加一个最大大小,以避免内存溢出,以防文件被压缩成为您设置中的瓶颈。
https://stackoverflow.com/questions/62633346
复制相似问题