• Son Luu

    Instant Photo Booth with Raspberry Pi

    Updated: Sep 22, 2019


    Class: Making Media Making Devices

    Instructor: Matt Richardson



    A very useful media making application with Raspberry Pi is creating photo taking application.

    After we learned how to create user interface (GUI) with Raspberry Pi, we wanted to create an interface that contains a button to take picture, and then posting the photo onto the computer screen.


    For this project, we used a Raspberry Pi 3 B+ and a Raspberry Pi mini camera that is connected to it.


    As part of the ideation process, we outlined the basic steps to execute this as follows:


    1. Create a GUI that contains a button

    2. Create a function that takes photo

    3. Attach the photo taking function to the button via a button pushing action

    4. Create a function that would save the photo after taking it

    5. Create a function that displays the photo on screen



    After trying to create 3 or 4 different functions to execute steps 2, 4, and 5, we were not successful with the libraries used including: guizero, and picamera,


    The final Python code is documented below?



    Step 1: Create function to take photo, create a button


    from guizero import App, Text, PushButton # import Raspberry Pi GUI library

    from picamera import Picamera # import library to initiate photo taking function

    from time import sleep # import library to keep track of time


    myCamera = PiCamera()

    app = App(title="Photo Booth with Raspberry Pi") # name of the app


    welcome_message = Text(app, text="Press button to take photo", size = 20)


    def takePhoto():

    myCamera.start_preview(alpha=50) # showing preview screen

    sleep(2) # waiting for 2 seconds before taking the photo

    myCamera.capture("GUIphoto.jpg") # taking the photo and saving it as GUIphoto.jpg

    myCamera.stop_preview() # stopping preview screen

    # in the above function, all actions are included to be executed all at once when function is called.


    myScreenButton = pushButton(app, command=takePhoto, text="Press to take photo")

    # this is the action to call changeText() function by pushing the button on screen.



    Step 2: Adding displaying photo function


    from guizero import App, Text, PushButton, Picture # import Raspberry Pi GUI library

    from picamera import Picamera # import library to initiate photo taking function

    from time import sleep # import library to keep track of time


    myCamera = PiCamera()

    app = App(title="Photo Booth with Raspberry Pi") # name of the app


    welcome_message = Text(app, text="Press button to take photo", size = 20)


    def takePhoto():

    myCamera.start_preview(alpha=50) # showing preview screen

    sleep(2) # waiting for 2 seconds before taking the photo

    myCamera.capture("GUIphoto.jpg") # taking the photo and saving it as GUIphoto.jpg

    myCamera.stop_preview() # stopping preview screen

    welcome_message.value = "Done" # displaying text "Done" to indicate picture was taken

    picture = Picture(app, image="GUIphoto.jpg") # to display the saved photo with specific name

    # in the above function, all actions are included to be executed all at once when function is called.



    myScreenButton = pushButton(app, command=takePhoto, text="Press to take photo")

    # this is the action to call changeText() function by pushing the button on screen.







    Outstanding Problem:


    The problem remained is that once the photo is taken and shown on screen, if the button is pressed again, a new photo is taken but the initial photo is still shown. Basically, the new image is not being updated when displayed.


    Below, we tried using a different approach - using a counter to ensure it is a new picture taken every time and see if it would refresh for the display function. The result was: the camera still takes a new photo every time and saved into the computer folder, but the display function still didn't refresh to display the new photo.


    Here is the code we tried.


    Meanwhile, we continue to try and look up documentation in GUIZERO library, and other potential library options and see if we can find a solution.