【问题标题】:Taking images in parallel and saving them asynchronously using Python使用 Python 并行获取图像并异步保存它们
【发布时间】:2020-06-29 07:38:31
【问题描述】:

这是一个关于并发/并行性的更普遍的问题,但由于我在这些主题上没有太多经验,所以我专门针对我的用例提出问题。

我的 PC 中插入了两个摄像头。我可以通过 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

这里有两个问题:

  1. 摄像头相互遮挡。假设第一台相机的曝光时间很长。其他相机需要等待这台相机拍摄图像。
  2. 保存图像会减慢处理速度,理论上可能会减慢相机的帧速率。

我想做以下事情:相机应该并行拍摄图像,并且无论何时拍摄图像都应该保存图像,即当相机已经在获取下一张图像时。

正如我所说,我不熟悉并发/并行性,因此我真的不知道如何解决它。但是,我认为要解决第一个问题,我需要多处理/线程(并行),例如使用multiprocessing。但对于第二个问题,我需要一个使用 asyncio 的异步进程。

我在正确的道路上吗?如果是这样,我该如何实现?

【问题讨论】:

  • 您是连续数月/数年拍摄照片,还是一个相对较短的实验?您是否计算过每台相机获取图像所需的时间?您是否计算了保存图像需要多长时间?您是否考虑过另存为通常比 PNG 更快的 JPEG?每个图像的像素大小是多少?它们是彩色图像还是灰度图像?您是否考虑过保存为视频而不是静止图像?两个相机是独立的还是它们之间必须有一些同步?

标签: python asynchronous parallel-processing


【解决方案1】:

非常通用的建议,没有任何代码,但可能值得一试:

建议实现三个线程

线程 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:处理队列并将每个原始图像保存在传递的文件名下。

请注意:您可能需要为队列添加最大大小以避免内存溢出,以防写入文件确实是您设置中的瓶颈

【讨论】:

    【解决方案2】:

    我可能迟到了,但我正在开发一个 Python 包,可以让你做到这一点。它仍在开发中,但如果您有兴趣,请查看:

    https://github.com/jbhunt/parallel-pyspin

    TLDR 是每台摄像机在其自己的进程上运行(通过多处理)。有些课程可以处理设置主摄像头和辅助摄像头的所有细节。您只需要知道相机的序列号,而且您必须按照以下说明设置物理触发器:

    https://www.flir.com/support-center/iis/machine-vision/application-note/configuring-synchronized-capture-with-multiple-cameras

    随意贡献:)

    【讨论】:

    • 太棒了。我没有触发器。没有一个它是否可以工作,只需要并行 x FPS?
    • 您可能对 VideoStream 类感兴趣。它的工作方式几乎与 OpenCV 的 VideoCapture 类完全相同。简而言之,它启动了一个子进程,该进程不断检查相机是否有新图像。当检测到新图像时,它将图像保存为进程安全数组作为类属性,可以使用“read”方法将其作为 numpy 数组读取。如果您想查看,README 中有更多文档。另外,出于好奇,以相机之间的同步采集为代价,通过软件触发器开始视频采集是否有用?
    猜你喜欢
    • 2011-09-03
    • 2020-11-10
    • 2018-06-29
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    相关资源
    最近更新 更多