Displaying webcam video on Raspberry Pi using pygame
Another small exploratory project related to my undergraduate Major Project had me trying to stream video onto a small 3.5″ TFT LCD display using a webcam connected to a Raspberry Pi mini computer.
Firstly, not all USB webcams work with the Raspberry Pi, so after trying randomly to find a working webcam I discovered this list of Raspberry Pi verified peripherals and bought myself a Logitech C100 for $20 on ebay.
Secondly, USB webcams seem to be horribly slow on the Raspberry Pi, pulling dodgy framerates at what might be <10fps at their full resolution (in my case 640×480 pixels). Originally, I was using the custom imgproc library (available here) but found that there was either a lack of simple documentation for extended functionality like scaling and so on, or that the library wasn’t built to perform those sorts of tasks. Eventually I settled upon using the pygame library (which you can get here). The documentation for pygame is thorough and easy to navigate, making troubleshooting and extension or exploration of the library very easy to do.
In order to combat the low framerate and because resolution is not a priority (for the purposes of the concept I will be testing) I decided to pull the webcam feed in at a much lower resolution (32×24 pixels) and then scale it up to full screen (640×480 pixels). I’m unsure if the webcam can actually pull the feed in at 32×24 pixels, I have to look into that – and perhaps some pixel dropping techniques.
I wrote the code, copied it over, connected the webcam to the Raspberry Pi and ran the following python script:
import sys import pygame import pygame.camera pygame.init() pygame.camera.init() #create fullscreen display 640x480 screen = pygame.display.set_mode((640,480),0) #find, open and start low-res camera cam_list = pygame.camera.list_cameras() webcam = pygame.camera.Camera(cam_list,(32,24)) webcam.start() while True: #grab image, scale and blit to screen imagen = webcam.get_image() imagen = pygame.transform.scale(imagen,(640,480)) screen.blit(imagen,(0,0)) #draw all updates to display pygame.display.update() # check for quit events for event in pygame.event.get(): if event.type == pygame.QUIT: webcam.stop() pygame.quit() sys.exit()
After a brief pause a pygame window pops up and the webcam feed is shown on the screen, scaled to fullscreen. The framerate is better than the full resolution webcam feed, but is still very slow by modern standards.