def get_camera(iso, resolution, rotation, flip, delete_internal_memory): """Initialize the camera depending of the connected one. If a gPhoto2 camera is used, try to kill any process using gPhoto2 as it may block camera access. The priority order is chosen in order to have best rendering during preview and to take captures. """ if gp_camera_connected() and rpi_camera_connected(): LOGGER.info("Configuring hybrid camera (Picamera + gPhoto2) ...") cam_class = HybridRpiCamera pkill('*gphoto2*') elif gp_camera_connected() and cv_camera_connected(): LOGGER.info("Configuring hybrid camera (OpenCV + gPhoto2) ...") cam_class = HybridCvCamera pkill('*gphoto2*') elif gpomx_camera_connected(): LOGGER.info("Configuring gPhoto2 camera (preview with OMXPlayer) ...") cam_class = GpOmxCamera pkill('*gphoto2*') elif gp_camera_connected(): LOGGER.info("Configuring gPhoto2 camera ...") cam_class = GpCamera pkill('*gphoto2*') elif rpi_camera_connected(): LOGGER.info("Configuring Picamera camera ...") cam_class = RpiCamera elif cv_camera_connected(): LOGGER.info("Configuring OpenCV camera ...") cam_class = CvCamera else: raise EnvironmentError( "Neither Raspberry Pi nor GPhoto2 nor OpenCV camera detected") return cam_class(iso, resolution, rotation, flip, delete_internal_memory)
def get_gp_camera_proxy(port=None): """Return camera proxy if a gPhoto2 compatible camera is found else return None. .. note:: try to kill any process using gPhoto2 as it may block camera access. :param port: look on given port number :type port: str """ if not gp: return None # gPhoto2 is not installed pkill('*gphoto2*') if hasattr(gp, 'gp_camera_autodetect'): # gPhoto2 version 2.5+ cameras = gp.check_result(gp.gp_camera_autodetect()) else: port_info_list = gp.PortInfoList() port_info_list.load() abilities_list = gp.CameraAbilitiesList() abilities_list.load() cameras = abilities_list.detect(port_info_list) if cameras: LOGGER.debug("Found gPhoto2 cameras on ports: '%s'", "' / '".join([p for _, p in cameras])) # Initialize first camera proxy and return it camera = gp.Camera() if port is not None: port_info_list = gp.PortInfoList() port_info_list.load() idx = port_info_list.lookup_path(port) camera.set_port_info(port_info_list[idx]) try: camera.init() return camera except gp.GPhoto2Error as ex: LOGGER.warning("Could not connect gPhoto2 camera: %s", ex) return None
def __init__(self, config): self.config = config # Clean directory where pictures are saved self.savedir = config.getpath('GENERAL', 'directory') if not osp.isdir(self.savedir): os.makedirs(self.savedir) if osp.isdir(self.savedir) and config.getboolean( 'GENERAL', 'clear_on_startup'): shutil.rmtree(self.savedir) os.makedirs(self.savedir) # Prepare GPIO, physical pins mode GPIO.setmode(GPIO.BOARD) # Prepare the pygame module for use os.environ['SDL_VIDEO_CENTERED'] = '1' pygame.init() # Dont catch mouse motion to avoid filling the queue during long actions pygame.event.set_blocked(pygame.MOUSEMOTION) # Create window of (width, height) init_size = self.config.gettyped('WINDOW', 'size') if not isinstance(init_size, str): self.window = PtbWindow('Pibooth', init_size) else: self.window = PtbWindow('Pibooth') self.state_machine = StateMachine(self) self.state_machine.add_state(StateWait()) self.state_machine.add_state( StateChoose(30)) # 30s before going back to the start self.state_machine.add_state(StateChosen(4)) self.state_machine.add_state(StateCapture()) self.state_machine.add_state(StateProcessing()) self.state_machine.add_state(StatePrint()) self.state_machine.add_state(StateFinish(0.5)) # Initialize the camera. If gPhoto2 camera is used, try to kill # any process using gPhoto2 as it may block camera access if camera.gp_camera_connected() and camera.rpi_camera_connected(): cam_class = camera.HybridCamera pkill('*gphoto2*') elif camera.gp_camera_connected(): cam_class = camera.GpCamera pkill('*gphoto2*') elif camera.rpi_camera_connected(): cam_class = camera.RpiCamera elif camera.cv_camera_connected(): cam_class = camera.CvCamera else: raise EnvironmentError( "Neither Raspberry Pi nor GPhoto2 nor OpenCV camera detected") self.camera = cam_class(config.getint('CAMERA', 'iso'), config.gettyped('CAMERA', 'resolution'), config.getint('CAMERA', 'rotation'), config.getboolean('CAMERA', 'flip')) # Initialize the hardware buttons self.led_capture = PtbLed(config.getint('CONTROLS', 'picture_led_pin')) self.button_capture = PtbButton( config.getint('CONTROLS', 'picture_btn_pin'), config.getfloat('CONTROLS', 'debounce_delay')) self.led_print = PtbLed(config.getint('CONTROLS', 'print_led_pin')) self.button_print = PtbButton( config.getint('CONTROLS', 'print_btn_pin'), config.getfloat('CONTROLS', 'debounce_delay')) self.led_startup = PtbLed(config.getint('CONTROLS', 'startup_led_pin')) self.led_preview = PtbLed(config.getint('CONTROLS', 'preview_led_pin')) # Initialize the printer self.printer = PtbPrinter(config.get('PRINTER', 'printer_name')) # Variables shared between states self.dirname = None self.makers_pool = PicturesMakersPool() self.capture_nbr = None self.capture_choices = (4, 1) self.nbr_duplicates = 0 self.previous_picture = None self.previous_animated = [] self.previous_picture_file = None