有什么方法可以在 python 中编写一个 for 循环,它将从相机中抓取图像并并行保存?

Is there any way to write a for loop in python which will grab images from camera and save it parallelly?

我正在使用 basler 相机拍摄图像,还使用 ​​pypylon 将相机软件 (pylon) 与 python

连接

我想创建两个部分

  1. 使用特定的曝光时间和快门速度抓取图像(即 1000 或 2000)。

  2. 并在不影响 fps 的情况下并行保存。

    或者有什么方法可以将它们保存在缓冲区中并在以后使用而不影响 fps 吗?

现在我关心的是在不影响fps的情况下保存图像 谢谢

以下是我的代码

import pypylon
pypylon.pylon_version.version
available_cameras = pypylon.factory.find_devices()
available_cameras
cam = pypylon.factory.create_device(available_cameras[0])
cam.opened
cam.open()

cam.properties['AcquisitionFrameRateEnable'] = True
cam.properties['AcquisitionFrameRate'] = 1000
cam.properties['ExposureTime']
cam.properties['ExposureTime'] = 1000
#import matplotlib.pyplot as plt
from scipy.misc import imsave 
count=0
for image in cam.grab_images(30):
    count +=1
    a=str(count)
    b=str('I:/'+ a+'.png')
    imsave(b,image)

首先要注意的是:scipyimsave 已被弃用,并计划被删除。请改用 imageioimwrite

现在是代码。有几种方法可以做到这一点。我将从修改最少到修改最多。

修正代码

我只是要对你的程序做一些修改,以便以后修改更容易,并且将来不会中断:

import pypylon
from imageio import imwrite

available_cameras = pypylon.factory.find_devices()
cam = pypylon.factory.create_device(available_cameras[0])
cam.open()

cam.properties['AcquisitionFrameRateEnable'] = True
cam.properties['AcquisitionFrameRate'] = 1000
cam.properties['ExposureTime'] = 1000

for count, image in enumerate(cam.grab_images(30)):
    filename = str('I:/{}.png'.format(count))
    imwrite(filename, image)

以后的修改将以此为基础。我建议查看其中一些的作用,例如 'ExposureTime',因为看起来您是从示例中盲目复制的。

缓冲区

为了将这些图像存储在缓冲区中,我们可以通过将可迭代对象转换为 tuple(read-only 列表)来直接读取它们。一旦我们完成了缓冲区,我们就可以del删除它以释放一些内存。

import pypylon
from imageio import imwrite

available_cameras = pypylon.factory.find_devices()
cam = pypylon.factory.create_device(available_cameras[0])
cam.open()

cam.properties['AcquisitionFrameRateEnable'] = True
cam.properties['AcquisitionFrameRate'] = 1000
cam.properties['ExposureTime'] = 1000

buffer = tuple(cam.grab_images(30))
for count, image in enumerate(buffer):
    filename = str('I:/{}.png'.format(count))
    imwrite(filename, image)
del buffer

异步保存

我需要处理多处理。哦,看,有一个名为 multiprocessing 的 Python 模块。我以前从未使用过这个,但通过阅读它我可以创建这个:

import pypylon
from imageio import imwrite
from multiprocessing import Pool

def save_image(pair):
    count, image = pair  # pair is actually two values
    filename = str('I:/{}.png'.format(count))
    imwrite(filename, image)

if __name__ == "__main__":
    available_cameras = pypylon.factory.find_devices()
    cam = pypylon.factory.create_device(available_cameras[0])
    cam.open()

    cam.properties['AcquisitionFrameRateEnable'] = True
    cam.properties['AcquisitionFrameRate'] = 1000
    cam.properties['ExposureTime'] = 1000

    with Pool(30) as p:  # One for each image
        p.map(save_image, enumerate(cam.grab_images(30)))

这个解决方案就是您在标题中要求的解决方案。其中最神秘的部分是 pair。这是因为 enumerate 生成的每个项目都是 (i, image) 形式的元组。这只是一个参数,因此它作为一个参数传递给 save_image。我们需要将其扩展为两个变量 countimage 以便其余代码能够正常工作,这就是函数第一行所实现的。

您可能也注意到了 if __name__ == "__main__":。这确保代码仅在程序作为模块导入时运行,multiprocess 在内部使用它来查找 save_image 函数。

我希望这能达到您的要求。如果您想澄清,请随时 post 发表评论。如果您有单独的问题,请提出另一个问题。