Beispiel #1
0
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)
Beispiel #2
0
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
Beispiel #3
0
    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