如何使联合视觉相机对象的全局变量?



我使用联合视觉相机,我需要非常频繁地获得单帧,但我发现它需要超过1秒才能找到相机并获得单帧。请看下面的代码(从pymba编辑)

from pymba import Vimba, VimbaException
from examples.camera._display_frame import display_frame
def capture_single():
with Vimba() as vimba:
camera = vimba.camera(0)
camera.open()
camera.arm('SingleFrame')
for i in range(10):
try:
frame = camera.acquire_frame()
print(frame)

except VimbaException as e:
# rearm camera upon frame timeout
if e.error_code == VimbaException.ERR_TIMEOUT:
print(e)
camera.disarm()
camera.arm('SingleFrame')
else:
raise
camera.disarm()
camera.close()
return frame


if __name__ == '__main__':                     
for i in range(10):
frame = capture_single()

在主体中的第一个循环非常慢,但是函数capture_single()中的循环非常快。那么我怎么能让camera = vimba.camera(0)成为一个全局变量,在我自己的程序中,任何时候如果我想在不同的函数中获得帧,我只要直接使用frame = camera.acquire_frame()而不是找到相机并打开相机?

根据您的用例,您可以在方法外部声明变量,也可以创建一个类来包装该行为(通常首选后者)。

如果这只是一个一次性脚本,除了拍摄一个镜头之外没有很多组件,你可以简单地使用

with Vimba() as vimba:
# Not sure if you have to call camera.open() or arm() in every frame. If so, move it accordingly.
camera = vimba.camera(0)
camera.open()
camera.arm('SingleFrame')
def capture_single():
for i in range(10):
try:
frame = camera.acquire_frame()
print(frame)

except VimbaException as e:
# rearm camera upon frame timeout
if e.error_code == VimbaException.ERR_TIMEOUT:
print(e)
camera.disarm()
camera.arm('SingleFrame')
else:
raise
camera.disarm()
camera.close()
return frame
否则,最好定义一个类来包装它,即
class CameraInteractor:
def __init__(self):
with Vimba() as vimba:
self.camera = vimba.camera(0)
self.camera.open()
self.camera.arm("SingleFrame")

def capture_single(self):
for i in range(10):
try:
frame = self.camera.acquire_frame()
print(frame)
except VimbaException as e:
# rearm camera upon frame timeout
if e.error_code == VimbaException.ERR_TIMEOUT:
print(e)
self.camera.disarm()
self.camera.arm('SingleFrame')
else:
raise
# Note: Not sure if you actually want to disarm the camera upon calling capture_single.
# Perhaps make another method within the class, i.e. def disarm(self) that does this.
self.camera.disarm()
self.camera.close()
return frame

那么,你可以使用

camera = CameraInteractor()
for i in range(10):
frame = camera.capture_single()

只是为了添加到讨论中,您可能会发现这个关于手动管理相机对象上下文的GitHub问题很有帮助。相机通常在with语句的范围内打开,不应该在它之外调用。要改变这一点,你需要手动管理API通常在后台用with语句做的事情。手动管理实例和相机上下文#116

编辑:我一开始没有看到这个话题有多老。但也许这确实能帮到别人。

最新更新