有什么方法可以在 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
连接
我想创建两个部分
使用特定的曝光时间和快门速度抓取图像(即 1000 或 2000)。
并在不影响 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)
首先要注意的是:scipy
的 imsave
已被弃用,并计划被删除。请改用 imageio
的 imwrite
。
现在是代码。有几种方法可以做到这一点。我将从修改最少到修改最多。
修正代码
我只是要对你的程序做一些修改,以便以后修改更容易,并且将来不会中断:
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
。我们需要将其扩展为两个变量 count
和 image
以便其余代码能够正常工作,这就是函数第一行所实现的。
您可能也注意到了 if __name__ == "__main__":
。这确保代码仅在程序作为模块导入时运行,multiprocess
在内部使用它来查找 save_image
函数。
我希望这能达到您的要求。如果您想澄清,请随时 post 发表评论。如果您有单独的问题,请提出另一个问题。
我正在使用 basler 相机拍摄图像,还使用 pypylon 将相机软件 (pylon) 与 python
连接我想创建两个部分
使用特定的曝光时间和快门速度抓取图像(即 1000 或 2000)。
并在不影响 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)
首先要注意的是:scipy
的 imsave
已被弃用,并计划被删除。请改用 imageio
的 imwrite
。
现在是代码。有几种方法可以做到这一点。我将从修改最少到修改最多。
修正代码
我只是要对你的程序做一些修改,以便以后修改更容易,并且将来不会中断:
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
。我们需要将其扩展为两个变量 count
和 image
以便其余代码能够正常工作,这就是函数第一行所实现的。
您可能也注意到了 if __name__ == "__main__":
。这确保代码仅在程序作为模块导入时运行,multiprocess
在内部使用它来查找 save_image
函数。
我希望这能达到您的要求。如果您想澄清,请随时 post 发表评论。如果您有单独的问题,请提出另一个问题。