有没有办法用python编写一个for循环来从相机抓取图像并并行保存?

2024-05-18 23:26:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我用的是巴斯勒相机拍摄图像,同时也使用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)

Tags: 图像importversionfactorycount情况propertiesavailable
1条回答
网友
1楼 · 发布于 2024-05-18 23:26:32

首先是:scipyimsave已被弃用,并计划将其删除。使用imageio^{}。在

现在来看看密码。有几种方法可以做到这一点。我将从最少的修改移到大多数修改。在

修正代码

我只想对你的程序进行一些更改,以便以后更容易修改,以便将来不会中断:

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',因为这看起来像是您盲目地从示例中复制的。在

缓冲器

为了在缓冲区中存储这些图像,我们可以通过将iterable转换为tuple(只读列表)直接读取它们。一旦我们完成了缓冲区,我们可以del来释放一些内存。在

^{pr2}$

异步保存

我需要做一些关于多重处理的事情。哦,看,有一个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。我们需要将其扩展到两个变量count和{},这样代码的其余部分就可以工作了,这就是函数的第一行所实现的。在

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

我希望这是你想要的。如果你想澄清,请随时发表评论。如果你有别的问题,请再问一个问题。在

相关问题 更多 >

    热门问题