''' Camera ====== The :class:`Camera` widget is used to capture and display video from a camera. Once the widget is created, the texture inside the widget will be automatically updated. Our :class:`~kivy.core.camera.CameraBase` implementation is used under the hood:: cam = Camera() By default, the first camera found on your system is used. To use a different camera, set the index property:: cam = Camera(index=1) You can also select the camera resolution:: cam = Camera(resolution=(320, 240)) .. warning:: The camera texture is not updated as soon as you have created the object. The camera initialization is asynchronous, so there may be a delay before the requested texture is created. ''' __all__ = ('Camera', ) from kivy.uix.image import Image from kivy.core.camera import Camera as CoreCamera from kivy.properties import NumericProperty, ListProperty, \ BooleanProperty class Camera(Image): '''Camera class. See module documentation for more information. ''' play = BooleanProperty(False) '''Boolean indicating whether the camera is playing or not. You can start/stop the camera by setting this property:: # start the camera playing at creation cam = Camera(play=True) # create the camera, and start later (default) cam = Camera(play=False) # and later cam.play = True :attr:`play` is a :class:`~kivy.properties.BooleanProperty` and defaults to False. ''' index = NumericProperty(-1) '''Index of the used camera, starting from 0. :attr:`index` is a :class:`~kivy.properties.NumericProperty` and defaults to -1 to allow auto selection. ''' resolution = ListProperty([-1, -1]) '''Preferred resolution to use when invoking the camera. If you are using [-1, -1], the resolution will be the default one:: # create a camera object with the best image available cam = Camera() # create a camera object with an image of 320x240 if possible cam = Camera(resolution=(320, 240)) .. warning:: Depending on the implementation, the camera may not respect this property. :attr:`resolution` is a :class:`~kivy.properties.ListProperty` and defaults to [-1, -1]. ''' def __init__(self, **kwargs): self._camera = None super(Camera, self).__init__(**kwargs) if self.index == -1: self.index = 0 on_index = self._on_index fbind = self.fbind fbind('index', on_index) fbind('resolution', on_index) on_index() def on_tex(self, camera): self.texture = texture = camera.texture self.texture_size = list(texture.size) self.canvas.ask_update() def _on_index(self, *largs): self._camera = None if self.index < 0: return if self.resolution[0] < 0 or self.resolution[1] < 0: self._camera = CoreCamera(index=self.index, stopped=True) else: self._camera = CoreCamera(index=self.index, resolution=self.resolution, stopped=True) if self.play: self._camera.start() self._camera.bind(on_texture=self.on_tex) def on_play(self, instance, value): if not self._camera: return if value: self._camera.start() else: self._camera.stop()