diff options
| author | morefigs <morefigs@gmail.com> | 2019-04-13 14:56:01 +1000 |
|---|---|---|
| committer | morefigs <morefigs@gmail.com> | 2019-04-13 14:56:01 +1000 |
| commit | adfda37f027d922bb99d28754b9bb50f204c2990 (patch) | |
| tree | 38071646d79940f9953f6a4da62c3fc258c1a386 | |
| parent | 1f055ff6edebc43555748c168321c8605f6df818 (diff) | |
| parent | 0848f627afd3d1dfd7f911e6c0ea2c7f39bcf655 (diff) | |
| download | pymba-adfda37f027d922bb99d28754b9bb50f204c2990.tar.gz pymba-adfda37f027d922bb99d28754b9bb50f204c2990.zip | |
Merge branch 'dev' of github.com:morefigs/pymba into dev
| -rw-r--r-- | pymba/camera.py | 57 |
1 files changed, 33 insertions, 24 deletions
diff --git a/pymba/camera.py b/pymba/camera.py index da0f0fd..2fe0df5 100644 --- a/pymba/camera.py +++ b/pymba/camera.py @@ -95,10 +95,10 @@ class Camera(VimbaObject): # remember state self._is_armed = False self._is_acquiring = False - self._acquisition_mode = None + self._acquisition_mode = '' - # frame to reuse when in single frame mode - self._single_frame = None + self._frame_buffer = () + self._frame_buffer_index = -1 # user registered callback function self._user_callback = None @@ -212,6 +212,7 @@ class Camera(VimbaObject): self.AcquisitionMode = mode self._acquisition_mode = mode + # todo refactor if mode == SINGLE_FRAME: self._arm_single_frame() elif mode == CONTINUOUS: @@ -221,12 +222,30 @@ class Camera(VimbaObject): self._is_armed = True - def _arm_single_frame(self) -> None: - self._single_frame = self.new_frame() - self._single_frame.announce() + 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: + frame.announce() + + 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() self.start_capture() + for frame in self._frame_buffer: + frame.queue_for_capture(self._streaming_callback) + def acquire_frame(self, timeout_ms: Optional[int] = 2000) -> Frame: """ Acquire and return a single frame when the camera is armed in 'SingleFrame' acquisition @@ -236,27 +255,17 @@ 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._single_frame.queue_for_capture() + self._frame_buffer[self._frame_buffer_index].queue_for_capture() self.AcquisitionStart() - self._single_frame.wait_for_capture(timeout_ms) + self._frame_buffer[self._frame_buffer_index].wait_for_capture(timeout_ms) self.AcquisitionStop() - return self._single_frame - - def _arm_continuous(self, callback: Callable, frame_buffer_size: int) -> None: - self._user_callback = callback - - # create frame buffer and announce frames to camera - _frame_buffer = tuple(self.new_frame() for _ in range(frame_buffer_size)) - for frame in _frame_buffer: - frame.announce() - - self.start_capture() - - # queue - for frame in _frame_buffer: - frame.queue_for_capture(self._streaming_callback) + return self._frame_buffer[self._frame_buffer_index] def start_frame_acquisition(self) -> None: """ @@ -305,7 +314,7 @@ class Camera(VimbaObject): self.flush_capture_queue() self.revoke_all_frames() - self._single_frame = None + self._frame_buffer = () # encourage garbage collection of frame buffer memory gc.collect() |
