Estoy tratando de mostrar imágenes en vivo de mi 1394 de la cámara.
Actualmente mi código es capaz de obtener imágenes en un bucle de la cámara y estaba buscando alguna rápida de la interfaz gráfica de usuario que se actualiza dinámicamente (como un hilo separado). Puedo hacer esto en PyQt tal vez usando QThreads pero, ¿hay alguna recomendación o de la manera más rápida de hacer esto??
Aquí está mi código

#Bucle de captura de fotogramas de la cámara

for frame in range(1,500):

print 'frame:',frame

TIME.sleep(1) #capture frame every second

image_binary    = pycam.cam.RetrieveBuffer()

#convert to PIL Image

pilimg = PIL.Image.frombuffer("L",(cimg.GetCols(),cimg.GetRows()),image_binary,'raw', "RGBA", 0, 1)
    # At this point I want to send my image data to a GUI window and display it

Gracias.

OriginalEl autor blueskin | 2010-08-29

4 Comentarios

  1. 6

    Aquí wxPython código que lo va a hacer…

    import wx
    from PIL import Image
    SIZE = (640, 480)
    def get_image():
    # Put your code here to return a PIL image from the camera.
    return Image.new('L', SIZE)
    def pil_to_wx(image):
    width, height = image.size
    buffer = image.convert('RGB').tostring()
    bitmap = wx.BitmapFromBuffer(width, height, buffer)
    return bitmap
    class Panel(wx.Panel):
    def __init__(self, parent):
    super(Panel, self).__init__(parent, -1)
    self.SetSize(SIZE)
    self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
    self.Bind(wx.EVT_PAINT, self.on_paint)
    self.update()
    def update(self):
    self.Refresh()
    self.Update()
    wx.CallLater(15, self.update)
    def create_bitmap(self):
    image = get_image()
    bitmap = pil_to_wx(image)
    return bitmap
    def on_paint(self, event):
    bitmap = self.create_bitmap()
    dc = wx.AutoBufferedPaintDC(self)
    dc.DrawBitmap(bitmap, 0, 0)
    class Frame(wx.Frame):
    def __init__(self):
    style = wx.DEFAULT_FRAME_STYLE & ~wx.RESIZE_BORDER & ~wx.MAXIMIZE_BOX
    super(Frame, self).__init__(None, -1, 'Camera Viewer', style=style)
    panel = Panel(self)
    self.Fit()
    def main():
    app = wx.PySimpleApp()
    frame = Frame()
    frame.Center()
    frame.Show()
    app.MainLoop()
    if __name__ == '__main__':
    main()
    Hola FogleBird, me sale el siguiente error: AttributeError: ‘módulo’ el objeto no tiene ningún atributo ‘CallLater’. Así que he usado wx.FutureCall, luego me sale el error AttributeError: ‘módulo’ el objeto no tiene ningún atributo ‘BitmapFromBuffer’ Alguna recomendación??
    ¿Qué versión de wxPython estás usando? ¿Qué plataforma?
    Ubuntu 10.04; wxPython 2.8; Python 2.6
    wxPython 2.8.10? O inferior?
    Estoy usando Ubuntu 10.04, Python 2.6 y wx en la versión 2.8.10.1 (gtk2-unicode) y funciona.

    OriginalEl autor FogleBird

  2. 4

    Pensé que me gustaría probar PyQt4 imageviewer.py ejemplo y trabajó para mí.
    Gracias por toda su ayuda chicos.
    Aquí está mi código modificado:

    from PyQt4 import QtCore, QtGui
    class CameraViewer(QtGui.QMainWindow):
    def __init__(self):
    super(CameraViewer, self).__init__()
    self.imageLabel = QtGui.QLabel()
    self.imageLabel.setBackgroundRole(QtGui.QPalette.Base)
    self.imageLabel.setScaledContents(True)
    self.scrollArea = QtGui.QScrollArea()
    self.scrollArea.setWidget(self.imageLabel)
    self.setCentralWidget(self.scrollArea)
    self.setWindowTitle("Image Viewer")
    self.resize(640, 480)
    timer = QtCore.QTimer(self)
    timer.timeout.connect(self.open)
    timer.start(33) #30 Hz
    def open(self):
    #get data and display
    pilimg = getMyPILImageDatFromCamera()
    image = PILQT.ImageQt.ImageQt(pilimg)
    if image.isNull():
    QtGui.QMessageBox.information(self, "Image Viewer","Cannot load %s." % fileName)
    return
    self.imageLabel.setPixmap(QtGui.QPixmap.fromImage(image))
    self.imageLabel.adjustSize()
    if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    CameraViewer = CameraViewer()
    CameraViewer.show()
    sys.exit(app.exec_())

    OriginalEl autor blueskin

  3. 2

    Recomiendo el uso de Tkinter, ya que es ya parte de python. Yo nunca he usado PIL, pero un rápido google muestra es fácil de usar PIL imágenes en los conocimientos tradicionales de los widgets (a través de la pil.ImageTk.Foto imagen() el método).

    Si usted ya tiene un Tkinter conjunto de widget para mostrar imágenes (una Etiqueta widget funciona bien) todo lo que necesita hacer es organizar para que la imagen se actualiza cada segundo o así. Usted puede hacer esto mediante el uso de la after comando de tkinter.

    He aquí un ejemplo; no tengo PIL para que se utiliza una imagen estática, sino que muestra cómo utilizar el bucle de eventos para capturar imágenes cada segundo:

    import Tkinter
    class App(Tkinter.Tk):
    def __init__(self):
    Tkinter.Tk.__init__(self)
    self.label = Tkinter.Label(text="your image here", compound="top")
    self.label.pack(side="top", padx=8, pady=8)
    self.iteration=0
    self.UpdateImage(1000)
    def UpdateImage(self, delay, event=None):
    # this is merely so the display changes even though the image doesn't
    self.iteration += 1
    self.image = self.get_image()
    self.label.configure(image=self.image, text="Iteration %s" % self.iteration)
    # reschedule to run again in 1 second
    self.after(delay, self.UpdateImage, 1000)
    def get_image(self):
    # this is where you get your image and convert it to 
    # a Tk PhotoImage. For demonstration purposes I'll
    # just return a static image
    data = '''
    R0lGODlhIAAgALMAAAAAAAAAgHCAkC6LV76+vvXeswD/ANzc3DLNMubm+v/6zS9PT6Ai8P8A////
    /////yH5BAEAAAkALAAAAAAgACAAAAS00MlJq7046803AF3ofAYYfh8GIEvpoUZcmtOKAO5rLMva
    0rYVKqX5IEq3XDAZo1GGiOhw5rtJc09cVGo7orYwYtYo3d4+DBxJWuSCAQ30+vNTGcxnOIARj3eT
    YhJDQ3woDGl7foNiKBV7aYeEkHEignKFkk4ciYaImJqbkZ+PjZUjaJOElKanqJyRrJyZgSKkokOs
    NYa2q7mcirC5I5FofsK6hcHHgsSgx4a9yzXK0rrV19gRADs=
    '''
    image = Tkinter.PhotoImage(data=data)
    return image
    if __name__ == "__main__":
    app=App()
    app.mainloop()
    He intentado utilizar Tkinter, pero cuando finde para mostrar la ventana de la GUI que tuve que llamar a mainloop (), que deja todo en ese punto, es decir, una función de bloqueo. Quiero obtener imágenes y actualización de la Tkinter ventana de la GUI. Es allí una manera de hacer eso?
    vas a tener este problema, no importa qué conjunto de herramientas que utiliza. Todas las herramientas gráficas (GUI) necesidad de un bucle de eventos. Todos ellos tienen también una manera para introducir eventos (por falta de una mejor descripción). En el caso de Tkinter, usted puede llamar a after a tener algo que se llama por el bucle de eventos en algún momento en el futuro. He editado mi respuesta para darte un ejemplo de trabajo.
    Gracias Bryan. Me sale el siguiente error, alguna idea de lo que está causando esto?? Archivo «LiveCam.py», línea 28, en la init auto.UpdateImage(1000) Archivo «LiveCam.py», línea 36, en UpdateImage auto.de la etiqueta.configurar(imagen=auto.image) Archivo «/usr/lib/python2.6/lib-tk/Tkinter.py», la línea de 1205, en configurar devolver el auto._configure(‘configurar’, cnf, kw) File «/usr/lib/python2.6/lib-tk/Tkinter.py», la línea de 1196, en _configure auto.los conocimientos tradicionales.llame al(_flatten((self._w, cmd)) + auto._options(cnf)) TypeError: str devuelve no-cadena (tipo de instancia)
    No sé. Mi conjetura es su Get_image método no devuelve un apropiado de los conocimientos tradicionales de la imagen.
    ya, me adivinó el mismo. De todos modos, he intentado PyQt4 y funcionó, he publicado mi solución a continuación. De hecho, estoy un poco sesgado hacia el Qt desde que he estado usando durante mucho tiempo :D. voy a tratar de arreglar mi tk código u n mantener actualizado. Gracias por la ayuda Bryan

    OriginalEl autor Bryan Oakley

  4. 0

    Tratar de echar un vistazo a gstreamer. Este es el primer resultado de google me dio la búsqueda para «gstreamer 1394» y este es la primera para «gstreamer pyqt».

    Hola mg, gstreamer se ve como un paquete completo que hace de todo. Bueno, yo buena biblioteca que me pone imágenes personalizadas de mi 1394 de la cámara, así que no quiero utilizar cualquier lib para que. Y yo estaba buscando algo pequeño. He editado mi post y código añadido. Déjeme saber si usted tiene alguna sugerencia. Mejor,
    El segundo resultado por google. Para la interfaz de usuario integración, mira las otras respuestas o mirar el [secuencia de comandos de prueba ](rzuser.uni-heidelberg.de/~ge6/Programación/download/…) en la dc1394 página de inicio.

    OriginalEl autor mg.

Dejar respuesta

Please enter your comment!
Please enter your name here