Search code examples
pythonimageuser-interfacecameralive

Any quick Python GUI to display live images from Camera


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.


Solution

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