def calc_rules(self, tracklet_info):
        """

        :param tracklet_info:
        :return: a list of tuples with:
             0- The distance (trust measurement)
             1- The rule that was satisfied
             2- The time that the rule has taken
        satisfied
        """
        found_local_rules = []
        found_global_rules = []
        last_update = tracklet_info.last_position_time

        # Take the latest events or a minimum
        last_speed_events = \
            list(map(lambda x: x[1], takewhile(
                lambda i_e:
                diff_in_milliseconds(i_e[1].last_update, last_update) <
                self.MIN_EVENTS_SPEED_TIME or
                i_e[0] < self.MIN_EVENTS_SPEED_AMOUNT,
                enumerate(reversed(tracklet_info.active_speed_events))
            )))
        last_dir_events = \
            list(map(lambda x: x[1], takewhile(
                lambda i_e:
                diff_in_milliseconds(i_e[1].last_update, last_update) <
                self.MIN_EVENTS_DIR_TIME or i_e[0] <
                self.MIN_EVENTS_DIR_AMOUNT,
                enumerate(reversed(tracklet_info.active_direction_events))
            )))

        # if any rule matches, the rule is added to found_rules
        for rule in self.movement_change_rules:
            satisfies_speed_events, dist1, time_from_start1 = \
                self.check_ruleevents_in_activeevents(
                    rule.events, reversed(last_speed_events))
            satisfies_dir_events, dist2, time_from_start2 = \
                self.check_ruleevents_in_activeevents(
                    rule.events, reversed(last_dir_events))

            satisfies_global_events, dist3, time_from_start3 = \
                self.check_ruleevents_in_activeevents(
                    rule.events, [self.global_events[-1]]) if \
                self.global_events else (None, None, None)

            if satisfies_global_events:
                found_global_rules.append((dist3, rule, time_from_start3))
            if satisfies_speed_events or satisfies_dir_events:
                found_local_rules.append((dist1 + dist2, rule,
                                          min(time_from_start1,
                                              time_from_start2)))

        return found_local_rules, found_global_rules
 def remove_abandoned_tracklets(self, last_update):
     tracklet_to_delete = \
         [t.id for t in self.tracklets_info.values()
          if diff_in_milliseconds(t.last_position_time, last_update) >
          self.TRACKLETS_LIVES_TIME]
     for id_ in tracklet_to_delete:
         del self.tracklets_info[id_]
    def calc_movements_info(self, tracklet_info, new_position,
                            new_position_time):
        time = diff_in_milliseconds(tracklet_info.last_position_time,
                                    new_position_time)

        (distance, angle) = self.calc_distance_and_angle_between_points(
            tracklet_info.last_position, new_position)

        return time, distance, angle
    def calc_global_events(self, last_update, last_position, time_lapse):
        counter = 0
        current_global_events = []

        # ## Look for AGGLOMERATION events ## #
        # Calculate distance to each tracklet and check if it is close enough
        for tracklet in self.tracklets_info.values():
            if diff_in_milliseconds(
                    tracklet.last_position_time, last_update) < 1250 and \
                euclidean_distance(last_position, tracklet.last_position) < \
                    self.AGGLOMERATION_MIN_DISTANCE:
                counter += 1
        else:
            if counter > 1:
                current_global_events.append(
                    EventAgglomeration(type_=counter,
                                       value=time_lapse,
                                       time_end=last_update,
                                       duration=time_lapse))

        # ## Place to verify future global events ## #
        # ... ... ...

        return current_global_events
 def remove_old_global_events(self, last_update):
     self.global_events = list(
         dropwhile(
             lambda e: diff_in_milliseconds(e.last_update, last_update) >
             self.GLOBAL_EVENTS_LIVES_TIME, self.global_events))
Пример #6
0
 def duration(self):
     if None in (self.time_start, self.last_update):
         return 0
     return diff_in_milliseconds(self.time_start, self.last_update)
Пример #7
0
 def __repr__(self):
     return "Event %s TO %s TIME_START: %s DURATION: %s" % \
            (self.quantifier, str(self.value), self.time_start,
             diff_in_milliseconds(self.time_start, self.last_update))