aboutsummaryrefslogtreecommitdiff
path: root/pymba/camera.py
diff options
context:
space:
mode:
Diffstat (limited to 'pymba/camera.py')
-rw-r--r--pymba/camera.py51
1 files changed, 18 insertions, 33 deletions
diff --git a/pymba/camera.py b/pymba/camera.py
index 2fe0df5..44f211c 100644
--- a/pymba/camera.py
+++ b/pymba/camera.py
@@ -98,7 +98,6 @@ class Camera(VimbaObject):
self._acquisition_mode = ''
self._frame_buffer = ()
- self._frame_buffer_index = -1
# user registered callback function
self._user_callback = None
@@ -200,7 +199,8 @@ class Camera(VimbaObject):
(on average) at least as fast as the camera frame rate. It may be desirable for the
callback to copy frame data and pass the data to a separate thread/process for processing.
:param frame_buffer_size: number of frames to create and use for the acquisition buffer.
- Increasing this may help if frames are being dropped.
+ Applies to 'Continuous' acquisition mode only. Increasing this may help if frames are being
+ dropped.
"""
if self._is_armed:
raise VimbaException(VimbaException.ERR_INVALID_CAMERA_MODE)
@@ -208,23 +208,14 @@ class Camera(VimbaObject):
if mode not in (SINGLE_FRAME, CONTINUOUS):
raise ValueError('unknown mode')
- # set and cache mode
- self.AcquisitionMode = mode
- self._acquisition_mode = mode
-
- # todo refactor
if mode == SINGLE_FRAME:
- self._arm_single_frame()
- elif mode == CONTINUOUS:
- if callback is None:
- raise ValueError('a callback function must be provided in continuous mode')
- self._arm_continuous(callback, frame_buffer_size)
+ frame_buffer_size = 1
- self._is_armed = True
+ # set and remember mode
+ self.AcquisitionMode = mode
+ self._acquisition_mode = mode
- def _arm_single_frame(self, frame_buffer_size: int) -> None:
# create frame buffer and announce frames to camera
- self._frame_buffer_index = -1
self._frame_buffer = tuple(self.new_frame()
for _ in range(frame_buffer_size))
for frame in self._frame_buffer:
@@ -232,19 +223,17 @@ class Camera(VimbaObject):
self.start_capture()
- def _arm_continuous(self, callback: Callable, frame_buffer_size: int) -> None:
- self._user_callback = callback
-
- # create frame buffer and announce frames to camera
- self._frame_buffer = tuple(self.new_frame()
- for _ in range(frame_buffer_size))
- for frame in self._frame_buffer:
- frame.announce()
+ # setup frame ready callbacks
+ if mode == CONTINUOUS:
+ if callback is None:
+ def callback(frame):
+ pass
- self.start_capture()
+ self._user_callback = callback
+ for frame in self._frame_buffer:
+ frame.queue_for_capture(self._streaming_callback)
- for frame in self._frame_buffer:
- frame.queue_for_capture(self._streaming_callback)
+ self._is_armed = True
def acquire_frame(self, timeout_ms: Optional[int] = 2000) -> Frame:
"""
@@ -255,17 +244,13 @@ class Camera(VimbaObject):
if not self._is_armed or self._acquisition_mode != SINGLE_FRAME:
raise VimbaException(VimbaException.ERR_INVALID_CAMERA_MODE)
- self._frame_buffer_index += 1
- if self._frame_buffer_index <= len(self._frame_buffer):
- self._frame_buffer_index = 0
-
# capture a single frame
- self._frame_buffer[self._frame_buffer_index].queue_for_capture()
+ self._frame_buffer[0].queue_for_capture()
self.AcquisitionStart()
- self._frame_buffer[self._frame_buffer_index].wait_for_capture(timeout_ms)
+ self._frame_buffer[0].wait_for_capture(timeout_ms)
self.AcquisitionStop()
- return self._frame_buffer[self._frame_buffer_index]
+ return self._frame_buffer[0]
def start_frame_acquisition(self) -> None:
"""