Any quick Python GUI to display live images from Camera

16,417

Solution 1

Here's wxPython code that will do it...

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()

Solution 2

I thought I'd try PyQt4 imageviewer.py example and it worked for me. Thanks for all your help guys. Here's my modified code:

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_())

Solution 3

I recommend using Tkinter since it's already part of python. I've never used PIL but a quick google shows it's easy to use PIL images in Tk widgets (via the pil.ImageTk.PhotoImage() method).

If you already have a Tkinter widget set up to display images (a Label widget works fine) all you need to do is arrange for the image to be updated every second or so. You can do this by using the after command of tkinter.

Here's an example; I don't have PIL so it uses a static image but it illustrates how to use the event loop to fetch images every second:

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()
Share:
16,417
Chenna V
Author by

Chenna V

Updated on June 04, 2022

Comments

  • Chenna V
    Chenna V almost 2 years

    I am trying to display live images from my 1394 camera. Currently my code is able to obtain images in a loop from the camera and I was looking for any quick GUI that will update dynamically (as a separate thread). I can do this in PyQt maybe using QThreads but is there any recommendation or faster way of doing this?? Here's my code

    #Loop capturing frames from camera

    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
    

    Thank you.