Пример #1
0
    def __init__(self):
        self.frame_count = 0
        self.motion_frames = 0
        self.mode = 'uncalibrated'
        self._set_led = freenect.LED_BLINK_YELLOW
        self._set_video = None
        self._last_img = 0
        self._snapshot = False
        self._last_setting_check = 0

        self.settings_delay = 10
        self.snapshot_secs = 5

        self.debug = True
        self.nightvision = None
        self.dsum_buffer = RingBuffer(100)
        self.running_avg = AvgMatrix(15)
        self.load_settings()

        self.s3bucket = boto.connect_s3(settings.AWS_KEY,
                                        settings.AWS_SECRET).create_bucket(
                                            settings.AWS_BUCKET)
Пример #2
0
class Watcher(object):


    def __init__(self):
        self.frame_count = 0
        self.motion_frames = 0
        self.mode = 'uncalibrated'
        self._set_led = freenect.LED_BLINK_YELLOW
        self._set_video = None
        self._last_img = 0
        self._snapshot = False
        self._last_setting_check = 0

        self.settings_delay = 10
        self.snapshot_secs = 5

        self.debug = True
        self.nightvision = None
        self.dsum_buffer = RingBuffer(100)
        self.running_avg = AvgMatrix(15)
        self.load_settings()

        self.s3bucket = boto.connect_s3(settings.AWS_KEY,
                                        settings.AWS_SECRET).create_bucket(
                                            settings.AWS_BUCKET)

    def load_settings(self):
        profile = UserProfile.objects.get()

        if self.debug:
            print 'load_settings', profile.motion_sensitivity, profile.nightvision_on

        # low
        if profile.motion_sensitivity < 10:
            self.change_threshold = 1.5
            self.min_report_event = 30
        # high
        elif profile.motion_sensitivity > 10:
            self.change_threshold = 0.7
            self.min_report_event = 15
        # normal
        else:
            self.change_threshold = 1.0
            self.min_report_event = 20

        if profile.nightvision_on != self.nightvision:
            self.nightvision = profile.nightvision_on
            self._set_video = (freenect.VIDEO_IR_8BIT if self.nightvision
                               else freenect.VIDEO_RGB)


    def set_mode(self, mode):
        if mode == 'nomotion':
            self._set_led = freenect.LED_GREEN
        elif mode == 'motion':
            self._set_led = freenect.LED_RED
        else:
            raise ValueError('unknown mode')
        self.mode = mode


    def depth_callback(self, dev, data, timestamp):
        # add the data to our running average
        self.running_avg.add(data)

        if self.mode == 'uncalibrated':
            self.frame_count += 1
            if self.frame_count == self.dsum_buffer.size():
                self.set_mode('nomotion')
        else:
            mean_array = self.running_avg.mean()

            # difference from sum of buffer
            dsum = mean_array.sum()
            self.dsum_buffer.add(dsum)
            delta = self.dsum_buffer.std_delta(dsum)

            # frame will count as a motion frame
            if delta > self.change_threshold:
                self.motion_frames += 1
                if (self.motion_frames == self.min_report_event and
                    self.mode == 'nomotion'):
                    self.set_mode('motion')
                    alert = Alert.objects.create(event_type='motion')
                    self._snapshot = alert.id
            else:
                # don't let motion_frames drop below 0
                self.motion_frames = max(self.motion_frames-1, 0)
                if self.motion_frames == 0 and self.mode == 'motion':
                    self.set_mode('nomotion')
                    # could log how long the event was and its intensity here

            if self.debug:
                cv.ShowImage('Depth', simplify_cv(mean_array.astype(numpy.uint16)))
                cv.WaitKey(1)


    def body_callback(self, dev, ctx):
        # _set_led hackery is required because for some reason calling set_led
        # from update loop hangs the process
        if self._set_led:
            freenect.set_led(dev, self._set_led)
            self._set_led = None

        if self._set_video is not None:
            freenect.stop_video(dev)
            freenect.set_video_mode(dev, freenect.RESOLUTION_MEDIUM,
                                    self._set_video)
            freenect.start_video(dev)
            self._set_video = None

        if self._last_setting_check + self.settings_delay < time.time():
            self.load_settings()
            self._last_setting_check = time.time()


    def video_callback(self, dev, data, timestamp):
        if self.nightvision:
            cv_data = simplify_cv(data)
        else:
            cv_data = video_cv(data)

        if self.debug:
            cv.ShowImage('Video', cv_data)


        if (self._last_img + self.snapshot_secs < time.time() or
            self._snapshot):
            cv.SaveImage('babby-current.jpg', cv_data)
            k = boto.s3.key.Key(self.s3bucket)
            if self._snapshot:
                k.key = '/babby/snapshot-%s.jpg' % self._snapshot
                self._snapshot = False
            else:
                k.key = '/babby/current.jpg'
            k.set_contents_from_filename('babby-current.jpg')
            k.set_acl('public-read')
            self._last_img = time.time()