119 lines
3.4 KiB
Python
119 lines
3.4 KiB
Python
'''
|
|
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()
|