def run(self):
        print "Starting visualizer"
        if not ENABLE:
            print "No open cv found, giving up"
            return

        # Init vizualizers
        self.video_viz = VideoOverlayVisualizer(self.video_file, self.export_interval, self.export_directory, 1.2446, -0.2, 3.4, 94.4, \
        21.0/1000, 4.55/1000)

        # self.video_viz = VideoOverlayVisualizer(self.video_file, 1.2446, -0.4, 0, 64.6, \
        # 28.0/1000, 4.55/1000)
        self.position_windows()

        delay_remainder = 0.0
        start_time = timeit.default_timer()

        while True:
            # Start timing to record how long our drawing takes
            start_frame_time = timeit.default_timer()

            # Get the last element from the data queue (get rid of any old data too)
            while self.queue.qsize() > 1:
                try:
                    self.current_state = self.queue.get(False)
                except Empty:
                    break

            # if we don't have data yet, don't bother visualizing
            if not self.current_state:
                continue

            # If we are behind in the video compared to real time, grab a new
            # frame until we are back in time
            while self.video_viz.camera.get(cv2.CAP_PROP_POS_MSEC) < (
                    timeit.default_timer() - start_time) * 1000:
                self.video_viz.camera.grab()  # skip frames

            # Run the video visualization, it returns false at the end of the video
            # thus we kill the visualization at that point
            if not self.video_viz.update(self.current_state):
                print "End of video, killing viz"
                break

            # run our other visualizations
            self.radar_viz.update(self.current_state)
            self.dsrc_viz.update(self.current_state)

            # Calculate how long to delay before next frame
            single_frame_duration = float(1000) / self.video_viz.fps
            vis_drawing_time = (timeit.default_timer() -
                                start_frame_time) * 1000
            delay_before_next_frame = single_frame_duration - vis_drawing_time + delay_remainder

            # if the amount of time we are supposed to delay is < 1ms then drop
            # frames until our delay is possible. Basically if it took us more than
            # single_frame_duration to draw the visualization on the current frame
            # then we need to drop frames subsequent frames until we have a delay
            # time > 0 (we are "catching up" with the video's natural frame rate)
            frame_count = 1
            while delay_before_next_frame < 1:
                delay_before_next_frame = delay_before_next_frame + single_frame_duration
                self.video_viz.camera.grab(
                )  # Get the next frame (aka skip it)

            # Keep track of the fractional part of our delay as a remainder so we don't
            # lose precision over time (if we are supposed to delay 1.5ms then 1.5ms we want
            # to delay 1ms then 2ms so the total time will still be 3ms, we can't delay fractional
            # milliseconds unfortunately)
            delay_remainder = int(
                delay_before_next_frame) - delay_before_next_frame

            # Wait until it is time to display the next frame
            cv2.waitKey(int(delay_before_next_frame))