def __init__(self, g_pool=None): super().__init__(g_pool=g_pool) self.camera = CameraModel( focal_length=self.g_pool.capture.intrinsics.focal_length, resolution=self.g_pool.capture.intrinsics.resolution, ) self.detector = Detector3D(camera=self.camera) self.debugVisualizer3D = Eye_Visualizer(self.g_pool, self.camera.focal_length)
def main(eye_video_path): # create 2D detector detector_2d = Detector2D() # create pye3D detector camera = CameraModel(focal_length=561.5, resolution=[400, 400]) detector_3d = Detector3D(camera=camera, long_term_mode=DetectorMode.blocking) # load eye video eye_video = cv2.VideoCapture(eye_video_path) # read each frame of video and run pupil detectors while eye_video.isOpened(): frame_number = eye_video.get(cv2.CAP_PROP_POS_FRAMES) fps = eye_video.get(cv2.CAP_PROP_FPS) ret, eye_frame = eye_video.read() if ret: # read video frame as numpy array grayscale_array = cv2.cvtColor(eye_frame, cv2.COLOR_BGR2GRAY) # run 2D detector on video frame result_2d = detector_2d.detect(grayscale_array) result_2d["timestamp"] = frame_number / fps # pass 2D detection result to 3D detector result_3d = detector_3d.update_and_detect(result_2d, grayscale_array) ellipse_3d = result_3d["ellipse"] # draw 3D detection result on eye frame cv2.ellipse( eye_frame, tuple(int(v) for v in ellipse_3d["center"]), tuple(int(v / 2) for v in ellipse_3d["axes"]), ellipse_3d["angle"], 0, 360, # start/end angle for drawing (0, 255, 0), # color (BGR): red ) # show frame cv2.imshow("eye_frame", eye_frame) # press esc to exit if cv2.waitKey(1) & 0xFF == 27: break else: break eye_video.release() cv2.destroyAllWindows()
def _process_camera_changes(self): camera = CameraModel( focal_length=self.g_pool.capture.intrinsics.focal_length, resolution=self.g_pool.capture.intrinsics.resolution, ) if self.camera == camera: return logger.debug( f"Camera model change detected: {camera}. Resetting 3D detector.") self.camera = camera self.detector.reset_camera(self.camera) # Debug window also depends on focal_length, need to replace it with a new # instance. Make sure debug window is closed at this point or we leak the opengl # window. debug_window_was_opened = self.is_debug_window_open self.debug_window_close() self.debugVisualizer3D = Eye_Visualizer(self.g_pool, self.camera.focal_length) if debug_window_was_opened: self.debug_window_open()
def __init__( self, g_pool=None, ): super().__init__(g_pool=g_pool) self.camera = CameraModel( focal_length=self.g_pool.capture.intrinsics.focal_length, resolution=self.g_pool.capture.intrinsics.resolution, ) async_apps = ("capture", "service") mode = (DetectorMode.asynchronous if g_pool.app in async_apps else DetectorMode.blocking) logger.debug(f"Running {mode.name} in {g_pool.app}") self.detector = Detector3D(camera=self.camera, long_term_mode=mode) method_suffix = { DetectorMode.asynchronous: "real-time", DetectorMode.blocking: "post-hoc", } self.pupil_detection_method = f"pye3d {pye3d.__version__} {method_suffix[mode]}" self.debugVisualizer3D = Eye_Visualizer(self.g_pool, self.camera.focal_length) self.__debug_window_button = None
def create_detector(): camera = CameraModel(focal_length=561.5, resolution=np.array([400, 400])) detector = Pye3D(camera=camera, long_term_mode=DetectorMode.blocking) detector.reset() return detector