Exemple #1
0
class CameraSource(VideoSource):
    """Process for controlling a camera.

    Cameras currently implemented:
    
    ======== ===========================================
    Ximea    Add some info
    Avt      Add some info
    ======== ===========================================

    Parameters
    ----------
    camera_type : str
        specifies type of the camera (currently supported: 'ximea', 'avt')
    downsampling : int
        specifies downsampling factor for the camera.

    Returns
    -------

    """
    """ dictionary listing classes used to instantiate camera object."""
    def __init__(self,
                 camera_type,
                 *args,
                 downsampling=1,
                 roi=(-1, -1, -1, -1),
                 max_buffer_length=1000,
                 **kwargs):
        """ """
        super().__init__(*args, **kwargs)

        self.cam = None

        self.camera_type = camera_type
        self.downsampling = downsampling
        self.roi = roi

        self.max_buffer_length = max_buffer_length

        self.state = None
        self.ring_buffer = None

    def retrieve_params(self, messages):
        while True:
            try:
                param_dict = self.control_queue.get(timeout=0.0001)
                self.state.params.values = param_dict
                for param, value in param_dict.items():
                    ms = self.cam.set(param, value)
                    try:
                        messages.extend(list(ms))
                    except TypeError:
                        pass
            except Empty:
                break

    def run(self):
        """
        After initializing the camera, the process constantly does the
        following:

            - read control parameters from the control_queue and set them;
            - read frames from the camera and put them in the frame_queue.


        """
        if self.state is None:
            self.state = CameraControlParameters()
        try:
            CameraClass = camera_class_dict[self.camera_type]
            self.cam = CameraClass(downsampling=self.downsampling,
                                   roi=self.roi)
        except KeyError:
            raise Exception("{} is not a valid camera type!".format(
                self.camera_type))
        camera_messages = list(self.cam.open_camera())
        [self.message_queue.put(m) for m in camera_messages]
        prt = None
        while True:
            # Kill if signal is set:
            self.kill_event.wait(0.0001)
            if self.kill_event.is_set():
                break
            # Try to get new parameters from the control queue:
            messages = []
            if self.control_queue is not None:
                self.retrieve_params(messages)
            # Grab the new frame, and put it in the queue if valid:
            arr = self.cam.read()
            if self.rotation:
                arr = np.rot90(arr, self.rotation)

            res_len = int(
                round(self.state.framerate * self.state.ring_buffer_length))
            if res_len > self.max_buffer_length:
                res_len = self.max_buffer_length
                self.message_queue.put("W:Replay buffer too big, make the plot"
                                       " time range smaller for full replay"
                                       " capabilities")

            if self.ring_buffer is None or res_len != self.ring_buffer.length:
                self.ring_buffer = RingBuffer(res_len)

            if self.state.paused:
                self.message_queue.put("I:Ring_buffer_size:" +
                                       str(self.ring_buffer.length))
                if self.ring_buffer.arr is not None:
                    self.frame_queue.put(self.ring_buffer.get_most_recent())
                else:
                    self.message_queue.put(
                        "E:camera paused before any frames acquired")
                prt = None
            elif self.state.replay and self.state.replay_fps > 0:
                messages.append("I:Replaying between {} and {} of {}".format(
                    *self.state.replay_limits, self.ring_buffer.length))
                old_fps = self.framerate_rec.current_framerate
                if old_fps is not None:
                    self.ring_buffer.replay_limits = (
                        int(round(self.state.replay_limits[0] * old_fps)),
                        int(round(self.state.replay_limits[1] * old_fps)),
                    )
                try:
                    self.frame_queue.put(self.ring_buffer.get())
                except ValueError:
                    pass
                delta_t = 1 / self.state.replay_fps
                if prt is not None:
                    extrat = delta_t - (time.process_time() - prt)
                    if extrat > 0:
                        time.sleep(extrat)
                prt = time.process_time()
            else:
                prt = None
                if arr is not None:
                    try:
                        self.ring_buffer.put(arr)
                    except AttributeError:
                        pass
                    # If the queue is full, arrayqueues should print a warning!
                    if self.frame_queue.queue.qsize() < self.n_consumers + 2:
                        self.frame_queue.put(arr)
                    else:
                        messages.append("W:Dropped frame")
                    self.update_framerate()
            for m in messages:
                self.message_queue.put(m)

        self.cam.release()
Exemple #2
0
    def run(self):
        """
        After initializing the camera, the process constantly does the
        following:

            - read control parameters from the control_queue and set them;
            - read frames from the camera and put them in the frame_queue.


        """
        if self.state is None:
            self.state = CameraControlParameters()
        try:
            CameraClass = camera_class_dict[self.camera_type]
            self.cam = CameraClass(downsampling=self.downsampling,
                                   roi=self.roi)
        except KeyError:
            raise Exception("{} is not a valid camera type!".format(
                self.camera_type))
        camera_messages = list(self.cam.open_camera())
        [self.message_queue.put(m) for m in camera_messages]
        prt = None
        while True:
            # Kill if signal is set:
            self.kill_event.wait(0.0001)
            if self.kill_event.is_set():
                break
            # Try to get new parameters from the control queue:
            messages = []
            if self.control_queue is not None:
                self.retrieve_params(messages)
            # Grab the new frame, and put it in the queue if valid:
            arr = self.cam.read()
            if self.rotation:
                arr = np.rot90(arr, self.rotation)

            res_len = int(
                round(self.state.framerate * self.state.ring_buffer_length))
            if res_len > self.max_buffer_length:
                res_len = self.max_buffer_length
                self.message_queue.put("W:Replay buffer too big, make the plot"
                                       " time range smaller for full replay"
                                       " capabilities")

            if self.ring_buffer is None or res_len != self.ring_buffer.length:
                self.ring_buffer = RingBuffer(res_len)

            if self.state.paused:
                self.message_queue.put("I:Ring_buffer_size:" +
                                       str(self.ring_buffer.length))
                if self.ring_buffer.arr is not None:
                    self.frame_queue.put(self.ring_buffer.get_most_recent())
                else:
                    self.message_queue.put(
                        "E:camera paused before any frames acquired")
                prt = None
            elif self.state.replay and self.state.replay_fps > 0:
                messages.append("I:Replaying between {} and {} of {}".format(
                    *self.state.replay_limits, self.ring_buffer.length))
                old_fps = self.framerate_rec.current_framerate
                if old_fps is not None:
                    self.ring_buffer.replay_limits = (
                        int(round(self.state.replay_limits[0] * old_fps)),
                        int(round(self.state.replay_limits[1] * old_fps)),
                    )
                try:
                    self.frame_queue.put(self.ring_buffer.get())
                except ValueError:
                    pass
                delta_t = 1 / self.state.replay_fps
                if prt is not None:
                    extrat = delta_t - (time.process_time() - prt)
                    if extrat > 0:
                        time.sleep(extrat)
                prt = time.process_time()
            else:
                prt = None
                if arr is not None:
                    try:
                        self.ring_buffer.put(arr)
                    except AttributeError:
                        pass
                    # If the queue is full, arrayqueues should print a warning!
                    if self.frame_queue.queue.qsize() < self.n_consumers + 2:
                        self.frame_queue.put(arr)
                    else:
                        messages.append("W:Dropped frame")
                    self.update_framerate()
            for m in messages:
                self.message_queue.put(m)

        self.cam.release()