pilas.video.video

Package pilas :: Package video :: Module video |
[hide private]
[frames] | no frames]

# Source Code for Module pilas.video.video

     1  # -*- encoding: utf-8 -*-
     2  '''
     3
     4  import pilas
     5  try:
     6      import opencv
     7      from opencv import highgui
     8  except ImportError:
     9      opencv = None
    10
    11  import os
    12
    13  try:
    14      from PySFML import sf
    15  except ImportError:
    16      pass
    17
    18  class MissingOpencv(Exception):
    19      def __init__(self):
    20          self.value = "Open CV no esta instalado, obtengalo en http://opencv.willowgarage.com"
    21
    22      def __str__(self):
    23          return repr(self.value)
    24
    25  def error(biblioteca, web):
    26      print "Error, no ecuentra la biblioteca '%s' (de %s)" %(biblioteca, web)
    27
    28  def no_opencv():
    29      from pilas.utils import esta_en_sesion_interactiva
    30      if esta_en_sesion_interactiva():
    31          error('opencv', 'http://opencv.willowgarage.com')
    32      else:
    33          raise MissingOpencv()
    34
    35  class DeCamara(pilas.actores.Actor):
    36      """
    37      Nos permite poner en pantalla el video proveniente de la camara web.
    38
    39      """
    40      def __init__(self, ancho=640, alto=480):
    41          if opencv is None:
    42              no_opencv()
    43              return
    44          import webcam
    45          self.camara = webcam.CamaraWeb
    46          self.ultimo_numero_de_cuadro = 0
    47          pilas.actores.Actor.__init__(self, 'fondos/pasto.png')
    48          pilas.mundo.agregar_tarea_siempre(0.15,self.actualizar_video)
    49
    50      def actualizar_video(self):
    51          cuadro, numero_de_cuadro = self.camara.obtener_imagen(self.ultimo_numero_de_cuadro)
    52          self.ultimo_numero_de_cuadro = numero_de_cuadro
    53          self.imagen.LoadFromPixels(640, 480, cuadro)
    54          return True
    55
    56  class VideoDeArchivo(object):
    57      def __init__(self, ruta):
    58          if opencv is None:
    59              no_opencv()
    60              return
    61          if not os.path.isfile(ruta):
    62              raise IOError('El archiyo no existe')
    63          self._camara = highgui.cvCreateFileCapture(ruta)
    64          self.fps = highgui.cvGetCaptureProperty(self._camara, highgui.CV_CAP_PROP_FPS)
    65          self.altura = highgui.cvGetCaptureProperty(self._camara, highgui.CV_CAP_PROP_FRAME_HEIGHT)
    66          self.ancho =highgui.cvGetCaptureProperty(self._camara, highgui.CV_CAP_PROP_FRAME_WIDTH)
    67          super(VideoDeArchivo, self).__init__()
    68
    69      def obtener_imagen(self):
    70          imagen_ipl = highgui.cvQueryFrame(self._camara)
    71          imagen_ipl = opencv.cvGetMat(imagen_ipl)
    72          return opencv.adaptors.Ipl2PIL(imagen_ipl).convert('RGBA').tostring()
    73
    74
    75  class DePelicula(pilas.actores.Actor):
    76      """
    77      Nos permite poner en pantalla un video desde un archivo.
    78      Toma como parametro la ruta del video.
    79      """
    80      def __init__(self, path, ancho=640, alto=480):
    81          self._camara = VideoDeArchivo(path)
    82          pilas.actores.Actor.__init__(self)
    83          self._altura_cuadro = self._camara.altura
    84          self._ancho_cuadro = self._camara.ancho
    85          subrect = self._actor.GetSubRect()
    86          subrect.Right = self._ancho_cuadro
    87          subrect.Bottom = self._altura_cuadro
    88          self._actor.SetSubRect(subrect)
    89          self.centro = ('centro', 'centro')
    90          pilas.mundo.agregar_tarea_siempre(1/self._camara.fps,self.actualizar_video)
    91
    92      def actualizar_video(self):
    93          self.imagen.LoadFromPixels(self._ancho_cuadro, self._altura_cuadro, self._camara.obtener_imagen())
    94          return True
    95  '''
    96